美文网首页
Android笔记——Service的使用与生命周期

Android笔记——Service的使用与生命周期

作者: 麦香菌 | 来源:发表于2019-03-02 19:12 被阅读0次

    Service的使用

    Service:

    当service未被启动过的情况下被启动时,会执行onCreate和onStartCommand,若已被启动过,则每次启动只执行onStartCommand。
    Service的绑定通过在其内部创建一个MyBinder继承Binder,并通过onBind返回实例,这样绑定的活动就能执行MyBinder内部的方法。
    而在MyBinder内部写一个获取MyService实例的getService方法,绑定的活动通过该方法获取MyService实例就能调用MyService的公共类。

    public class MyService extends Service {
    
        private String TAG = "ServiceLife_service";
    
        private MyBinder myBinder = new MyBinder();
    
        class MyBinder extends Binder{
    
            public void doBinder(){
                Log.d(TAG,"doBinder");
            }
    
            public MyService getService(){
                return MyService.this;
            }
    
        }
    
        public MyService() {
        }
    
        public void doService(){
            Log.d(TAG,"doService");
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.d(TAG,"onBind");
            // TODO: Return the communication channel to the service.
            return myBinder;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG,"onCreate");
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d(TAG,"onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            Log.d(TAG,"onUnbind");
            return super.onUnbind(intent);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d(TAG,"onDestroy");
        }
    }
    

    Activity:

    首先创建ServiceConnection的匿名类,重写onSericeConnected()和onServiceDisconnected()方法。在onSericeConnected()内向下转型得到MyBinder,在通过MyBinder的getService方法获取Service实例,接下来就能调用Service里的公共方法了。而onServiceDisconnected()则是在断开绑定时将获得的Service实例置空

    private ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d(TAG,"onServiceConnected");
                myBinder = (MyService.MyBinder) service;
                myBinder.doBinder();
                myService = myBinder.getService();
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                myService = null;
            }
        };
    

    绑定并执行Service的公共方法:

    case R.id.btn_bindService:
                    //绑定Service
                    Intent bindIntent = new Intent(this, MyService.class);
                    bindService(bindIntent, connection, BIND_AUTO_CREATE);
                    break;
    case R.id.btn_doService:
                    //执行Service里的公共方法
                    if (null != myService) {
                        myService.doService();
                    }
                    break;
    

    结果:


    Service的生命周期

    五个Button分别执行startService,stopService,bindService,unBindService和doService(执行Service的公共方法)。


    1.startService→stopService

    多次启动Service,onCreate只会执行一次,onStartCommand会多次执行。若在未绑定的情况下解绑Service程序会崩溃,而在未启动的情况下stopService则没关系。
    [图片上传中...(image.png-1759dd-1551576698431-0)]

    2.bindService→unBindService

    解绑后ServiceConnection的onServiceDisconnected并未执行,是因为只有在Service 被破坏了或者被杀死的时候调用,连接正常情况下不会执行。


    3.startService→bindService→stopService→unBindService

    被启动并绑定的Service只有在被stopService和unbindService的情况下才会被销毁(onDestroy)。只执行unbindService只会解绑(onUnbind),而只执行stopService则没有任何效果。


    4.总结

    startService


    bindService


    image.png

    stopService



    unbindService


    其他

    当Activity被销毁时

    https://blog.csdn.net/weixin_40876113/article/details/83750212

    BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY

    https://blog.csdn.net/pan11115111/article/details/70236354
    在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
    在4.0及以上就完全变了,Service的优先级默认等同于宿主进程,只有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待,WAIVE就是放弃的意思嘛。
    优先级:https://blog.csdn.net/qpc908694753/article/details/71244334

    相关文章

      网友评论

          本文标题:Android笔记——Service的使用与生命周期

          本文链接:https://www.haomeiwen.com/subject/qobeuqtx.html