一. Service生命周期

  1. 官方说明图:

944365-cf5c1a9d2dddaaca.png

  1. startService启动方式生命周期
    1. 手动调用 startService 后,自动调用 onCreate() -> onStartCommand()
      1. 若一个 Service 被 startService 调用多次, onCreate 方法只会调用一次;
      2. 整个生命周期中, 只有 onStartCommand 会被多次调用, 其他只会调用一次;
      3. onStartCommand 调用次数 = startService 调用次数;
      4. onStartCommand 必须返回一个整数, 描述系统杀死服务后应该如何继续运行.
        a. START_STICKY
        如果Service所在的进程,在执行了onStartCommand方法后,被清理了,那么这个Service会被保留在已开始的状态,但是不保留传入的Intent ,随后系统会尝试重新创建此Service,由于服务状态保留在已开始状态,所以创建服务后一定会调用onStartCommand方法。如果在此期间没有任何启动命令被传递到service ,那么参数Intent将为null ,需要我们小心处理。==(重建服务&调用 onStartCommand, 不会再次传入上一个 intent , 而是用 null intent 来调 onStartCommand , 除非有启动服务的 intent 未发送完, 那么这些余下的 intent 会继续发送)==适用于媒体播放器, 他们不执行命令, 但需要一直运行并随时待命.
        b. START_NOT_STICKY
        如果Service所在的进程,在执行了onStartCommand方法后,被清理了,则系统不会重新启动此Service。当服务不再是必须的, 并且应用程序能够简单的重启那些未完成的工作时, 这是避免服务运行的最安全的选项.
        c. START_REDELIVER_INTENT
        如果Service所在的进程,在执行了onStartCommand方法后,被清理了,则结果和START_STICKY一样,也会重新创建此Service并调用onStartCommand方法。不同之处在于,如果是返回的是START_REDELIVER_INTENT ,则重新创建Service时onStartCommand方法会传入之前的intent
        (重建服务& 用上一个已发送的 intent 去调用onStartCommand, 任何未发的 intent 也会依次送入)适用于需要立即恢复工作的活跃服务, 如下载文件.
        d. START_STICKY_COMPATIBILITY
        这个比较简单,是START_STICKY的兼容版本,但是不能保证被清理后onStartCommand方法一定会被重新调用
      5. 手动调用stopService, 关闭服务, 自动调用 onDestory()
  2. 绑定的方式启动服务
    1. 手动调用 bindService 后, onCreate() -> onBind()
    2. 手动调用 unbindService , onUnbind() -> onDestory()
  3. UML图解

944365-34fe9e4c64204f89.png

二. 服务分类

1.具体分类

944365-ab970a084ab936c2.png

2.详情介绍

944365-dec9e6e2428f41f0.png

3.本地服务,无法和 Activity 通信

  1. LocalService
  1. public class LocalService extends Service {
  2. @Nullable
  3. @Override
  4. public IBinder onBind(Intent intent) {
  5. return null;
  6. }
  7. //启动Service之后,就可以在onCreate()或onStartCommand()方法里去执行一些具体的逻辑
  8. //由于这里作Demo用,所以只打印一些语句
  9. @Override
  10. public void onCreate() {
  11. super.onCreate();
  12. Log.e(TAG, "onCreate: " );
  13. }
  14. @Override
  15. public int onStartCommand(Intent intent, int flags, int startId) {
  16. Log.e(TAG, "onStartCommand: "+intent.getStringExtra("key") );
  17. return super.onStartCommand(intent, flags, startId);
  18. }
  19. @Override
  20. public void onDestroy() {
  21. super.onDestroy();
  22. Log.e(TAG, "onDestroy: " );
  23. }
  24. }
  1. 布局文件, 用于启动和停止服务 ```java <?xml version=”1.0” encoding=”utf-8”?>

    1. <LinearLayout android:layout_width="match_parent"
    2. android:orientation="vertical"
    3. android:layout_height="wrap_content">
    4. <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    5. android:text="按运行地点分类"/>
    6. <Button
    7. android:id="@+id/btn_service_test_local"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content"
    10. android:text="本地服务,启动"
    11. android:onClick="localstartListener"
    12. />
    13. <Button
    14. android:id="@+id/btn_service_test_localStop"
    15. android:layout_width="wrap_content"
    16. android:layout_height="wrap_content"
    17. android:text="本地服务,stop"
    18. android:onClick="localStopListener"
    19. />
    20. <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    21. android:text="可通信的服务"/>
    22. <Button
    23. android:id="@+id/btn_service_test_bindStart"
    24. android:layout_width="wrap_content"
    25. android:layout_height="wrap_content"
    26. android:text="启动绑定"
    27. android:onClick="bindstartListener"
    28. />
    29. <Button
    30. android:id="@+id/btn_service_test_bindService"
    31. android:layout_width="wrap_content"
    32. android:layout_height="wrap_content"
    33. android:text="调用服务里的方法"
    34. android:onClick="bindServiceListener"
    35. />
    36. <Button
    37. android:id="@+id/btn_service_test_bindStop"
    38. android:layout_width="wrap_content"
    39. android:layout_height="wrap_content"
    40. android:text="解绑服务,stop"
    41. android:onClick="bindStopListener"
    42. />
    43. <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    44. android:text="前台服务,两种方式都可以是前台服务"/>
  1. <Button
  2. android:id="@+id/btn_service_test_start"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="start方式启动"
  6. android:onClick="startListener"
  7. />
  8. <Button
  9. android:id="@+id/btn_service_test_startStop"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="start方式停止"
  13. android:onClick="startStopListener"
  14. />
  15. <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
  16. android:text="后台服务, IntentService"/>
  17. <Button
  18. android:id="@+id/btn_service_test_intentStart"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="启动"
  22. android:onClick="intentstartListener"
  23. />
  24. </LinearLayout>
  25. </ScrollView>

  1. 1. Activity, 调用方法
  2. ```java
  3. package com.kiwilss.lxkj.fourassembly.service;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.IBinder;
  9. import android.support.annotation.Nullable;
  10. import android.support.v7.app.AppCompatActivity;
  11. import android.util.Log;
  12. import android.view.View;
  13. import com.kiwilss.lxkj.fourassembly.R;
  14. /**
  15. * @author : Lss kiwilss
  16. * @FileName: ServiceTestActivity
  17. * @e-mail : kiwilss@163.com
  18. * @time : 2019/4/16
  19. * @desc : {DESCRIPTION}
  20. */
  21. public class ServiceTestActivity extends AppCompatActivity {
  22. @Override
  23. protected void onCreate(@Nullable Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_service_test);
  26. }
  27. public void startListener(View view) {
  28. Intent intent = new Intent(this, StartService.class);
  29. intent.putExtra("key","start");
  30. startService(intent);
  31. }
  32. public void startStopListener(View view) {
  33. Intent intent = new Intent(this, StartService.class);
  34. intent.putExtra("key","stop");
  35. stopService(intent);
  36. }
  37. public void localstartListener(View view) {
  38. Intent intent = new Intent(this, LocalService.class);
  39. intent.putExtra("key","start");
  40. startService(intent);
  41. }
  42. public void localStopListener(View view) {
  43. Intent intent = new Intent(this, LocalService.class);
  44. stopService(intent);
  45. }
  46. BindService.MyBinder myBinder;
  47. //创建 serviceConnection 匿名类
  48. private ServiceConnection mSc = new ServiceConnection(){
  49. //重写onServiceConnected()方法和onServiceDisconnected()方法
  50. //在Activity与Service建立关联和解除关联的时候调用
  51. @Override
  52. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  53. //实例化Service的内部类myBinder
  54. //通过向下转型得到了MyBinder的实例
  55. Log.e("MMM", "onServiceConnected: " );
  56. myBinder = (BindService.MyBinder) iBinder;
  57. //调用服务里的方法
  58. myBinder.serviceConnectActivity();
  59. }
  60. @Override
  61. public void onServiceDisconnected(ComponentName componentName) {
  62. Log.e("MMM", "onServiceDisconnected: " );
  63. }
  64. };
  65. public void bindstartListener(View view) {
  66. //构建绑定服务的Intent对象
  67. Intent bindIntent = new Intent(this, BindService.class);
  68. bindIntent.putExtra("key","binder");
  69. //调用bindService()方法,以此停止服务
  70. bindService(bindIntent,mSc,BIND_AUTO_CREATE);
  71. //参数说明
  72. //第一个参数:Intent对象
  73. //第二个参数:上面创建的Serviceconnection实例
  74. //第三个参数:标志位
  75. //这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service
  76. //这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行
  77. }
  78. public void bindStopListener(View view) {
  79. //调用unbindService()解绑服务
  80. //参数是上面创建的Serviceconnection实例
  81. unbindService(mSc);
  82. }
  83. public void bindServiceListener(View view) {
  84. if (myBinder != null){
  85. myBinder.serviceConnectActivity();
  86. myBinder.getService().serviceConnectActivity();
  87. myBinder.getService().serviceFun();
  88. }
  89. }
  90. public void intentstartListener(View view) {
  91. // 请求1
  92. // Intent i = new Intent("cn.scu.finch");
  93. // Bundle bundle = new Bundle();
  94. // bundle.putString("taskName", "task1");
  95. // i.putExtras(bundle);
  96. // startService(i);
  97. Intent intent = new Intent(this, MyIntentService.class);
  98. intent.putExtra("taskName","task1");
  99. startService(intent);
  100. Intent intent2 = new Intent(this, MyIntentService.class);
  101. intent2.putExtra("taskName","task2");
  102. startService(intent2);
  103. startService(intent);
  104. // 请求2
  105. // Intent i2 = new Intent("cn.scu.finch");
  106. // Bundle bundle2 = new Bundle();
  107. // bundle2.putString("taskName", "task2");
  108. // i2.putExtras(bundle2);
  109. // startService(i2);
  110. //
  111. // startService(i); //多次启动
  112. }
  113. }
  1. 启动服务:
    1. public void localstartListener(View view) {
    2. Intent intent = new Intent(this, LocalService.class);
    3. intent.putExtra("key","start");
    4. startService(intent);
    5. }

停止服务:

  1. public void localStopListener(View view) {
  2. Intent intent = new Intent(this, LocalService.class);
  3. stopService(intent);
  4. }
  1. 清单文件注册

    1. <service android:name=".service.LocalService"/>
  2. 服务属性介绍:
    name 服务的类名
    label Service的名字
    icon Service的图标
    permission 申明服务的权限(有提供了该权限的应用才能控制或连接服务)
    process 表明该服务是否在另一个进程中运行(不设置默认本地服务, remote 设置成远程服务)
    enabled 系统默认启动,true:Service 将会默认被系统启动;不设置则默认为false
    exported 该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false

  3. 测试结果
    点击开启:
    2019-04-17 18:10:10.621 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onCreate:
    2019-04-17 18:10:10.621 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onStartCommand: start
    点击关闭:
    2019-04-17 18:10:12.880 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onDestroy:

4.可通信的服务,绑定方式开启

  1. BindService ```java package com.kiwilss.lxkj.fourassembly.service;

import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log;

import static com.kiwilss.lxkj.fourassembly.service.StartService.TAG;

/**

  • @author : Lss kiwilss
  • @FileName: BindService
  • @e-mail : kiwilss@163.com
  • @time : 2019/4/17
  • @desc : {DESCRIPTION}可通信的服务,即实现了Activity指挥Service干什么Service就去干什么的功能 */ public class BindService extends Service { //@androidx.annotation.Nullable

    MyBinder myBinder = new MyBinder(); @Nullable @Override public IBinder onBind(Intent intent) {

    1. Log.e(TAG, "onBind: " + intent.getStringExtra("key"));
    2. return myBinder;

    }

    @Override public void onCreate() {

    1. super.onCreate();
    2. Log.e(TAG, "onCreate: " );

    }

    @Override public int onStartCommand(Intent intent, int flags, int startId) {

    1. Log.e(TAG, "onStartCommand: " );
    2. return super.onStartCommand(intent, flags, startId);

    }

    @Override public boolean onUnbind(Intent intent) {

    1. Log.e(TAG, "onUnbind: " );
    2. return super.onUnbind(intent);

    }

    @Override public void onDestroy() {

    1. super.onDestroy();
    2. Log.e(TAG, "onDestroy: " );

    }

    public void serviceFun(){

    1. Log.e(TAG, "serviceFun: activity 调用服务里的方法" );

    }

    public void serviceConnectActivity(){

    1. Log.e(TAG, "serviceConnectActivity: +++++++服务关联activity,并在activity中执行服务中的方法" );

    } //新建一个子类继承 binder class MyBinder extends Binder{

    1. public void serviceConnectActivity(){
    2. Log.e(TAG, "serviceConnectActivity: *****+服务关联activity,并在activity中执行服务中的方法" );
    3. }
    4. public BindService getService(){
    5. return BindService.this;
    6. }

    } } ```

  1. 布局界面和 Activity 同上
  2. 绑定启动:

    1. public void bindstartListener(View view) {
    2. //构建绑定服务的Intent对象
    3. Intent bindIntent = new Intent(this, BindService.class);
    4. bindIntent.putExtra("key","binder");
    5. //调用bindService()方法,以此停止服务
    6. bindService(bindIntent,mSc,BIND_AUTO_CREATE);
    7. //参数说明
    8. //第一个参数:Intent对象
    9. //第二个参数:上面创建的Serviceconnection实例
    10. //第三个参数:标志位
    11. //这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service
    12. //这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行
    13. }

解除绑定:

  1. public void bindStopListener(View view) {
  2. //调用unbindService()解绑服务
  3. //参数是上面创建的Serviceconnection实例
  4. unbindService(mSc);
  5. }
  1. 测试结果
    启动绑定:
    2019-04-17 18:16:43.319 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onCreate:
    2019-04-17 18:16:43.319 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onBind: binder
    2019-04-17 18:16:43.328 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onServiceConnected:
    2019-04-17 18:16:43.329 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: serviceConnectActivity: *+服务关联activity,并在activity中执行服务中的方法
    解除绑定:
    2019-04-17 18:17:20.089 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onUnbind:
    2019-04-17 18:17:20.089 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onDestroy:

5.前台服务,两种启动方式都可以

前台服务和后台服务的区别
  • 前台Service在下拉通知栏有显示通知(如下图),但后台Service没有;
  • 前台Service优先级较高,不会由于系统内存不足而被回收;后台Service优先级较低,当系统出现内存不足情况时,很有可能会被回收

Service:

  1. package com.kiwilss.lxkj.fourassembly.service;
  2. import android.app.Notification;
  3. import android.app.PendingIntent;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.IBinder;
  7. import android.support.annotation.Nullable;
  8. import android.util.Log;
  9. import com.kiwilss.lxkj.fourassembly.MainActivity;
  10. import com.kiwilss.lxkj.fourassembly.R;
  11. /**
  12. * @author : Lss kiwilss
  13. * @FileName: StartService
  14. * @e-mail : kiwilss@163.com
  15. * @time : 2019/4/16
  16. * @desc : {DESCRIPTION}
  17. */
  18. public class StartService extends Service {
  19. public static final String TAG = "MMM";
  20. //@androidx.annotation.Nullable
  21. @Nullable
  22. @Override
  23. public IBinder onBind(Intent intent) {
  24. Log.e(TAG, "onBind: ");
  25. return null;
  26. }
  27. @Override
  28. public void onCreate() {
  29. super.onCreate();
  30. Log.e(TAG, "onCreate: ");
  31. //改造成前台服务
  32. //添加下列代码将后台Service变成前台Service
  33. //构建"点击通知后打开MainActivity"的Intent对象
  34. Intent notificationIntent = new Intent(this, MainActivity.class);
  35. PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
  36. //新建Builer对象
  37. Notification.Builder builer = new Notification.Builder(this);
  38. builer.setContentTitle("前台服务通知的标题");//设置通知的标题
  39. builer.setContentText("前台服务通知的内容");//设置通知的内容
  40. builer.setSmallIcon(R.mipmap.ic_launcher);//设置通知的图标
  41. builer.setContentIntent(pendingIntent);//设置点击通知后的操作
  42. //builer.setAutoCancel(true);//设置可取消
  43. Notification notification = builer.getNotification();//将Builder对象转变成普通的notification
  44. startForeground(1, notification);//让Service变成前台Service,并在系统的状态栏显示出来
  45. }
  46. @Override
  47. public int onStartCommand(Intent intent, int flags, int startId) {
  48. String key = intent.getStringExtra("key");
  49. Log.e(TAG, "onStartCommand: " + key);
  50. return super.onStartCommand(intent, flags, startId);
  51. }
  52. @Override
  53. public void onDestroy() {
  54. super.onDestroy();
  55. Log.e(TAG, "onDestroy: ");
  56. }
  57. }

测试结果:
944365-caa89c41afed8e78.png

6.IntentService 后台服务

  1. 介绍
    处理异步请求 & 实现多线程.
    最常见的场景:离线下载
    不符合多个数据同时请求的场景:所有的任务都在同一个Thread looper里执行
  2. 使用
    MyIntentService ```java package com.kiwilss.lxkj.fourassembly.service;

import android.app.IntentService; import android.content.Intent; import android.support.annotation.Nullable; import android.util.Log;

/**

  • @author : Lss kiwilss
  • @FileName: MyIntentService
  • @e-mail : kiwilss@163.com
  • @time : 2019/4/17
  • @desc : {DESCRIPTION} */ public class MyIntentService extends IntentService { private static final String TAG = “MMM”;

    public MyIntentService(String name) {

    1. super(name);

    }

    public MyIntentService(){

    1. // 调用父类的构造函数
    2. // 参数 = 工作线程的名字
    3. super("myIntentService");

    }

    @Override public void onCreate() {

    1. super.onCreate();
    2. Log.e(TAG, "onCreate: " );

    }

    @Override public int onStartCommand( @Nullable Intent intent, int flags, int startId) {

    1. Log.e(TAG, "onStartCommand: " );
    2. return super.onStartCommand(intent, flags, startId);

    }

    @Override public void onDestroy() {

    1. super.onDestroy();
    2. Log.e(TAG, "onDestroy: " );

    }

    /**

    • 复写onHandleIntent()方法
    • 根据 Intent实现 耗时任务 操作 **/ @Override protected void onHandleIntent( @Nullable Intent intent) { // 根据 Intent的不同,进行不同的事务处理 assert intent != null; String taskName = intent.getStringExtra(“taskName”); switch (taskName) {
      1. case "task1":
      2. Log.e(TAG, "onHandleIntent: task1" );
      3. break;
      4. case "task2":
      5. Log.e(TAG, "onHandleIntent: test2" );
      6. break;
      } } } ```
  1. 开启服务 ```kotlin public void intentstartListener(View view) {

    1. // 请求1
    2. Intent intent = new Intent(this, MyIntentService.class);
    3. intent.putExtra("taskName","task1");
    4. startService(intent);
  1. Intent intent2 = new Intent(this, MyIntentService.class);
  2. intent2.putExtra("taskName","task2");
  3. startService(intent2);
  4. startService(intent);

// //多次启动

  1. }
  1. 4. 测试结果<br />2019-04-17 18:49:05.274 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onCreate:<br />2019-04-17 18:49:05.275 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onStartCommand:<br />2019-04-17 18:49:05.276 22163-22816/com.kiwilss.lxkj.fourassembly E/MMM: onHandleIntent: task1<br />2019-04-17 18:49:05.280 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onStartCommand:<br />2019-04-17 18:49:05.280 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onStartCommand:<br />2019-04-17 18:49:05.280 22163-22816/com.kiwilss.lxkj.fourassembly E/MMM: onHandleIntent: test2<br />2019-04-17 18:49:05.282 22163-22816/com.kiwilss.lxkj.fourassembly E/MMM: onHandleIntent: task1<br />2019-04-17 18:49:05.284 22163-22163/com.kiwilss.lxkj.fourassembly E/MMM: onDestroy:
  2. <a name="5a431a85"></a>
  3. #### 7.远程服务
  1. 远程服务与本地服务的区别
    • 远程服务与本地服务最大的区别是:远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程);而本地服务则是与调用者运行在同一个进程里
    • 二者区别的详细区别如下图: ```

944365-843b2b4e2988ff66.png

  1. 使用场景
    多个应用程序共享同一个后台服务(远程服务).即一个远程Service与多个应用程序的组件(四大组件)进行跨进程通信
  2. 使用demo

    1. 新建AIDL, 并在在新建AIDL文件里定义Service需要与Activity进行通信的内容(方法),并进行编译(Make Project)
    2. 新建服务,在服务中实现 AIDL 定义的接口方法, 服务如下

      1. public class LongService extends Service {
      2. //@androidx.annotation.Nullable
      3. // 实例化AIDL的Stub类(Binder的子类)
      4. AIDL_Service1.Stub mBinder = new AIDL_Service1.Stub() {
      5. @Override
      6. public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
      7. Log.e(TAG, "basicTypes: " );
      8. }
      9. @Override
      10. public void AIDL_Service() throws RemoteException {
      11. Log.e(TAG, "AIDL_Service: 客户端通过AIDL与远程后台成功通信" );
      12. }
      13. };
      14. @Override
      15. public void onCreate() {
      16. super.onCreate();
      17. Log.e(TAG, "onCreate: " );
      18. }
      19. @Override
      20. public int onStartCommand(Intent intent, int flags, int startId) {
      21. Log.e(TAG, "onStartCommand: " );
      22. return super.onStartCommand(intent, flags, startId);
      23. }
      24. @Nullable
      25. @Override
      26. public IBinder onBind(Intent intent) {
      27. Log.e(TAG, "onBind: " );
      28. return mBinder;
      29. }
      30. @Override
      31. public boolean onUnbind(Intent intent) {
      32. Log.e(TAG, "onUnbind: " );
      33. return super.onUnbind(intent);
      34. }
      35. @Override
      36. public void onDestroy() {
      37. super.onDestroy();
      38. Log.e(TAG, "onDestroy: " );
      39. }
      40. }
    3. 清单文件注册服务 ```java

  1. 1. Activity 中调用
  2. ```java
  3. /**远程服务
  4. * @param view
  5. */
  6. //远程服务的serviceconnect
  7. AIDL_Service1 mAIDL_Service;
  8. private ServiceConnection mLongSc = new ServiceConnection() {
  9. @Override
  10. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  11. //使用AIDLService1.Stub.asInterface()方法获取服务器端返回的IBinder对象
  12. //将IBinder对象传换成了mAIDL_Service接口对象
  13. mAIDL_Service = AIDL_Service1.Stub.asInterface(iBinder);
  14. try {
  15. //通过该对象调用在MyAIDLService.aidl文件中定义的接口方法,从而实现跨进程通信
  16. mAIDL_Service.AIDL_Service();
  17. } catch (RemoteException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. @Override
  22. public void onServiceDisconnected(ComponentName componentName) {
  23. }
  24. };
  25. public void longListener(View view) {
  26. //通过Intent指定服务端的服务名称和所在包,与远程Service进行绑定
  27. //参数与服务器端的action要一致,即"服务器包名.aidl接口文件名"
  28. // Intent intent = new Intent("scut.carson_ho.service_server.AIDL_Service1");
  29. //
  30. // //Android5.0后无法只通过隐式Intent绑定远程Service
  31. // //需要通过setPackage()方法指定包名
  32. // intent.setPackage("scut.carson_ho.service_server");
  33. Intent intent = new Intent(this, LongService.class);
  34. //绑定服务,传入intent和ServiceConnection对象
  35. bindService(intent, mLongSc, Context.BIND_AUTO_CREATE);
  36. }
  1. 测试结果
    2019-04-18 11:27:25.712 25501-25501/com.kiwilss.lxkj.fourassembly:remote E/MMM: onCreate:
    2019-04-18 11:27:25.713 25501-25501/com.kiwilss.lxkj.fourassembly:remote E/MMM: onBind:
    2019-04-18 11:27:25.716 25501-25513/com.kiwilss.lxkj.fourassembly:remote E/MMM: AIDL_Service: 客户端通过AIDL与远程后台成功通信

    三.参考文档

Android四大组件:Service史上最全面解析
Android四大组件
Android 绑定远程服务(aidl文件的使用)
demo 地址