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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春哥一号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值