最近写了一个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; //返回给客户端来调用服务端的方法 } }
清单文件注册服务
<service android:name="com.cly.aidlservers.MyService" android:process=":remote"> <intent-filter> <action android:name="com.cly.aidlservers.ContentService" /> </intent-filter> </service>