最近写了一个demo 写了两个app 达成进程间通讯 代码如下:
Intent intent=new Intent();
intent.setAction("com.cly.aidlservers.ContentService");
intent.setPackage("com.cly.aidlservers");
boolean bb= bindService(intent,serviceConnection, Context
.BIND_AUTO_CREATE); //其他手机都可以正常调用 唯独魅族手机不可以 真坑啊
解决方法:
intent = new Intent();
ComponentName cn = new ComponentName("com.cly.aidlservers", "com.cly.aidlservers.MyService");
intent.setAction("com.cly.aidlservers.ContentService");
intent.setComponent(cn);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(intent);//这里必须要先startServer然后在bindService不知道魅族在搞什么鬼
bindService(intent, new ImServer(), Context.BIND_AUTO_CREATE); //绑定远程服务
}
});
下面来写一个完整的aidl
客户端代码
第一把服务端的aidl代码拷贝到客户端包名必须一致
之后开始撸代码了
intent = new Intent();
ComponentName cn = new ComponentName("com.cly.aidlservers", "com.cly.aidlservers.MyService");
intent.setAction("com.cly.aidlservers.ContentService");
intent.setComponent(cn);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(intent);
bindService(intent, new ImServer(), Context.BIND_AUTO_CREATE); //绑定远程服务
}
});
bt_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if(iMyAidlInterface!=null) {
Toast.makeText(MainActivity.this, "" + iMyAidlInterface.getName("ss"), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "服务没有开启", Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
/**
* 连接服务
*/
public class ImServer implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder); //返回服务里面的binder对象
Toast.makeText(MainActivity.this, "绑定成功!", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e("","");
}
}
aidl代码
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
String getName(String name);
}
服务端代码
public class MyService extends Service {
public MyService() {
}
public IMyAidlInterface.Stub iMyAidlInterface = new IMyAidlInterface.Stub()
{
@Override
public String getName(String name) throws RemoteException {
return "aaaaaaaaa";
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return iMyAidlInterface; //返回给客户端来调用服务端的方法
}
}
清单文件注册服务