• android-service生命周期的实践结果


    startService的生命周期实践:

    public class MyService extends Service {
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("msg","onCreate");
        }
    
    
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("msg","onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
    
        @Override
        public void onDestroy() {
            Log.i("msg","onDestroy");
            super.onDestroy();
        }
    }

    现在有两个activity,MainActivity、UselessActivity,MainActivity有个按钮启动UselessActivity,UselessActivity启动MyServier

    1.MainActivity启动UselessActivity后,UselessActivity启动MyService,StartService(Intent)。

    Log.i=msg: onCreate  msg: onStartCommand

    ①如果UselessActivity中不调用stopService(Intent):

     按返回到MainActivity,并不会打出Log.i=msg: onDestroy.  ★服务不会随着启动它的Activity一起销毁。★

     再按返回退出程序,再打开程序,启动service,打出Log.i=onStartCommand.而没有打出msg: onCreate,说明service还在  ★服务不会随着启动它的程序退出被销毁。★

     再按返回退出程序,并在手机的程序列表里把程序给删除掉,再打开程序,启动service,打出Log.i=onStartCommand.而没有打出msg: onCreate,说明service还在 ★服务不会因为启动它的程序被销毁而销毁。★

    ②如果在UselessActivity中的onDestroy调用stopService(Intent):

     UselessActivity:

        @Override
        protected void onDestroy() {
            super.onDestroy();
            stopService(intent);
        }
    

      

     按返回到MainActivity,打出Log.i=msg: onDestroy.   ★需要调用stopService(Intent),service才会被销毁。★

     -----------------------------------------------------------完美分割线----------------------------------------------------------------------------

    bindService的生命周期实践:

    public class MyService extends Service {
    
        MyBinder myBinder;
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            if(myBinder == null){
                myBinder = new MyBinder();
            }
            Log.i("msg","onBind");
            return myBinder;
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            Log.i("msg","onUnBind");
            return super.onUnbind(intent);
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("msg","onCreate");
        }
        
        public class MyBinder extends Binder{
            public MyService getService(){
                return MyService.this;
            }
        }
    
        @Override
        public void onDestroy() {
            Log.i("msg","onDestroy");
            super.onDestroy();
        }
    }

    MainActivity启动UselessActivity后,UselessActivity启动MyService,bindService(Intent)。

    Log.i=msg: onCreate  msg: onBind

    ①如果UselessActivity中不调用unbindService(conn):

      按返回到MainActivity,会报ServiceConnectionLeaked的错误,同时会Log打出msg: onUnBind msg: onDestroy ★要求当绑定服务的活动退出时要调用解除绑定方法,如果没有调用,则程序自动调用★

    总结:startService新建的服务,存在于后台,不依赖启动它的Activity,销毁Activity,服务依然存在

       bindService新建的服务,存在于后台,与启动它的Activity有交互关系,需要“同生同死”,销毁Activity,要求开发者自动unbindService,否则报异常警告,但不崩溃,同时程序自己调类似unbindService的方法,销毁服务。

    适用情况:startService新建的服务,适合后台下载等耗时但与Activity没有交互或几乎没有交互。

         bindService新建的服务,适合进行耗时操作,同时结果需要返回给Activity,Activity也有对服务进行控制的需要的操作,比如音乐播放器

    PS:  ★如果同时startService、bindService 那个要销毁这个服务(onDestroy)的话,需要调用unbindService和stopService才可以,先后顺序不计。★

        ★可以多个Activity绑定同一个服务类,只算一个服务,每一个Activity退出时都需要unbindService。★

  • 相关阅读:
    Linux多进程(二)进程通信方式一 管道
    ubuntu系统下opencv的编译安装
    13.Mybatis之动态sql查询(面试)
    微软宣布 Windows 11 开始大范围推送
    CMake的使用
    2022-07-26
    【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
    【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 6
    力扣刷题-二叉树-完全二叉树的节点个数
    详解OpenCV的窗口滑动条创建控制函数createTrackbar()
  • 原文地址:https://blog.csdn.net/eeeeety6208/article/details/126435551