美文网首页
一步一步的写一个简单的AIDL服务接口

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

作者: StoneWay3 | 来源:发表于2020-07-08 18:39 被阅读0次

    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

    相关文章

      网友评论

          本文标题:一步一步的写一个简单的AIDL服务接口

          本文链接:https://www.haomeiwen.com/subject/vgjccktx.html