service和activity之间通讯

         service和activity通讯一般可以通过绑定service获取service的引用调用service的方法。如果service要访问activity可以通过单利模式,最好是使用广播接受者实现通讯最优方案。


下面介绍通过广播接受者实现activity和service通讯。

XML代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.servicedemo2.MainActivity">

    <Button
        android:onClick="send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="activity发消息" />
</RelativeLayout>

activity代码;

/*使用广播实现service和activity通讯*/
public class MainActivity extends AppCompatActivity {

    LocalBroadcastManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取局部广播管理员
        manager = LocalBroadcastManager.getInstance(this);
        //注册局部广播
        IntentFilter filter = new IntentFilter("activity");
        manager.registerReceiver(receiver, filter);

        //注意一定要启动服务
        Intent service = new Intent(this, MyService.class);
        startService(service);

    }


    //发消息
    public void send(View view) {
        Intent intent = new Intent("service");
        intent.putExtra("activitySend", "activity发的消息");
        manager.sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        manager.unregisterReceiver(receiver);

    }


    //广播接受者
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            //获取广播消息
            String serviceSend = intent.getStringExtra("serviceSend");
            if (!TextUtils.isEmpty(serviceSend)) {
                Toast.makeText(context, serviceSend, Toast.LENGTH_SHORT).show();
            }
            
            
        }
    };

}

//service代码:

public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    LocalBroadcastManager manager;

    @Override
    public void onCreate() {
        super.onCreate();
        //获取局部广播管理员
        manager = LocalBroadcastManager.getInstance(this);
        //注册局部广播
        IntentFilter filter = new IntentFilter("service");
        manager.registerReceiver(receiver, filter);
       
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        manager.unregisterReceiver(receiver);

    }


    //动态 创建广播接受者
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //接受广播消息
            String activitySend = intent.getStringExtra("activitySend");
            if (!TextUtils.isEmpty(activitySend)) {
                Toast.makeText(context, activitySend, Toast.LENGTH_SHORT).show();
            }


            //延迟发个消息给activity
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    try {
                        Thread.sleep(3000);

                        //发消息给activity
                        Intent send = new Intent("activity");
                        send.putExtra("serviceSend", "service发的消息");
                        manager.sendBroadcast(send);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }.start();

        }
    };


}

//注意这里我是发局部广播(localbroadcastmanage)你也可以发送个全局广播。


猜你喜欢

转载自blog.csdn.net/qq_36237165/article/details/69451221