Service与多个Activity交互

本文详细介绍了如何设计并实现一个多Activity与Service之间的交互,包括Service如何向外传递数据使用Broadcast,以及Service如何接受来自Activity的数据使用Intent。通过具体代码实现,展示了Service的生命周期和活动之间的数据流转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前碰到一个需求:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值