一步一步的写一个简单的AIDL服务接口

2020-07-08  本文已影响0人  StoneWay3

1.项目中新建一个自定义的服务类继承系统服务,并且实现onbind方法

public class AidlDemoService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

2.在manifest中注册该服务

        <service
          android:name=".AidlDemoService"
            android:process=":aidldemo">

            <intent-filter>
                <action android:name="action.com.stone.aidldemo.AidlDemoService" />
            </intent-filter>

        </service>

3.新建aidl文件,名字我们叫它IAidlService.aidl

注意:文件必须建立在main下面跟java同级,并且跟服务的包名一直,否则的话编译不出来接口;

新建aidl文件.png

文件中引入服务的包名(跟其他的java类的包名引入方式相同)

引入服务包名.png

4.编辑aidl文件,并且定义好我们的接口

注意:文件里面的注释最好不要有中文,否则的话可能编译不出来接口;

编辑aidl.png

5.build -> make project

等到项目编译结束以后,在服务中如果能够找到IAidlService这个类,那么说明已经成功编译出来了

6.编译成功以后,在服务中心实现我们的接口

声明接口.png

7.服务的oncreat方法中可以进行一些初始化

   @Override
    public void onCreate() {
        super.onCreate();
        //todo:初始化一些东西
    }

8.在服务的onbind中返回我们的接口

 @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }

9.可以在接口中写一些我们想要的功能和方法了

  private IAidlService.Stub stub = new IAidlService.Stub() {
        @Override
        public int getIntCount() throws RemoteException {
            return intCount;
        }

        @Override
        public void getVoidMethod() throws RemoteException {
            Toast.makeText(AidlDemoService.this, "调用这个void方法了" + voidCount + "次", Toast.LENGTH_LONG).show();
            voidCount+=1;
        }

        @Override
        public void setParas(int count) throws RemoteException {
            intCount += count;
            Toast.makeText(AidlDemoService.this, "参数已经接收", Toast.LENGTH_LONG).show();
        }

        @Override
        public String getStringData() throws RemoteException {
            return "调用的void字符串";
        }

        @Override
        public String getStringByString(String str) throws RemoteException {
            return "哈哈你传过来的参数是:"+str;
        }
    };

10.启动服务

启动服务.png

11.服务连接

服务连接.png

12.服务内方法的使用:

方法调用.png

13.服务解绑

服务解绑.png

.......................................................................................................

************************************服务传递对象 ****************************************

以上说的是服务传递简单的数据类型,比如说int,string,long,double等,有时候需要传递对象,那么就要在做一些工作了。

1新建需要传递的bean对象。比如UserInfoBean.

2.设置好我们需要的参数,实现get和set方法,并且序列化(Parcelable)

3.跟服务一样在同样的报名目录下新建一个aidl文件UserInfoBean.aidl,这里为了再次强调包名一致,所以我们将bean类信件了一个包

bean对象的项目结构.png

4.将UserInfoBean的包名复制到UserInfoBean.aidl文件中,并且声明一下:parcelable UserInfoBean;

bean.png

5.在IAidlService.aidl中引入UserInfoBean:

import com.stone.aidldemo.bean.UserInfoBean;

并且创建相应的方法:

import com.stone.aidldemo.bean.UserInfoBean;

6.build->make project

AidlDemoService中实现接口方法,就可以了

至此,aidl基本的用法和不走已经差不多了,当然还有很多需要优化和改善的地方,希望各位看官不吝赐教,最后祝大家事业有成。

最后写了一个粗糙简单的demo,github

上一篇下一篇

猜你喜欢

热点阅读