AIDL深入学习

简介:

以下两种方式都是基于bindService启动服务。

1)一种简单的实现跨进程的方式(Binder,Messenger)

http://www.open-open.com/lib/view/open1469493830770.html

使用Messenger的好处就是如果有多个请求,不会冲突,会将请求放入请求队列中一个一个执行任务。

 首先要明确哪个是客户端,哪个是服务端。
 Service是声明在服务端工程里的,因为要被客户端工程调用到,所以是隐式声明的:
 `  <service  android:name=".aidl.MessengerServiceDemo" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="com.lypeer.messenger"></action>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </service>

    <activity android:name=".aidl.ActivityMessenger"/>`

服务端工程安装好后,开启客户端工程,绑定服务端声明的服务。(服务端服务不一定要事先开启了,声明了即可。)
注意: 客户端工程隐式调用服务端开启的那个service,传给intent的包名是服务端的包名,并非自己的包名。

`public class MainActivity extends AppCompatActivity {

static final int MSG_SAY_HELLO = 1;

Messenger mService = null;
boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        //接收onBind()传回来的IBinder,并用它构造Messenger
        mService = new Messenger(service);
        mBound = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        mBound = false;
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.sample_text).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sayHello(view);
        }
    });
}

//调用此方法时会发送信息给服务端
public void sayHello(View v) {
    if (!mBound) return;
    //发送一条信息给服务端
    Message msg = Message.obtain(null, MSG_SAY_HELLO, 1, 2);
    try {
        mService.send(msg);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

@Override
protected void onStart() {
    super.onStart();
    //绑定服务端的服务,此处的action是service在Manifests文件里面声明的
    Intent intent = new Intent();
    intent.setAction("com.lypeer.messenger");
    //不要忘记了包名,不写会报错
    intent.setPackage("com.example.lianxiang.cmakedemo1");
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}

}`
这样,在客户端就可以操作,实现与服务端工程的一个交互。

Messenger实现的进程间的交互,只是信息的传递,客户端无法直接调用服务端的方法,所以AIDL就是解决的这个问题。

2)AIDL
http://www.open-open.com/lib/view/open1469493649028.html (上)
按照博主所说的,结果能实现。
2-1)新建aidl文件,注意新建的规则。
2-2)注意aidl及java类的目录的问题,并且保证服务端与客户端都存在aidl与java文件。
2-3)服务端声明service,service里调用aidl自动生成的java类。
2-4)客户端绑定服务端的service,调用aidl转化的类。



      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/2065985,如需转载请自行联系原作者







相关文章
|
7月前
AIDL原理
AIDL原理
34 0
|
7月前
|
Android开发
AIDL的使用
AIDL的使用
48 0
|
7月前
AIDL中的in,out,inout
AIDL中的in,out,inout
53 0
|
7月前
|
Java C++
AIDL与HIDL核心概念
AIDL与HIDL核心概念
178 0
|
7月前
|
Java 开发工具 Android开发
[Android AIDL] --- AIDL原理简析
[Android AIDL] --- AIDL原理简析
110 0
|
7月前
|
Java Android开发
[Android AIDL] --- AIDL工程搭建
[Android AIDL] --- AIDL工程搭建
73 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
159 0
|
Java 网络协议 安全
彻底弄懂binder与aidl
aidl与binder机制 为什么需要binder 没有用到binder之前,我们每个app生活在分配给自己的虚拟机和内存空间中,这样保证了app应用的安全,到很多时候我们需要用到跨进程通信(IPC),这时binder就为此而生。
2293 0