• 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。★

  • 相关阅读:
    JSON.stringify()的深入学习和理解
    小文件写入性能 5 倍于 S3FS,JuiceFS 加速生信研究
    ▲ Android 签到打卡效果
    前端面试宝典总结1-HTML
    459. 重复的子字符串
    用低代码平台开发应用
    Logback 配置文件这样优化,TPS提高 10 倍
    java毕业生设计在线教育平台计算机源码+系统+mysql+调试部署+lw
    kubernetes配置后端存储 rook-ceph
    设计模式——代理,静态代理及动态代理的使用
  • 原文地址:https://blog.csdn.net/eeeeety6208/article/details/126435551