为了账号安全,请及时绑定邮箱和手机立即绑定

android aidl 跨app调用那些事情

2017.12.13 13:02 2342浏览

今天大精和我聊天的时候,就问了aidl 跨app调用怎么写,我当然是一脸懵逼啊,不得不说大精想东西很深入,以下文章将给出答案

放一个成功的图吧:
TIM图片20171208142236.png

1.前提

抛开国产rom谈aidl 跨app调用的文章都是耍流氓,测试机魅族MX5E(16年买的千元机,我是穷逼),android版本5.0,为什么这么说呢,下文代码会有注释。

2.上代码

首先需要一个提供aidl service 的app,我们叫他A app
TIM图片20171208141102.png
(service在manifest配置如上图)
,aidl文件如下

// Declare any non-default types here with import statements
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

            String getMessage();
}

MyService代码如下

public class MyService extends Service {

    public MyService() {
    }
    IMyAidlInterface.Stub stub = new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public String getMessage() throws RemoteException {
            return "调用远端服务成功";
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("AppService", "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (null != intent) {
            Log.e("AppService", "onStartCommand接收到的数据是:" + intent.getStringExtra("data"));
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return  stub;
    }
}

然后需要一个调用A app的aidl服务的B app
TIM图片20171208141705.png
这里注意B app工程需要和A app工程一样的aidl文件
然后如何调用A app的aidl服务呢?看下面的MainActivity代码

public class MainActivity extends AppCompatActivity {

    private IMyAidlInterface iMyAidlInterface;// 定义接口变量
    private ServiceConnection connection;

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

    private void bindRemoteService() {
        //注意:android 5.0之前是可以通过隐式意图打开其他app的服务的,5.0之后只能通过显式意图来打开.
        final Intent intentService = new Intent();
        //ComponentName的参数1:目标app的包名,参数2:目标app的Service完整类名
        intentService.setComponent(new ComponentName("com.example.zhouj.myapplication", "com.example.zhouj.myapplication.MyService"));
        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                // 从连接中获取Stub对象
                iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);
                // 调用Remote Service提供的方法
                try {
                    Toast.makeText(MainActivity.this, "获取到消息:" + iMyAidlInterface.getMessage(), Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                // 断开连接
                iMyAidlInterface = null;
            }
        };
        //魅族手机上 需要先开启提供service的app 同时 service要启动的时候远程调用aidl才能收到消息
        startService(intentService);
        bindService(intentService, connection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (connection != null)
            unbindService(connection);// 解除绑定
    }
}

这里要注意几个问题

  1. android 5.0之前是可以通过隐式意图打开其他app的服务的,5.0之后只能通过显式意图来打开.

2.魅族手机上 需要先开启提供service的app也就是说要先启动A app 同时 A app的service也要启动,才能让B app用A app aidl服务才能收到消息。

点击查看更多内容

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 分销返利 帮助中心 APP下载
官方微信

举报

0/150
提交
取消