AIDL
一.AIDL简介
AIDL,全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)。安卓中的服务分为2类:本地服务(网络下载大文件,音乐播放器,后台初始化数据库的操作);远程服务(远程调用支付宝进程的服务。。)
二.AIDL的使用
假设有如下场景,需要计算a+b的值,在客户端中获取a和b的值,然后传递给服务端,服务端进行a+b的计算,并将计算结果返回给客户端。
这里的客户端和服务端均是指安卓设备中的应用,由于每一个应用对应一个进程,由此可以模拟安卓系统中通过AIDL进行进程之间的通信。
三 .使用步骤
服务端moudle:aidl_server
(1)将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl
(4)在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量。最终代码如下:
package com.example.day17_aidl_service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class My_Service extends Service {
IBinder binder = new IMyAidlInterface.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
return num1+num2;
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
(5)清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报
java.lang.SecurityException: Not allowed to bind to service Intent 异常。
<service android:name=".My_Service" android:exported="true">
<intent-filter>
<action android:name="com.xxs.1602"></action>
</intent-filter>
</service>
客户端moudle:aidl_client
package com.example.day17_aidl_client;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.example.day17_aidl_service.IMyAidlInterface;
public class MainActivity extends AppCompatActivity {
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
final IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
int add = iMyAidlInterface.add(9, 8);
Toast.makeText(MainActivity.this, ""+add, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.xxs.1602");
intent.setPackage("com.example.day17_aidl_service");
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
}
Messager
一.Messager介绍
Messager,故名思义信使的意思,能够完成跨进程通信。
二.Messager的原理
Messager的2个构造方法:分别以handler和Ibinder为参数
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。
特点:
客户端和服务端发送的都是message
使用handler接受消息(客户端和服务端都是)
不需要编写aidl文件
三 .使用步骤
服务端moudle:messager_server
package com.example.day17_messager_service;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.*;
import android.widget.Toast;
public class My_Message_Service extends Service {
@SuppressLint("HandlerLeak")
Messenger messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
String name = data.getString("name");
String hobby = data.getString("hobby");
Toast.makeText(My_Message_Service.this, "姓名:"+name+"爱好:"+hobby, Toast.LENGTH_SHORT).show();
Messenger replyTo = msg.replyTo;
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("name","张金伟");
bundle.putString("hobby","成为一个木头");
message.setData(bundle);
try {
replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
package com.example.day17_messager_client;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.*;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@SuppressLint("HandlerLeak")
Messenger my_messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
String name = data.getString("name");
String hobby = data.getString("hobby");
Toast.makeText(MainActivity.this, "姓名:"+name+"爱好:"+hobby, Toast.LENGTH_SHORT).show();
}
});
Messenger messenger;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("name","王震");
bundle.putString("hobby","成为一个像旭哥一样的程序猿");
message.setData(bundle);
message.replyTo = my_messenger;
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent();
intent.setAction("com.bawei.1602");
intent.setPackage("com.example.day17_messager_service");
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
}