您的位置:首页 > 其它

Activity 与 Service 的通信

2016-01-06 14:54 387 查看
#1 Activity 通过Intent传递数据给Service

一、 Activity启动Service
Intent intent = new Intent(mContext,MyService.class);
Bundle bundle = new Bundle();
bundle.putString("zhangsan", "18");
intent.putExtras(bundle);
mContext.startService(intent);

二、Service通过onStartCommand()中的intent获取数据
Bundle bundle = intent.getExtras();
String value = bundle.getString("zhangsan");

#2 Binder利用bindService实现Service传递数据给Activity

一、定义被绑定的Service
public class BinderService extends Service{

public static final int PROGRESS_MAX = 100;
private ProgressListerner mListerner;

@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}

public void setProgressListener(ProgressListerner listerner){
mListerner = listerner;
}
public void startDownLoad(){
new Thread(new Runnable() {

@Override
public void run() {
int mProgress = 0;
while (mProgress < PROGRESS_MAX) {
mProgress += 5;
if(mListerner != null){
mListerner.onProgress(mProgress);
}
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}

public class MyBinder extends Binder{

public BinderService getService(){
return BinderService.this;
}
}

public interface ProgressListerner{
public void onProgress(int progress);
}
}
二、定义获取Service中数据的Activity并绑定Service
public class BinderTransferActivity extends Activity{

private Context mContext;
private TextView tv;
private ProgressBar progressBar;
private BinderService mService;
private ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((MyBinder) service).getService();
mService.setProgressListener(new ProgressListerner() {

@Override
public void onProgress(int progress) {
progressBar.setProgress(progress);
}
});
}

@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}

};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_bindertransfer);
bindService(new Intent(mContext,BinderService.class), connection, Context.BIND_AUTO_CREATE);

tv = (TextView) findViewById(R.id.tv);
tv.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
mService.startDownLoad();

}
});
progressBar = (ProgressBar) findViewById(R.id.progress);
}

@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}

三、Activity的xml:
public class BinderTransferActivity extends Activity{

private Context mContext;
private TextView tv;
private ProgressBar progressBar;
private BinderService mService;
private ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((MyBinder) service).getService();
mService.setProgressListener(new ProgressListerner() {

@Override
public void onProgress(int progress) {
progressBar.setProgress(progress);
}
});
}

@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}

};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_bindertransfer);
bindService(new Intent(mContext,BinderService.class), connection, Context.BIND_AUTO_CREATE);

tv = (TextView) findViewById(R.id.tv);
tv.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
mService.startDownLoad();

}
});
progressBar = (ProgressBar) findViewById(R.id.progress);
}

@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}

四、 AndroidMainifest.xml中注册

<application>

...
<activity android:name=".BinderTransferActivity" />
<service android:name=".BinderService" />
</application>

#3 Activity的成员Broadcast实现Service传递数据给Activity
一、 定义Activity和其成员广播接受者,静态注册;
public class MainActivity extends Activity implements OnClickListener {

private TextView tv;
private Context mContext;
private MyReceiver mMyReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_main);

mMyReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.bpj.service_activity.MainActivity.MyReceiver");
registerReceiver(mMyReceiver, filter);
tv = (TextView) findViewById(R.id.tv1);
tv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv://broadcast
mContext.startService(new Intent("com.bpj.service_activity.MainActivity.Service"));
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
stopService(new Intent(mContext,BroadCastTransferService.class));
unregisterReceiver(mMyReceiver);
}

public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String value = intent.getStringExtra("key");
tv4.setText(value);
}

}

二、定义Service
public class BroadCastTransferService extends Service{

private Timer mTimer;
private String mValue ="BroadcastRecevicerValue";
private int count = 0;
private Intent mIntent = new Intent("com.bpj.service_activity.MainActivity.MyReceiver");

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(mTimer ==null){
mTimer = new Timer();
}
mTimer.schedule(new TimerTask() {

@Override
public void run() {
count += 2;
mIntent.putExtra("key", mValue+count);
sendBroadcast(mIntent);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1000, 3000);

return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
super.onDestroy();
if(mTimer !=null){
mTimer.cancel();
}
}

}

三、注册BroadCastTransferService并定义intentfilter
<application>
...
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".BroadCastTransferService" >
<intent-filter>
<action android:name="com.bpj.service_activity.MainActivity.Service" />
</intent-filter>
</service>
</application>

项目Demo可以到我个人的资源页进行下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: