Android用AIDL创建Service

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hujinglovekmg/article/details/51692186

官网任玉刚大神

接下来是我的实践

Server服务端创建

定义一个简单aidl接口

在工程上右键新建AIDL文件,填写文件名,比如我的就是IMyAidlInterface,里面有一个自动生成的函数是展示一些你可以在AIDL中使用的一些类型值。添加一个add函数如下。
  AIDL接口

接下来Rebuild工程,你就会发现app/build/gnerated/source/aidl/下会有系统为你创建的对应接口的java接口文件。它继承自IInterface,含有我们创建的add方法。并含有一个实现了IMyAidlInterface的静态内部类stub.如下。

关于stub的一些介绍:
asInterface:将一个IBinder对象转换成IMyAidlInterface接口。如果在同一进程则返回的是本地Binder,否则返回的是Binder代理对象。如果对Binder有疑惑可以看下此篇文章http://weishu.me/2016/01/12/binder-index-for-newer/

onTransact : 会发现刚才创建的add函数自带的basicType函数均在里面。进行数据的序列化传输,传给Binder驱动,驱动完成后在序列化读取。

Proxy:当service和client位于不同的进程时,调用asInterface返回的就是此代理对象。
    sdk生成接口java文件
IMyAidlInterface.java代码就不贴了

创建Service

创建自己的service继承自Service你可以手动创建也可以直接在工程右键创建.记得配置AndroidManifest.

注意:你需要在OnBind()函数里返回一个IMyAidlInterface.Stub对象的子类,即首先你需要创建自己的Stub子类并实现add方法,如下我只是简单相加。返回的子类将在ServiceConnection对象中获得下面会讲到。

public class MyAidlService extends Service {
    private MyAidlBinder myAidlBinder;

    public class MyAidlBinder extends IMyAidlInterface.Stub{
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public int add(int a, int b) throws RemoteException {
            return a+b;
        }
    }

    public MyAidlService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myAidlBinder = new MyAidlBinder();
    }

    //onBind返回的IBinder对象要是IMyAidlService.Stub的子类的实例
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return  myAidlBinder;
    }
}

创建Acticity

让服务端可以启动。简单配置显示”Serve”(添加一个TextView即可).

Client客户端创建

添加AIDL

首先将服务端的Aidl文件服务过来,注意Aidl文件包名必须相同,如下所示。
客户端田间AIDL文件

创建Activity

  1. 创建ServiceConnection对象实现onServiceConnected方法获取OnBind方法传递过来的Service,并调用IMyAidlInterface.Stub.asInterface(service)方法转换为IMyAidlInterface接口。
  2. 调用add方法获取值,并展示。
public class MainActivity extends AppCompatActivity {
    public static String TAG="MainActivity:";
    private IMyAidlInterface myAidlServive;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myAidlServive = IMyAidlInterface.Stub.asInterface(service);
            if(myAidlServive ==null) System.out.println(TAG+"myAidlServive==null");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myAidlServive = null;
        }
    };

    //wight
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.bt);
        textView = (TextView)findViewById(R.id.tv);

        //创建所需要绑定的Service的Intent
        Intent intent = new Intent();
        intent.setAction("com.example.chenfeng.binderstudy.AIDL_SERVICE");
        intent.setPackage("com.example.chenfeng.binderstudy");
        //绑定远程服务
        bindService(intent,connection, Service.BIND_AUTO_CREATE);

        //点击进行Binder通信,获取值
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    button.setText(String.valueOf(myAidlServive.add(5,3)));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.unbindService(connection);
    }
}

效果图:
效果图
附件:源代码

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页