• 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方法。

    代码养活自己
  • 相关阅读:
    Leetcode 40. Combination Sum II
    Leetcode** 39. Combination Sum
    Leetcode** 210. Course Schedule II
    Leetcode** 207. Course Schedule
    Leetcode 257. Binary Tree Paths
    Leetcode** 131. Palindrome Partitioning
    Leetcode** 20. Valid Parentheses
    Leetcode 14. Longest Common Prefix
    dfs序 二进制优化 Codeforces Round #316 (Div. 2)D. Tree Requests
    Codeforces Round #318 D. Bear and Blocks
  • 原文地址:https://www.cnblogs.com/diysoul/p/3965254.html
Copyright © 2020-2023  润新知