回家

Service(二) - Service与Activity通信

2019-01-27  本文已影响0人  世道无情

1. Service与Activity通信


上篇文章记录了 Service应用场景startService开启服务、stopService停止服务,在开启服务之后就可以在 onCreate()、onStartCommand()方法中执行一些逻辑;

MyService中的 onBind()方法,作用就是Activity与Service关联


图片.png

2. 代码如下


1>:MyService代码如下:
/**
 * ================================================
 * Email: 2185134304@qq.com
 * Created by Novate 2018/12/18 15:09
 * Version 1.0
 * Params:
 * Description:
 * 备注:任何一个 Service在整个应用程序范围内都是通用的,也就是说 MyService 不仅可以和ServiceActivity关联,
 *       还可以和任何一个Activity关联,而且在关联时都可以获取到相同的 MyBinder实例
 * ================================================
*/

public class MyService extends Service {

    // 自己自定义MyBinder继承Binder
    private MyBinder mBinder = new MyBinder() ;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("TAG" , "onCreate__executed") ;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("TAG" , "onStartCommand__executed") ;
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("TAG" , "onDestroy__executed") ;
    }


    /**
     * Activity 与 Service关联,返回 MyBinder实例对象:
     *      用于在 Activity中,通过onServiceConnected方法,指定 Service执行相关任务
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }


    class MyBinder extends Binder{

        /**
         * 自己自定义MyBinder继承Binder,然后随便定义一个方法,
         * 用于在后台执行下载任务,这里只是做一个测试
         */
        public void startDownload(){
            // 模拟在后台下载任务
            Log.e("TAG" , "startDownload__模拟在后台下载任务") ;
        }
    }
}
2>:ServiceActivity代码如下:
/**
 * ================================================
 * Email: 2185134304@qq.com
 * Created by Novate 2018/12/18 15:37
 * Version 1.0
 * Params:
 * Description:    在Activity中演示:启动服务StartService 与 StopService停止服务
 * ================================================
*/

public class ServiceActivity extends AppCompatActivity implements View.OnClickListener {

    private Button startService;
    private Button stopService;
    private Intent intent;

    private Button bindService;
    private Button unbindService;


    private MyService.MyBinder myBinder ;


    /**
     * 创建匿名内部类,重写 onServiceConnected 和 onServiceDisconnected方法
     */
    private ServiceConnection connection = new ServiceConnection() {

        /**
         * Activity 与 Service 建立关联调用
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 二者建立关联后,通过向下转型获取 MyBinder实例,有了这个实例,可以在Activity中根据具体场景,
            // 调用 MyBinder 中任何 public 方法,实现了 Activity指挥Service干什么,Service就去干什么
            myBinder = (MyService.MyBinder) service;
            myBinder.startDownload();
        }

        /**
         * Activity 与 Service 解除关联调用
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    } ;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service);

        startService = (Button) findViewById(R.id.start_service);
        stopService = (Button) findViewById(R.id.stop_service);
        startService.setOnClickListener(this);
        stopService.setOnClickListener(this);


        bindService = (Button) findViewById(R.id.bind_service);
        unbindService = (Button) findViewById(R.id.unbind_service);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            // 启动服务
            case R.id.start_service:
                 intent = new Intent(ServiceActivity.this , MyService.class);
                 startService(intent) ;
                 break;

            // 停止服务
            case R.id.stop_service:
                 Log.e("TAG" , "stopService__") ;
                 intent = new Intent(ServiceActivity.this , MyService.class);
                 stopService(intent) ;
                 break;

            // 绑定服务:将 Activity与Service绑定,接收3个参数:
            // param_1: intent对象
            // param_2: 上边的 ServiceConnection实例对象
            // param_3: 一个标志位,BIND_AUTO_CREATE表示Activity与Service建立关联后,自动创建Service
            // 然后MyService中的 onCreate方法执行,但是 onStartCommand不会执行
            case R.id.bind_service:
                 Intent intent = new Intent(ServiceActivity.this , MyService.class) ;
                 bindService(intent , connection , BIND_AUTO_CREATE) ;
                 break;

            // 解绑服务:解除 Activity与Service的关联
            case R.id.unbind_service:
                Log.e("TAG" , "unBindService__") ;
                 unbindService(connection);
                 break;
        }
    }
}

点击 bindService:此时就可以绑定Activity与Service了;
点击 unBindService:此时就可以解除绑定了

3. 如何销毁Service


单独点击 startService 启动服务 和 stopService 停止服务:

onCreate__executed
onStartCommand__executed

onDestroy__executed

单独点击 bindService 绑定服务 和 unBindService 解绑服务:

onCreate__executed
onStartCommand__executed

onDestroy__executed

先点击 startService ,然后点击 bindService,然后点击 stopService和 unbindService停止服务和解绑服务:
如果先点击startService,然后点击 bindService,此时不管是点击 stopService还是 unbindService,服务都不会被销毁,要把两个都点击一下,Service才会被销毁;
给bindService 和 unbindService 添加两个日志,log如下:

onCreate__executed
onStartCommand__executed

startDownload__模拟在后台下载任务

stopService__

unBindService__
onDestroy__executed

4. 注意事项


1>:任何一个Service在整个项目中都是通用的,也就是说 MyService不仅可以和 MainActivity绑定,可以和任何一个Activity绑定,而且绑定后获取的都是相同的 MyBinder对象;
2>:在 MyService中的 onDestroy方法中清理不再使用的资源,防止 Service销毁后还有一些不再使用的 资源占用着内存;

上一篇下一篇

猜你喜欢

热点阅读