之前碰到一个需求:
1、打开程序启动一个service,service不停的监听后台的某个数据并向外传递。
2、有多个activity,每个activity都能够通过service向后台发送数据
与后台的交互不说,主要是实现一个service与多个activity的交互。
设计上:
Service向外传递数据使用Broadcast;
Service接受来自Activity的数据使用Intent。
代码实现:
service端,主要实现两个方法。在onCreate里面不停的发送一个自增的值,在onStartCommand里面接受来自Activity的数据,做相关的处理。
@Override
public void onCreate() {
super.onCreate();
new Thread(){
@Override
public void run() {
while(autoFlag) {
try {
/**
* 通过广播发送自动增加的num
*/
intentAuto.putExtra("auto", "" + num);
sendBroadcast(intentAuto);
num++;
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String temp = intent.getStringExtra("send");
if(temp!=null && !temp.equals("")){
/**
* 将接受到的值加上“Service:“的样式通过广播发送出去
*/
intentEdit.putExtra("edit","Service:"+temp);
sendBroadcast(intentEdit);
}
return super.onStartCommand(intent, flags, startId);
}
Broadcast端,接受Service传递过来的数据,设置好接口便于Activity调用进行相关的UI更新。
public class MyAutoBroadCastReceiver extends BroadcastReceiver {
OnAutoReceiveLinstener onAutoReceiveLinstener;
@Override
public void onReceive(Context context, Intent intent) {
String temp = intent.getStringExtra("auto");
onAutoReceiveLinstener.onReceive(temp);
}
public interface OnAutoReceiveLinstener{
public void onReceive(String editText);
}
public void setOnAutoReceiveLinstener(OnAutoReceiveLinstener onAutoReceiveLinstener){
this.onAutoReceiveLinstener = onAutoReceiveLinstener;
}
}
Activity端,调用Broadcast的接口,获得Service端传递过来的数据,进行相应的UI更新,通过startService方法,向Service传递数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
serviceIntent = new Intent(MainActivity.this,MyService.class);
startService(serviceIntent);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String temp = edit.getText().toString();
serviceIntent.putExtra("send", temp);
startService(serviceIntent);
}
});
findViewById(R.id.change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Activity1.class);
startActivity(i);
}
});
autoBroadCastReceiver = new MyAutoBroadCastReceiver();
IntentFilter autoBroadFilter = new IntentFilter();
autoBroadFilter.addAction("auto");
registerReceiver(autoBroadCastReceiver, autoBroadFilter);
autoBroadCastReceiver.setOnAutoReceiveLinstener(new MyAutoBroadCastReceiver.OnAutoReceiveLinstener() {
@Override
public void onReceive(String editText) {
tvAuto.setText(editText);
}
});
editBroadCastReceiver = new MyEditBroadCastReceiver();
IntentFilter editBroadFilter = new IntentFilter();
editBroadFilter.addAction("edit");
registerReceiver(editBroadCastReceiver, editBroadFilter);
editBroadCastReceiver.setOnEditReceiveLinstener(new MyEditBroadCastReceiver.OnEditReceiveLinstener() {
@Override
public void onReceive(String editText) {
tvEdit.append(editText+"\n");
}
});
}
在每个Activity中要记得在销毁的时候释放注册的广播。
在程序结束的时候记得关闭Service。
反思及总结:
在Service的生命周期中只能进行一次绑定,如果每个Activity都需要绑定的话只能在每次Activity销毁时关闭Service(onRebind不是很了解)。而在Service的一次生命周期中,onStartCommand是可以多次被调用的。
具体的demo下载:
http://download.youkuaiyun.com/detail/zhufeng1222/9057513