Android Service 笔记

从运行模式来看,Android的服务组件没有运行在独立的进程或线程中,而是和Android其他组件一样运行在进程的主线程中。所以直接在服务组件中同步执行耗时操作,将会阻塞主线程。

像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列。IntentService会顺序执行这些命令,并同时为每一条命令在后台线程上调用onHandleIntent(intent)的方法。当执行完队列的所有命令后,服务也随即停止并被销毁。PS:IntentService是一种non-sticky服务。

non-sticky服务:当服务自己认为已经完成任务时,会调用stopSelf()或者stopSelf(int)方法告诉Android任务已经完成,以结束服务。

sticky服务:服务会持续运行,直到某个组件调用Context.stopService(Intent)让它停止。

Service的生命周期

一、Context.startService

当首次启动服务时,会依次调用onCreate()和onStart(),如果服务已经被创建,再调用startService(intent)

就只会执行onStart()。Intent传递过来的参数可以在onStartCommand()方法中进行处理。主动结束时执行

stopSelf()方法,被动结束调用Context.stopService()方法,然后再执行onDestroy()。

二、Context.bindService

如果客户端想持续连接服务,获取服务实例可以使用绑定服务这种方式。

同样首次创建服务时,会调用onCreate(),然后onBind方法会构造一个IBinder对象返回给调用者,建立通信连

接,调用者通过重写ServiceConnection类中的onServiceConnected()方法可以获取此IBinder对象。通过

onUnBind解绑服务,然后再执行onDestroy()。绑定服务的组件在销毁前应解除绑定,否则会造成内存泄

露。

部分代码如下:

Service端

[java]  [java]
[java]
  1. public class MyService extends Service {
  2. private static final String TAG = "MyService";
  3. private MyBinder mBinder = new MyBinder();
  4. // 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例
  5. @Override
  6. public IBinder onBind(Intent intent) {
  7. Log.e(TAG, "start IBinder~~~");
  8. return mBinder;
  9. }
  10. @Override
  11. public void onCreate() {
  12. Log.e(TAG, "start onCreate~~~");
  13. super.onCreate();
  14. }
  15. @Override
  16. public void onDestroy() {
  17. Log.e(TAG, "start onDestroy~~~");
  18. super.onDestroy();
  19. }
  20. @Override
  21. public boolean onUnbind(Intent intent) {
  22. Log.e(TAG, "start onUnbind~~~");
  23. return super.onUnbind(intent);
  24. }
  25. //为服务创建一个公共方法,用于测试
  26. public String test(){
  27. System.out.println("test");
  28. }
  29. public class MyBinder extends Binder{
  30. MyService getService(){
  31. return MyService.this;
  32. }
  33. }
  34. }
[java] public class MyService extends Service { private static final String TAG = "MyService"; private MyBinder mBinder = new MyBinder(); // 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例 @Override public IBinder onBind(Intent intent) { Log.e(TAG, "start IBinder~~~"); return mBinder; } @Override public void onCreate() { Log.e(TAG, "start onCreate~~~"); super.onCreate(); } @Override public void onDestroy() { Log.e(TAG, "start onDestroy~~~"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.e(TAG, "start onUnbind~~~"); return super.onUnbind(intent); } //为服务创建一个公共方法,用于测试 public String test(){ System.out.println("test"); } public class MyBinder extends Binder{ MyService getService(){ return MyService.this; } } }
调用端:
[java]  [java]
[java]
  1. public class ServiceDemo extends Activity {
  2. private ServiceConnection mServiceConnection = new ServiceConnection() {
  3. public void onServiceConnected(ComponentName name, IBinder service) {
  4. mMyService = ((MyService.MyBinder)service).getService();
  5. mMyService.test(); // 直接调用服务实例的公共方法
  6. }
  7. public void onServiceDisconnected(ComponentName name) {
  8. }
  9. };
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. Intent i = new Intent();
  14. i.setClass(ServiceDemo.this, MyService.class);
  15. mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
  16. }
  17. }
[java] public class ServiceDemo extends Activity { private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { mMyService = ((MyService.MyBinder)service).getService(); mMyService.test(); // 直接调用服务实例的公共方法 } public void onServiceDisconnected(ComponentName name) { } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent i = new Intent(); i.setClass(ServiceDemo.this, MyService.class); mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE); } }
经验分享 程序员 微信小程序 职场和发展