Android Service基本使用

Service 是 Android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),与Activity的不同是Service只能运行在后台,Service没有界面并且生命周期也与Activity不同。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。此外,一个组件可以绑定到一个服务与之交互,甚至执行进程间通信(IPC)。 例如一个服务可以在后台处理网络交易、播放音乐、执行文件 I/O,或与内容提供者交互等。

Android Service基本使用_第1张图片
Service生命周期图
1. Service启动方式

1)启动服务方式

  • startService方式
    onCreate():服务创建时调用
    onStartCommand():服务被调用开启方法时调用
    onDestroy():服务销毁时调用

当一个Service在被使用 startService方法启动,不管是否调用了 bindService(绑定服务)或 unbindService(解除绑定服务)到该Service,该Service都会在后台运行并不受影响。一个Service被使用 startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与 startService的次数一致),且系统只会创建一个Service实例(结束该Service也只需要调用一次 stopService),该Service会一直在后台运行直至调用 stopService或调用自身的 stopSelf方法。

  • bindService方式
    onCreate():服务创建时调用
    onBind():服务被绑定时调用
    onServiceConnected():服务连接时调用
    onUnbind():服务被解绑时调用
    onDestroy():服务销毁时调用

当一个Service在被使用 bindService方法启动,不论 bindService被调用几次,Service的 onCreate方法只会执行一次,同时 onStartCommand方法始终不会调用。

  • 混合方式
    onCreate():服务创建时调用
    onStartCommand():服务被调用开启方法时调用
    onBind():服务被绑定时调用
    onServiceConnected():服务连接时调用
    onUnbind():服务被解绑时调用
    onDestroy():服务销毁时调用

当一个Service在被启动(startService的同时又被绑定 bindService),该Service将会一直在后台运行,并且不管调用几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与 startService调用的次数一致(使用 bindService方法不会调用 onStartCommand)。同时,调用 unBindService将不会停止Service,必须调用 stopService或 Service自身的 stopSelf来停止服务。

2)启动服务区别
startService:
(1) 调用者退出后,Service仍然存在;
(2) startService()stopService()只能开启和关闭Service,无法操作Service
bindService:
(1) 调用者退出后,Service随着调用者销毁;
(2) bindService()unbindService()可以操作Service

2. Service基本用法
  • startService方式启动服务
    1) 继承 Service
    (1) 新建一个MyService继承自Service,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();       
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {      
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {      
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;


  ...
      
             
     ...
  

(3) 通过startService()启动,stopService()停止服务。

Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);

//停止服务
stopService(intent);

2)继承 IntentService
因为Service中几个方法的回调都是在主线程中,如果使用Service执行特别耗时的操作,建议单独新建线程去操作,避免阻塞主线程(UI线程)。IntentService在内部帮我们新建的线程,执行完毕任务后会自动关闭,无需手动结束它。

(1) 新建一个MyService继承自IntentService,并重写父类方法;

public class MyService extends IntentService {
    public MyService() {
        super("MyService");
    }
    
    @Override
    protected void onHandleIntent(Intent intent) {      
    }
    
    @Override
    public void onCreate() {
        super.onCreate();       
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {      
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {       
        super.onDestroy();
    }
}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;


  ...
      
             
     ...
  

(3) 通过startService()启动服务

Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);
  • bindService方式启动服务
    1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {      
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();       
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }
}

2)通过bindService()绑定服务,通过unbindService()解绑服务。

MyService myService;
ServiceConnection mConnection = ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.MyBinder binder = (MyService.MyBinder) service;
        mService = binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myService = null;
    }
};

Intent intent = new Intent(this, MyService.class);
// 绑定服务
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务
unbindService(mConnection);
  • 混合方式启动服务
    1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }
}

2)在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;


  ...
      
             
     ...
  

3)通过startService()启动,stopService()停止服务。

MyService myService;
ServiceConnection mConnection = ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.MyBinder binder = (MyService.MyBinder) service;
        mService = binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myService = null;
    }
};

Intent intent = new Intent(this, MyService.class);
//开启并绑定服务
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务
unbindService(mConnection);

//停止服务
stopService(intent);
3. Service生命周期

Android Service生命周期浅析

参考

Service官方文档,开启传送门

你可能感兴趣的:(Android Service基本使用)