美文网首页Android基础
Android四大组件之Service

Android四大组件之Service

作者: AndryYu | 来源:发表于2017-11-05 21:24 被阅读0次

    通过总结,记录在android开发中,使用Service需要注意的点:

    1. Service两种启动方式和声明周期
    2. IntentService使用
    3. Service更新UI方法

    Service两种启动方式和声明周期

    Service声明周期
    第一种方式:通过StartService启动Service

    通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。

    • onCreate()
          onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作。
    • onStartCommand()
          如果多次执行了Context的startService()方法,那么Service的onStartCommand()方法也会相应的多次调用。onStartCommand()方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。
    • onDestory()
          在销毁的时候会执行Service该方法。

    以上几个方法都是回调方法,且在主线程中执行,由android操作系统在合适的时机调用。

    Service的onStartCommand()方法的返回值

    • START_NOT_STICKY
          返回该值表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service。当然如果在其被杀掉之后一段时间又调用了startService,那么该Service又将被实例化。
    • START_STICKY
          返回该值表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象,然后Android系统会尝试再次重新创建该Service,并执行onStartCommand回调方法,但是onStartCommand回调方法的Intent参数为null,也就是onStartCommand方法虽然会执行但是获取不到intent信息。
    • START_REDELIVER_INTENT
          返回该值表示Service运行的进程被Android系统强制杀掉之后,与返回START_STICKY的情况类似,Android系统会将再次重新创建该Service,并执行onStartCommand回调方法,但是不同的是,Android系统会再次将Service在被杀掉之前最后一次传入onStartCommand方法中的Intent再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中,这样我们就能读取到intent参数。
    • START_STICKY_COMPATIBILITY
          START_STICKY的兼容版本,但不保证服务被终止后一定能重启。
    第二种方式:通过BindService启动Service

    bindService启动服务的生命周期与其绑定的client息息相关。当client销毁时,client会自动与Service解除绑定。当然,client也可以明确调用Context的unbindService()方法与Service解除绑定。当没有任何client与Service绑定时,Service会自行销毁。

    public class TestService extends Service{
    
        //client 可以通过Binder获取Service实例
        public class MyBinder extends Binder {
            public TestService getService() {
                return TestTwoService.this;
            }
        }
    
        //通过binder实现调用者client与Service之间的通信
        private MyBinder binder = new MyBinder();
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return START_NOT_STICKY;
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            return false;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    }
    
    • onBind()
      onBind方法返回的IBinder的实例需要返回Service实例本身。通常,最简单的方法就是在service中创建binder的内部类,加入类似getService()的方法返回Service.
           第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。

    IntentService的使用

    IntentService在它的onCreate()函数中通过实例化了一个HandlerThread开启一个线程来处理所有Intent请求对象所对应的任务。IntentService在处理任务时,还是采用Handler+Message的方式,创建一个名叫ServiceHandler的Handler对象,并把它直接绑定到HandlerThread所对应的子线程。ServiceHandler把处理intent所对应的任务都封装到onHandleIntent函数里。因此如果我们需要处理自己的任务,直接实现onHandleIntent方法,再在里面根据Intent的不同进行不同的处理就可以了。

    Service更新UI方法

    相关文章

      网友评论

        本文标题:Android四大组件之Service

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