• Android之——AIDL小结


    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071683
    
    • AIDL (Android Interface Definition Language )
    • AIDL 适用于 进程间通信,而且与Service端多个线程并发的情况。假设仅仅是单个线程 能够使用 Messenger ,假设不须要IPC 能够使用Binder
    • AIDL语法:基础数据类型都能够适用,List Map等有限适用。static field 不适用。
    • AIDL基本使用方法

    1、实现.aidl文件

    接口描写叙述文件
    1、导入的包名
    2、假设有使用Object对象,须要该对象 implement Parcelable 接口,而且须要导入该接口包名+类名。 
    假设是primitive type 不须要这步。
    3、定义方法名称。
    4、全部的.aidl文件已经须要传递的对象接口须要在Service 与Client中各一份
    
    
    package com.aidl;
    import com.aidl.Data;
    interface IaidlData
    {
        int getPid();
        
        String getName();
        
        com.aidl.Data getData();
    }

    2、在Service中实现.aidl 接口。

    实际实现的接口是在 gen中自己主动生成的 IaidlData.java的抽象内部类 Stub

    1、须要在配置文件Androidmanifest.xml文件里声明Service。而且加入intent-filter 节点 的action属性,
       此属性一般能够使用 aidl的包名+文件名称(由于该值在server与client一致)
    2、须要实现IaidlData.aidl文件里定义的接口。

    aidl文件是一个接口描写叙述文件,会在gen中自己主动生成一个同名的IaidlData.java接口文件。该接口文件包括一个抽象类stub,其继承了android.os.Binder、实现IaidlData接口 故,我们实际须要实现的是Stub抽象类。

    public class AidlService extends Service { public void onCreate() { Log.d("aidl", "aidlService--------------onCreate"); } public IBinder onBind(Intent intent) { return mBinder; } private final IaidlData.Stub mBinder = new IaidlData.Stub() { public int getPid() { return Process.myPid(); } public String getName() throws RemoteException { return "go or not go is a problem"; } public Data getData() throws RemoteException { Data data = new Data(); data.id = Process.myPid(); data.name = "go or not go is a problem"; return data; } }; }

    3、绑定Service ,而且获取IaidlService 对象

    1、建立连接,使用Action属性定位须要的Service
       actoin的属性的採用aidl文件的类名+包名(与服务一致),之前须要在服务中设置同样的action属性,否则找不到服务。

    2、获取服务返回的stub对象,mIaidlData = IaidlData.Stub.asInterface(service); package com.clent; import com.aidl.IaidlData; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; public class AidlClientActivity extends Activity { IaidlData mIaidlData; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } protected void onStart() { super.onStart(); Log.d("aidl" , "onstart ----------bindservice-----"+IaidlData.class.getName()); Intent intent = new Intent(IaidlData.class.getName()); bindService(intent, mSecondaryConnection, BIND_AUTO_CREATE); } private ServiceConnection mSecondaryConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { Log.d("aidl", "onServiceConnected----------------"); mIaidlData = IaidlData.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName className) { mIaidlData = null; } }; public void onClick(View view) { System.out.println( " onclick--------------- : "); if(mIaidlData != null) { try { System.out.println( " name : "+mIaidlData.getName()); System.out.println( " id : "+mIaidlData.getPid()); System.out.println( " data : "+mIaidlData.getData().id +" "+mIaidlData.getData().name); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } protected void onDestroy() { super.onDestroy(); unbindService(mSecondaryConnection); } }

    4、假设aidl文件里须要传递Object对象,须要加入相应的.aidl文件

    1、定义该对象Data,并实现Parcelable
    2、加入Data.aidl文件。并採用例如以下方式编写导入Data
    3、须要在引用到Data的.aidl文件里 import com.aidl.Data
    4、须要在服务端和 client都加入 Data.aidl与 Data.java文件 而且须要一致。

    Data.aidl aidl文件: package com.aidl; parcelable Data;

    5、加入 相应的Object类。而且实现Parcelable接口

    public class Data implements Parcelable
    {
        public int id;
        public String name;
    
        public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>()
        {
            public Data createFromParcel(Parcel in)
            {
                return new Data(in);
            }
    
            public Data[] newArray(int size)
            {
                return new Data[size];
            }
        };
    
        public Data()
        {
        }
    
        private Data(Parcel in)
        {
            readFromParcel(in);
        }    
    
        public void readFromParcel(Parcel in)
        {
            id = in.readInt();
            name = in.readString();        
        }
    
        public int describeContents()
        {
            return 0;
        }
    
        public void writeToParcel(Parcel dest, int flags)
        {
            dest.writeInt(id);
            dest.writeString(name);        
        }
    }

  • 相关阅读:
    Mac下pyhon+selenium滚动截长图出现中间一部分页面截取不到问题的原因以及解决方案
    flask 访问上传图片网页出现报错: jinja2.exceptions.TemplateNotFound: /Users/xxx/Documents/python/pack/index.html解决方案
    Mac启动的时候自动执行python脚本
    selenium自动化测试使用xpath定位如下报错(The result of the xpath expression "//span[@class='numrows']/font/text()" is: [object Text]. It should be an element.)解决方案
    python+selenium无头模式访问网站被禁止访问导致元素无法定位获取的问题定位过程以及解决方案
    python+selenium+PIL+glob+numpy实现网页截长图
    安装python中某些模块出现如下错误提示ERROR: Could not find a version that satisfies the requirement glob3 (from versions: none)解决方案
    Mac下设置定时执行python脚本任务踩坑日记
    python的进程池,线程池的使用
    需改commit信息
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7374357.html
Copyright © 2020-2023  润新知