Service与多个Activity交互

来源:互联网 发布:软件开发教程视频 编辑:程序博客网 时间:2024/05/29 10:56

之前碰到一个需求:
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.csdn.net/detail/zhufeng1222/9057513

0 0