Android四大组件之Service

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

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

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

Android四大组件之Service_第1张图片
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)