Android Service AIDL 简单使用

aidl是为了让服务实现进程间通信的,使用方法跟boundService差不多,是boundService的延伸。

1.新建一个文件,以.aidl结尾,比如说IMyRemoteService.aidl,因为这个文件其实是个接口,所以命名的时候以I开头比较好。

2.然后写一些代码

package com.hyw.test;
interface IMyRemoteService{
    void show();
}

包名就是该文件所在的地方,然后接口名要跟文件名一样,最后我随便定义了一个方法。

3.编译一下在gen目录下就会生成一个文件,叫IMyRemoteService.java。这样接口就算搞好了。

4.然后我们像往常搞boundService一样创建一个Service,在里面弄个MyBinder内部类通过onBind方法返回给客户端,但是在这个地方有点不一样哦。MyBinder继承的不再是Binder而是刚才弄的接口,先看代码。

package com.hyw.test;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class MyRemoteService extends Service {


    class MyBinder extends IMyRemoteService.Stub{

        @Override
        public void show() throws RemoteException {

        }

    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

}

这个IMyRemoteService.Stub是哪来的呢?就是在gen目录下生成的IMyRemoteService.java文件里的,stub是里面的一个内部抽象类。在show方法里你就可以做一些你想做的事了,在里面执行的东西不在主线程,通过打印发现是叫Binder_2什么的线程,因为这里的执行是在另一个进程的。

5.再然后我们。。。。。,等等,别忘了注册服务,注册时候也有点不同,因为会有另外一个进程启动这个服务,所以要添加过滤器,action。

<service android:name="com.hyw.test.MyRemoteService">
            <intent-filter >
                <action android:name="com.hyw.test.MyRemoteService"/>
            </intent-filter>
        </service>

action名字随意了

6.最后,我们再创建一个项目,然后把那个aidl文件还有他的结构复制到新创建的这个项目里,也就是aidl之前是在com.hyw.test这个目录下,那么复制到新项目里也应该是在这个地方。

7.最后的最后,我们创建一个ServiceConnection回调,在绑定服务时获得binder,注意,这时候又有不同了,不能强转了,因为在这个项目里根本没那个类,这么办呢,还记得复制过来的aidl吗,同样编译之后在gen里也会出现那个java文件,我们通过stub内部类里的asInterface方法来获得MyBinder,注意看asInterface方法的参数是不是一个IBinder,没错,就是这样

private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            IMyRemoteService binder = IMyRemoteService.Stub.asInterface(service);
            try {
                binder.show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

最后最后。。。。。。。.。。。。。。。。。。

Intent intent = new Intent("com.hyw.test.MyRemoteService");
            bindService(intent, connection, BIND_AUTO_CREATE);

game over! 隐式启动哦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值