Android笔记-四大组件之Service

简介

Service,即服务,是Android系统中的后台运行程序,用来处理不需要用户界面但是需要长期运行的任务.

标准服务

  • 生命周期

    onCreate() 方法是在服务第一次创建的时候调用,onStartCommand()方法在每次启动服务的时候都会被调用(可调用多次,但每个服务只会存在一个实例),onDestroy()方法是在服务销毁的时候调用.

  • 基本用法

    • 第一步, 自定义一个服务继承自Service类
      public class MyService  extends Service{
          private static final String TAG = "MyService";
      
          @Nullable
          @Override
          public IBinder onBind(Intent intent) {
              Log.d(TAG, "onBind() called");
              return null;
          }
      
          @Override
          public void onCreate() {
              super.onCreate();
              Log.d(TAG, "onCreate() called");
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Log.d(TAG, "onStartCommand() called");
              return super.onStartCommand(intent, flags, startId);
          }
      
          @Override
          public void onDestroy() {
              super.onDestroy();
              Log.d(TAG, "onDestroy() called");
          }
      }
      
    • 第二步, 在menifest文件中注册
      
      
    • 第三步, 在context(一般是Activity)中启动服务
      startService(new Intent(this, MyService.class));
      
    • 第四步, 在context(一般是Activity)停止服务
      stopService(new Intent(this, MyService.class));
      

      也可以在MyService中调用stopSelf()方法让该服务停止运行.

  • 服务与Activity交互
    以上方式只能通过在Activity中调用startService()stopService()两个方法来启动和停止服务,如果想要更加精确的控制服务,比如指挥服务做些事情以及从服务那里得到一些反馈,就需要通过Binder来完成了.

    • 第一步,自定义Binder
      public class MyBinder extends Binder {
          private static final String TAG = "MyBinder";
      
          //自定义执行任务的方法
          public void startDownload() {
              Log.d(TAG, "startDownload() called");
          }
      
          //自定义获取进度
          public int getProgress() {
             Log.d(TAG, "getProgress() called");
              return 0;
          }
      }
      
    • 第二步,自定义Service
      public class MyService  extends Service{
          private static final String TAG = "MyService";
      
          private MyBinder binder = new MyBinder();
      
          @Nullable
          @Override
          public IBinder onBind(Intent intent) {
              Log.d(TAG, "onBind() called");
              return binder;
          }
      
          @Override
          public void onCreate() {
              super.onCreate();
              Log.d(TAG, "onCreate() called");
          }
      
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Log.d(TAG, "onStartCommand() called");
              return super.onStartCommand(intent, flags, startId);
          }
      
          @Override
          public void onDestroy() {
              super.onDestroy();
              Log.d(TAG, "onDestroy() called");
          }
      }
      
    • 第三步, 在menifest文件中注册
      
      
    • 第四步, 在Activity中初始化
      private MyBinder myBinder;
      private ServiceConnection serviceConnection = new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) {
              Log.d(TAG, "onServiceConnected() called");
              myBinder = (MyBinder) service;
              
              //指挥服务去执行任务
              myBinder.startDownload();
              
              //获取服务的执行反馈
              myBinder.getProgress();
          }
      
          @Override
          public void onServiceDisconnected(ComponentName name) {
              Log.d(TAG, "onServiceDisconnected() called");
          }
      };
      
    • 第五步, 在Activity中建立绑定关系
      bindService(new Intent(this, MyService.class), this.serviceConnection, BIND_AUTO_CREATE);
      
    • 第六步, 在Activity中解除绑定关系
      unbindService(this.serviceConnection);
      
      1. onBind()方法获取Binder的示例,从而实现对binder的控制, 该方法会在onCreate()完成后执行;
      2. 只要调用方和服务的连接没有断开,服务会一直保持运行状态;
      3. 如果同时调用了startService()bindservice()方法, 则需要调用stopService()unbindService()方法才能销毁服务.

IntentService

  • 特点

    • 执行完成自动停止
    • onHandleIntent()方法中自动开启线程
  • 使用方法

    • 新建一个类, 继承自IntentService
    public class MyIntentService extends IntentService {
        private static final String TAG = "MyIntentService";
    
        public MyIntentService() {
            super("MyIntentService");
        }
    
        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            Log.d(TAG, "onHandleIntent() called with: thread id is: [" + Thread.currentThread().getId() + "]");
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "onDestroy: ()");
        }
    }
    
    • 在menifest中注册
    
    
    • 启动
    startService(new Intent(this, MyIntentService.class));
    

你可能感兴趣的:(Android笔记-四大组件之Service)