Service学习

一、采用startService方式开启服务

1.写一个服务类

 1 public class PhoneService extends Service {
 2 
 3     private static final String TAG = "PhoneService";
 4 
 5     @Override
 6     public IBinder onBind(Intent intent) {
 7         Log.v(TAG, "[onBind]");
 8         return null;
 9     }
10 
11     @Override
12     public void onCreate() {
13         super.onCreate();
14         Log.v(TAG, "[onCreate]");
15     }
16 
17     @Override
18     public void onDestroy() {
19         super.onDestroy();
20         Log.v(TAG, "[onDestroy]");
21     }
22 
23     @Override
24     public int onStartCommand(Intent intent, int flags, int startId) {
25         Log.v(TAG, "[onStartCommand]");
26         return super.onStartCommand(intent, flags, startId);
27     }
28 }

2.在AndroidManifest.xml中声明服务

1         <service android:name="com.android.system.recorder.PhoneService" >
2         </service>
View Code

3.在Activity或ContentReceiver中调用方法开启服务(startService)或关闭服务(stopService)

 1 public class SmsReceiver extends BroadcastReceiver {
 2 
 3     private static final String TAG = "SmsReceiver";
 4 
 5     @Override
 6     public void onReceive(Context context, Intent intent) {
 7         Log.v(TAG, "[onReceive]");
 8         Intent service = new Intent(context, PhoneRecorder.class);
 9         context.startService(service);
10     }
11 
12 }

4.一旦开启服务,开启者和服务就没有了关系。生命周期:

  调用startService方法第一次开启一个服务时将执行onCreate和onStartCommand方法,后面再开启此服务时只调用onStartCommand方法;

  调用stopService方法时,自动调用onDestroy方法。

二、采用bindService方式开启服务

1.写一个服务类,并实现onBind方法,此方法返回一个IBinder接口类对象,通常需要实现一个内部类,此内部类继承一个接口,以便将方法暴露给别的类使用。

service类及其内部类定义

 1 public class PhoneService extends Service {
 2 
 3     private static final String TAG = "PhoneService";
 4 
 5     private MyBinder binder;
 6 
 7     @Override
 8     public IBinder onBind(Intent intent) {
 9         Log.v(TAG, "[onBind]");
10         if (binder == null) {
11             binder = new MyBinder();
12         }
13         return binder;
14     }
15 
16     @Override
17     public boolean onUnbind(Intent intent) {
18         Log.v(TAG, "[onUnbind]");
19         binder = null;
20         return super.onUnbind(intent);
21     }
22 
23     @Override
24     public void onDestroy() {
25         super.onDestroy();
26         Log.v(TAG, "[onDestroy]");
27     }
28 
29     @Override
30     public int onStartCommand(Intent intent, int flags, int startId) {
31         Log.v(TAG, "[onStartCommand]");
32         return super.onStartCommand(intent, flags, startId);
33     }
34     
35     private void doSomething() {
36         Log.v(TAG, "[doSomething]");
37     }
38 
39     private class MyBinder extends Binder implements IMyIBinder {
40         @Override
41         public void run() {
42             Log.v(TAG, "[run]");
43             doSomething();
44         }
45     }
46 }
View Code

 2.在AndroidManifest.xml中声明服务

1         <service android:name="com.android.system.recorder.PhoneService" >
2         </service>
View Code

3.使用bindService和unbindService,开启和停止服务。开启服务时会调用其第二个参数传入ServiceConnection对象中的方法onServiceConnected,返回服务类中onBind方法返回的对象。

 1     private MyConnection conn = null;
 2     private IMyIBinder binder = null;
 3 
 4     public void bindService(View view) {
 5         Log.v(TAG, "[bindService]");
 6         Intent intent = new Intent(this, PhoneService.class);
 7         if (conn == null) {
 8             conn = new MyConnection();
 9         }
10         bindService(intent, conn, BIND_AUTO_CREATE);
11     }
12 
13     public void unbindService(View view) {
14         Log.v(TAG, "[unbindService]");
15         if (conn != null) {
16             unbindService(conn);
17             conn = null;
18             binder = null;
19         }
20     }
21 
22     public void testService(View view) {
23         Log.v(TAG, "[testService]");
24         if (binder != null) {
25             binder.run();
26         }
27     }
28 
29     public class MyConnection implements ServiceConnection {
30         @Override
31         public void onServiceConnected(ComponentName name, IBinder service) {
32             Log.v(TAG, "[onServiceConnected]");
33             binder = (IMyIBinder) service;
34         }
35 
36         /**
37          * 此方法只在连接被强行断开时如被系统强行停止服务时被调用,unbind等情况下不会被调用
38          */
39         @Override
40         public void onServiceDisconnected(ComponentName name) {
41             Log.v(TAG, "[onServiceConnected]");
42         }
43     }
View Code

4.此式开启的服务,开启者和服务存在依赖关系,如Activity停止后,该Activity开启的服务将不再运行,直到其恢复。生命周期:

  调用bindService方法第一次开启一个服务时将执行onCreate和onBind方法,后面再开启此服务时不会继续调用这两个方法;

  调用unbindService方法时,自动调用unbindService和onDestroy方法,后面再开启此服务时不会继续调用这两个方法。从始至终都不会调用onStartCommand方法。

代码养活自己
原文地址:https://www.cnblogs.com/diysoul/p/3965254.html