aidl中魅族无法绑定的坑

最近写了一个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>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 创建AIDL文件 在项目的src目录下创建一个aidl文件夹,然后在aidl文件夹创建一个接口文件,命名为MyInterface.aidl。在该文件定义需要绑定的接口方法。 ``` interface MyInterface { void sendMessage(String message); } ``` 2. 实现AIDL接口 在app模块创建一个服务类MyService,该服务类需要继承自Service并且实现MyInterface接口。 ``` public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return new MyBinder(); } private class MyBinder extends MyInterface.Stub { @Override public void sendMessage(String message) throws RemoteException { // 实现需要绑定的接口方法 } } } ``` 3. 在AndroidManifest.xml注册服务 在AndroidManifest.xml文件注册MyService服务。 ``` <service android:name=".MyService" /> ``` 4. 在Activity绑定服务并调用接口方法 在Activity绑定MyService服务,并且在按钮点击事件调用MyInterface接口方法。 ``` public class MainActivity extends AppCompatActivity { private MyInterface myInterface; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定MyService服务 Intent intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { // 获取MyInterface接口实例 myInterface = MyInterface.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { myInterface = null; } }; public void sendMessage(View view) { // 调用MyInterface接口方法 try { myInterface.sendMessage("Hello World"); } catch (RemoteException e) { e.printStackTrace(); } } } ``` 5. 给按钮添加点击事件 在布局文件给按钮添加点击事件,绑定到sendMessage方法。 ``` <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send Message" android:onClick="sendMessage" /> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值