Android AIDL 使用 2 --在android studio中实现AIDL

来源:互联网 发布:人工智能读后感 编辑:程序博客网 时间:2024/04/29 04:32

android studio中实现AIDL过程

首先我们要明白aidl的作用是什么?比如说我们提供了一个服务,当别的程序(可以看成是一个其他的进程)要来使用我们提供的服务的时候,这个时候就需要用到aidl来进行通信.至于实现的原理度娘里面有大量的文章可以参考,并不是本文重点,所以不做赘述.


· 1.创建两个应用

  • ServiceApplication 服务端应用【服务进程】
  • TestClientApplication 客户端应用 【访问使用进程】

· 2.ServiceApplication端

  • 2.1 在Main目录下创建AIDL文件,android studio可以自动创建。


    这里写图片描述


  • 2.2 生成的AIDL文件目录是和Java目录同级,并且包名必须和Manifest中的包名一致


    • AIDL文件结构
      包名
    • manifest.xml
      这里写图片描述

  • 2.3 配置AIDL文件

    • IMusicPlayerService.aidl
          // IMusicPlayerService.aidlpackage com.xiaochi.mutiplemediaplayer;// Declare any non-default types here with import statementsinterface IMusicPlayerService {    /**     * 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);    int caculate(int a,int b);}
  • 2.4 rebuild project 生成Java文件

  • 2.5 创建一个对外公开的Service,返回生成的AIDL对象,这里只是大概过程,详细过程和实现后续会说明

    • 自定义服务的实现MusicPlayerService ,可以定制需要的功能

                  package com.xiaochi.mutiplemediaplayer.services;    import android.app.Service;    import android.content.Intent;    import android.os.IBinder;    import android.os.RemoteException;    import android.support.annotation.Nullable;    import android.util.Log;    import com.xiaochi.mutiplemediaplayer.IMusicPlayerService;    /**     * Created by Administrator on 2016/12/10.     */    public class MusicPlayerService extends Service {        @Nullable        @Override        public IBinder onBind(Intent intent) {            return mMusicBinder;        }        @Override        public void onCreate() {            super.onCreate();            Log.i("kxx", "create aidl service ");        }        @Override        public int onStartCommand(Intent intent, int flags, int startId) {            Log.i("kxx", "onstartcommand");            return super.onStartCommand(intent, flags, startId);        }        IMusicPlayerService.Stub mMusicBinder = new IMusicPlayerService.Stub() {            @Override            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {            }            @Override            public int caculate(int a, int b) throws RemoteException {                return a + b;            }        };    }
    • 在Manifest中定义Service组件和启动Action

           <!--AIDL  service-->        <service            android:name=".services.MusicPlayerService"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="com.xiaochi.mutiplemediaplayer.MusicPlayerService" />            </intent-filter>        </service>

· TestClientApplication 客户端使用

  • 将服务端的AIDL目录全部copy到客户端上,也是在Main目录下,不需要更改任何东西
  • 然后rebuild project项目
  • 在客户端进行服务绑定

        public class MainActivity extends AppCompatActivity {    public IMusicPlayerService iMusicPlayerService;        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);            ServiceConnection connection = new ServiceConnection() {                @Override                public void onServiceConnected(ComponentName name, IBinder service) {                    iMusicPlayerService = IMusicPlayerService.Stub.asInterface(service);                    try {                        int sum = iMusicPlayerService.caculate(10, 20);                        Toast.makeText(MainActivity.this, "  sum = " + sum, Toast.LENGTH_SHORT).show();                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }                @Override                public void onServiceDisconnected(ComponentName name) {                    iMusicPlayerService = null;                }            };            Intent intent = new Intent();            intent.setAction("com.xiaochi.mutiplemediaplayer.MusicPlayerService");            intent.setPackage("com.xiaochi.mutiplemediaplayer");            bindService(intent, connection, Service.BIND_AUTO_CREATE);        }   }

NOTE: 使用隐式开启服务的时候在5.0及以上版本默认是不能直接通过action开启的,使用意图的时候加上setPackage就可以解决.

0 0
原创粉丝点击