Android学习笔记五之Service

来源:互联网 发布:www.js jinhua.com v 编辑:程序博客网 时间:2024/06/04 19:11

Android学习笔记五之Service

1、什么是Service?

  什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的:

A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

  翻译过来就是:服务是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面。另一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切换到另一个应用程序。此外,一个组件可以绑定到一个服务的互动,甚至执行进程间通信(IPC)。例如,一个服务可以处理网络交互、播放音乐、执行文件I/O、或与内容提供者进行交互,都来自后台。

2、Service的分类

按运行地点分:

本地服务(LocalService):本地服务依附在主线程上而不是一个独立的进程,这样节约了内存资源,LocalService在同一进程中,不需要IPC和AIDL。但是LocalService当主进程被kill掉之后,服务也会停止。例如用于音乐播放等

远程服务(RemoteService):RemoteService是一个独立的进程,当Activity所在的进程被kill掉之后,还会存在,可以为多个进程服务,不受进程影响。对应进程名格式为所在包名加上你指定的android:process字符串。一般是系统提供的服务,这种服务会常驻内存,占用一定的资源。RemoteService一般非常少见,并且一般都是系统服务。

按运行类型分:

前台服务:在Notification显示正在运行图标,当服务被kill掉的时候,Notification显示的图标也会消失,对用户有一定的通知作用,例如音乐播放服务。

后台服务:默认的服务就是后台服务,不会再通知栏显示正在运行图标,当服务被终止的时候,用户看不到效果。某些不需要运行或者终止提示的服务,例如天气更新等

后台服务创建运行图标并且调用startForeground方法,才会使后台服务变成前台服务。

按使用方式分类:

startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService,启动之后,关联的Activity销毁并不会影响Service。

bindService 启动的服务:该方法启动的服务要进行通信。停止服务使用unbindService。当绑定的Activity销毁的时候,Service也会销毁。

startService 同时也 bindService 启动的服务:停止服务应同时使用stepService与unbindService

3、Service与Thread的区别

很多时候,我们都觉得用Thread比用Service简单的多,但是为什么还会使用Service呢?

Thread:Thread是比进程更小的单元,Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。一个进程里面可以有多个Thread,Thread必须运行在进程里面

Service:Service 是Android的一种机制,当它运行的时候如果是LocalService,那么对应的 Service 是运行在主进程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程上运行的。如果是RemoteService,那么对应的 Service 则是运行在独立进程上。

Thread是独立于Activity运行的,当一个Activity启动一个Thread的时候,只要Thread的run方法还没有执行完或者不是在Activity中停止Thread,Thread会一直执行。这样就会产生一个问题:当Thread还在运行,但是Activity被Finish掉了,其他的Activity不能持有当前Thread。

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做同步的话,该 Thread 需要在 Activity 没有启动的时候也在运行。这个时候当你启动一个新Activity 就没有办法在该 Activity 里面控制之前创建的Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

可以把 Service 想象成一种消息服务,我们可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。所以我们需要Service。

4、Service的生命周期

与Activity一样,Service也有一系列的生命周期方法,我们可以实现它们来监测service状态的变化,并且在适当的时候执行适当的工作。如下图就是Service的生命周期图

  由上图可以知道,Android使用Service有两种方式,绑定启动bindService和startService。还有一种就启动后之后绑定Service。

Service生命周期方法详解:

public class ExampleService extends Service{int mStartMode; // indicates how to behave if the service is killedIBinder mBinder; // interface for clients that bindboolean mAllowRebind; // indicates whether onRebind should be used@Overridepublic void onCreate(){    // The service is being created}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){    // The service is starting, due to a call to startService()    return mStartMode;}@Overridepublic IBinder onBind(Intent intent){    // A client is binding to the service with bindService()    return mBinder;}@Overridepublic boolean onUnbind(Intent intent){    // All clients have unbound with unbindService()    return mAllowRebind;}@Overridepublic void onRebind(Intent intent){    // A client is binding to the service with bindService(),    // after onUnbind() has already been called}@Overridepublic void onDestroy(){    // The service is no longer used and is being destroyed}}
  • onCreate()方法:当Service第一次被创建后立即回调该方法,该方法在Service整个生命周期中之调用一次

  • onStartCommand(Intent intent, int flags, int startId)方法:当客户端调用startService(Intent)方法时会回调,可多次调用StartService方法, 但不会再创建新的Service实例,而是继续复用前面产生的Service实例,但会继续回调 onStartCommand()方法!

  • onBind(Intent intent)方法:此方法是Service都必须实现的方法,该方法会返回一个 IBinder对象,app通过该对象与Service组件进行通信!

  • onUnbind(Intent intent)方法:当该Service上绑定的所有客户端都断开时会回调该方法!

  • onDestroy()方法:当Service被销毁的时候会回调该方法,该方法只会回调一次!

  • onRebind(Intent intent)方法:此方法在app调用onUnbind()方法之后需要重新绑定Service的时候调用。

StartService启动Service

  第一次启动会创建一个Service实例,依次调用onCreate()(onCreate方法只会调用一次)和onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

BindService启动Service

  如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

StartService启动Service后bindService绑定

  如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

特别注意
  • 当调用bindService绑定Service的时候,必须要在某处调用unbindService解绑Service
  • 当使用startService的时候,必须要使用stopService停止服务
  • 当同时用startService和bindService时,要终止Service,必须要同时调用unbindService和stopService,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;
  • 旋转手机屏幕的时候,默认状态下bindService会断开
  • 当想要使用Service的时候,必须要在AndroidManifest.xml中注册。

5、IntentService

 由于Service和Activity一样,都是运行在主线程中的,如果直接在Service里面执行耗时操作会ANR,所以谷歌提供了一个IntentService来处理耗时操作。简单来说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以worker queue的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个worker Thread,执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。

 IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。 ServiceHandler把处理一个intent所对应的事务都封装到叫做onHandleIntent的虚函数;因此我们直接实现虚函数onHandleIntent,再在里面根据Intent的不同进行不同的事务处理就可以了。另外,IntentService默认实现了Onbind()方法,返回值为null。 
  

 使用IntentService需要两个步骤:

  1、写构造函数

  2、实现虚函数onHandleIntent,并在里面根据Intent的不同进行不同的事务处理。

 这样做的好处是:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求

 注意:IntentService的构造函数一定是参数为空的构造函数,然后再在其中调用super(“name”)这种形式的构造函数。因为Service的实例化是系统来完成的,而且系统是用参数为空的构造函数来实例化Service的

public class MyIntentService extends IntentService {final static String TAG="robin"; public MyIntentService() {  super("com.lenovo.robin.test.MyIntentService");  Log.i(TAG,this+" is constructed"); } @Override protected void onHandleIntent(Intent arg0) {  Log.i(TAG,"begin onHandleIntent() in "+this);  try {   Thread.sleep(10*1000);  } catch (InterruptedException e) { e.printStackTrace();  }  Log.i(TAG,"end onHandleIntent() in "+this); } public void onDestroy() {  super.onDestroy();  Log.i(TAG,this+" is destroy"); }}

IntentService源码

package android.app;import android.content.Intent;import android.os.Handler;import android.os.HandlerThread;import android.os.IBinder;import android.os.Looper;import android.os.Message;public abstract class IntentService extends Service {private volatile Looper mServiceLooper;private volatile ServiceHandler mServiceHandler;private String mName;private boolean mRedelivery;private final class ServiceHandler extends Handler {    public ServiceHandler(Looper looper) {        super(looper);    }    @Override    public void handleMessage(Message msg) {        onHandleIntent((Intent)msg.obj);        stopSelf(msg.arg1);    }}public IntentService(String name) {    super();    mName = name;}public void setIntentRedelivery(boolean enabled) {    mRedelivery = enabled;}@Overridepublic void onCreate() {    // TODO: It would be nice to have an option to hold a partial wakelock    // during processing, and to have a static startService(Context, Intent)    // method that would launch the service & hand off a wakelock.    super.onCreate();    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");    thread.start();    mServiceLooper = thread.getLooper();    mServiceHandler = new ServiceHandler(mServiceLooper);}@Overridepublic void onStart(Intent intent, int startId) {    Message msg = mServiceHandler.obtainMessage();    msg.arg1 = startId;    msg.obj = intent;    mServiceHandler.sendMessage(msg);}/** * You should not override this method for your IntentService. Instead, * override {@link #onHandleIntent}, which the system calls when the IntentService * receives a start request. * @see android.app.Service#onStartCommand */@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    onStart(intent, startId);    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}@Overridepublic void onDestroy() {    mServiceLooper.quit();}@Overridepublic IBinder onBind(Intent intent) {    return null;}   protected abstract void onHandleIntent(Intent intent);}

5、Service实战

通过startService启动的Service:

   新建一个类继承Service  

public class FirstService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {    return null;}

在清单文件中注册Service

<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>    </activity>    <service android:name=".Service.FirstService"/></application>

在Activity中调用startService方法

 btn_start_service = (Button) findViewById(R.id.btn_start_service);    btn_start_service.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(getApplicationContext(), FirstService.class);            startService(intent);        }    });

这样,就完成了一个简单的Service的创建和启动,通过startService启动的Service不会因为Activity的销毁而销毁,所以我们必须要调用stopService方法。

与Activity绑定的Service:

SecondService

public class SecondService extends Service {private final String TAG = "SecondService";private int count;private boolean quit;private MyBinder binder = new MyBinder();public class MyBinder extends Binder {    public int getCount() {        return count;    }}@Overridepublic IBinder onBind(Intent intent) {    System.out.println("onBind方法被调用!");    return binder;}@Overridepublic void onCreate() {    super.onCreate();}@Overridepublic boolean onUnbind(Intent intent) {    System.out.println("onUnbind方法被调用");    return true;}@Overridepublic void onDestroy() {    super.onDestroy();    this.quit = true;    System.out.println("onDestroy方法被调用");}@Overridepublic void onRebind(Intent intent) {    System.out.println("onRebind方法被调用");    super.onRebind(intent);}}

清单文件注册

<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>    </activity>    <service android:name=".Service.FirstService"/>    <service android:name=".Service.SecondService"/></application>

MainActivity

public class MainActivity extends AppCompatActivity {Button btn_start_service;Button btn_bind_service;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    btn_start_service = (Button) findViewById(R.id.btn_start_service);    btn_start_service.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(getApplicationContext(), FirstService.class);            startService(intent);        }    });    btn_bind_service = (Button) findViewById(R.id.btn_bind_service);    btn_bind_service.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(getApplicationContext(), SecondService.class);            getApplicationContext().bindService(intent, mServiceConnection, Service.BIND_AUTO_CREATE);        }    });}ServiceConnection mServiceConnection = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        System.out.println("------->>service connected");    }    @Override    public void onServiceDisconnected(ComponentName name) {        System.out.println("--------------->>service dis connected");    }};}
IntentService

Service

public class ThridService extends IntentService {public ThridService() {    super("");    System.out.println("intent Service");}@Overrideprotected void onHandleIntent(Intent intent) {    String flag = intent.getExtras().getString("flag");    if (flag.equals("t1")) {        System.out.println("startServiceT1");    } else if (flag.equals("t2")) {        System.out.println("startServiceT2");    }    try {        Thread.sleep(2000);    } catch (InterruptedException e) {        e.printStackTrace();    }}}

清单文件

<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>    </activity>    <service android:name=".Service.FirstService"/>    <service android:name=".Service.SecondService"/>    <service android:name=".Service.ThridService"/></application>

MainActivity

btn_intent_service = (Button) findViewById(R.id.btn_intent_service);    btn_intent_service.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent it1 = new Intent(getApplicationContext(), ThridService.class);            Bundle b1 = new Bundle();            b1.putString("flag", "t1");            it1.putExtras(b1);            Intent it2 = new Intent(getApplicationContext(), ThridService.class);            Bundle b2 = new Bundle();            b2.putString("flag", "t2");            it2.putExtras(b2);            getApplicationContext().startService(it1);            getApplicationContext().startService(it2);        }    });

这里只是简单的描述怎么启动一个Service,其他复杂的并没有实现。

6、Binder机制

6.1、什么是Binder?

  我们知道,AndroidOS是基于Linux内核的,但是AndroidOS没有采用linux内核提供的各种进程间通信机制(IPC),而是采用Binder机制。Android应用都是运行在独立的进程中,这样确保程序之间不会相互影响,但是,很多情况下,我们开发的程序中的Activity需要与系统Service进行通信,它们肯定不是在同一个进程,AndroidOS为我们提供了实现进程之间通信的方式,Binder就是其中的一种。

  AndroidOS中的Binder机制,是由client、Server、ServiceManager和Binder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。下图是这四个组件的关系:

(ps:这是老罗的图)

6.1.1、Client端

客户端要想访问Binder的远程服务,就必须获取远程服务的Binder对象在binder驱动层对应的mRemote引用。当获取到mRemote对象的引用后,就可以调用相应Binder对象的服务了。

6.1.2、Service端

一个Binder服务器端就是一个Binder类的对象。当创建一个Binder对象后,内部就会开启一个线程,这个线程用于接收binder驱动发送的信息,收到消息后,会执行相关的服务代码。

6.1.3、ServiceManager

Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力

6.1.4、Binder驱动

当服务端成功创建一个Binder对象后,Binder驱动也会相应创建一个mRemote对象,该对象的类型也是Binder类。客户就可以借助这个mRemote对象来访问远程服务。

6.2、使用AIDL实现两个进程的简单通信

使用Android studio实现

在main下新建aidl文件夹,在aidl文件夹中新建和aidl包名相同的包,新建aidl file。 
aidl

// IPerson.aidlpackage com.example.devin.helloservice.aidl;// Declare any non-default types here with import statementsinterface IPerson {  String findPersion(int num);}

在build\generated\source\aidl下可以找到编译生成的Java代码

/* * This file is auto-generated.  DO NOT MODIFY. * Original file: H:\\AndroidStudioIDE\\workspace\\HelloService\\app\\src\\main\\aidl\\com\\example\\devin\\helloservice\\aidl\\IPerson.aidl */package com.example.devin.helloservice.aidl;// Declare any non-default types here with import statementspublic interface IPerson extends android.os.IInterface{/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implements com.example.devin.helloservice.aidl.IPerson{private static final java.lang.String DESCRIPTOR = "com.example.devin.helloservice.aidl.IPerson";/** Construct the stub at attach it to the interface. */public Stub(){this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an com.example.devin.helloservice.aidl.IPerson interface, * generating a proxy if needed. */public static com.example.devin.helloservice.aidl.IPerson asInterface(android.os.IBinder obj){if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof com.example.devin.helloservice.aidl.IPerson))) {return ((com.example.devin.helloservice.aidl.IPerson)iin);}return new com.example.devin.helloservice.aidl.IPerson.Stub.Proxy(obj);}@Override public android.os.IBinder asBinder(){return this;}@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException{switch (code){case INTERFACE_TRANSACTION:{reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_findPersion:{data.enforceInterface(DESCRIPTOR);int _arg0;_arg0 = data.readInt();java.lang.String _result = this.findPersion(_arg0);reply.writeNoException();reply.writeString(_result);return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.example.devin.helloservice.aidl.IPerson{private android.os.IBinder mRemote;Proxy(android.os.IBinder remote){mRemote = remote;}@Override public android.os.IBinder asBinder(){return mRemote;}public java.lang.String getInterfaceDescriptor(){return DESCRIPTOR;}@Override public java.lang.String findPersion(int num) throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(num);mRemote.transact(Stub.TRANSACTION_findPersion, _data, _reply, 0);_reply.readException();_result = _reply.readString();}finally {_reply.recycle();_data.recycle();}return _result;}}static final int TRANSACTION_findPersion = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);}public java.lang.String findPersion(int num) throws android.os.RemoteException;}

自定义一个Service类,继承IPerson.Stub类 就是实现了IPerson接口和IBinder接口

package com.example.devin.helloservice.Service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.support.annotation.Nullable;import com.example.devin.helloservice.aidl.IPerson;/** * Created by Devin on 2016/6/15. */public class AIDLService extends Service {private String[] names = {"张三", "李四", "王五", "赵六", "孙七"};private IBinder mIBinder = new PersionBinder();@Nullable@Overridepublic IBinder onBind(Intent intent) {    return mIBinder;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    System.out.println("start service");    return super.onStartCommand(intent, flags, startId);}private class PersionBinder extends IPerson.Stub {    @Override    public String findPersion(int num) throws RemoteException {        if (num > 0 && num < 6) {            return names[num - 1];        }        return "222";    }}}

在清单文件中注册

<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>    </activity>    <activity android:name=".SecondActivity"/>    <service android:name=".Service.FirstService"/>    <service android:name=".Service.SecondService"/>    <service android:name=".Service.ThridService"/>    <service android:name=".Service.AIDLService"/></application>

在客户端中使用

package com.example.devin.helloservice;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.example.devin.helloservice.Service.AIDLService;import com.example.devin.helloservice.aidl.IPerson;/** * Created by Devin on 2016/6/15. */public class SecondActivity extends AppCompatActivity implements View.OnClickListener {EditText et_num;Button btn_find;TextView tv_name;IPerson mIPerson;PersionConnect mPersionConnect = new PersionConnect();@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_aidl);    et_num = (EditText) findViewById(R.id.et_num);    btn_find = (Button) findViewById(R.id.btn_find);    tv_name = (TextView) findViewById(R.id.tv_name);    Intent intent = new Intent(this, AIDLService.class);    startService(intent);    this.bindService(intent, mPersionConnect, Service.BIND_AUTO_CREATE);    btn_find.setOnClickListener(this);}@Overridepublic void onClick(View v) {    String etNum = et_num.getText().toString().trim();    int num = Integer.valueOf(etNum);    try {        tv_name.setText(mIPerson.findPersion(num));    } catch (RemoteException e) {        e.printStackTrace();    }    et_num.setText("");}private class PersionConnect implements ServiceConnection {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        mIPerson = IPerson.Stub.asInterface(service);    }    @Override    public void onServiceDisconnected(ComponentName name) {        mIPerson = null;    }}}

这样可以完成简单的通信。

深入学习Binder机制,推荐如下大神的博文:

Android进程间通信(IPC)机制Binder简要介绍和学习计划

浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

Android Bander设计与实现 - 设计篇

Android深入浅出之Binder机制

Service精通

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我有卵巢老化怎么办呢 老师骂了我,我该怎么办 我的牙齿很难看怎么办 门牙摔了个缺怎么办 鱼身上鱼鳞烂了怎么办 鱼身上发白烂了怎么办 养的鱼身上烂了怎么办 婴儿被蚊虫咬了怎么办 在野外被蚂蚁咬怎么办 娱乐之太帅了怎么办 鞋舌头歪没有孔怎么办 万一吃了母猪肉怎么办 我的手机丢了怎么办 欠了赌债还不起怎么办 车库门前被堵了怎么办 别人车停我车位怎么办 怎么办能防止锁眼被堵 别人堵着我车了怎么办 马桶被排骨堵了怎么办 马桶被刷子堵了怎么办 屎太大马桶堵了怎么办 大便硬马桶堵了怎么办 马桶让大便堵了怎么办 出了月子奶水少怎么办 木瓜没熟切开了怎么办 小孩被蚊虫叮咬红肿怎么办 下巴歪导致脸歪怎么办 全民k歌有杂音怎么办 录歌换气声很大怎么办 网易云没有的歌怎么办 qq空间给封了怎么办 酒店住最后一间怎么办 妻子起诉离婚丈夫不离怎么办 老婆对我没感情怎么办 老婆要跟我离婚怎么办 眼睛里进了沙子怎么办 耳塞孔进沙子了怎么办 斜挎包链子长了怎么办 爱上大15岁大叔怎么办 老板不给发工资怎么办 4个月婴儿感冒了怎么办