欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

androidaidl,Android aidl校驗(yàn)

Android:AIDL進(jìn)程間通信基本框架

在某些業(yè)務(wù)場景下,我們需要在應(yīng)用中單獨(dú)開啟一個(gè)進(jìn)程進(jìn)行一些操作。比如性能監(jiān)控,如果讓原始業(yè)務(wù)和性能監(jiān)控本身的業(yè)務(wù)跑在同一個(gè)進(jìn)程下,那么就會導(dǎo)致性能統(tǒng)計(jì)的數(shù)據(jù)的失真。

“真誠服務(wù),讓網(wǎng)絡(luò)創(chuàng)造價(jià)值”是我們的服務(wù)理念,創(chuàng)新互聯(lián)公司團(tuán)隊(duì)10多年如一日始終堅(jiān)持在網(wǎng)站建設(shè)領(lǐng)域,為客戶提供優(yōu)質(zhì)服。不管你處于什么行業(yè),助你輕松跨入“互聯(lián)網(wǎng)+”時(shí)代,PC網(wǎng)站+手機(jī)網(wǎng)站+公眾號+小程序制作

而進(jìn)程間通信,一般采用AIDL機(jī)制的客戶端與服務(wù)端通信。

AIDL只能傳遞如下幾類數(shù)據(jù):

當(dāng)傳遞自定義 Parcelable 時(shí),有三處地方需要注意:

當(dāng)傳遞其他 aidl 接口時(shí),同樣必須要 import 這個(gè) aidl 文件

編寫完 aidl 文件后,make一下工程,會在 build 下的 generated 下的 source 下的 aidl 目錄生成對應(yīng)的接口類文件。aidl 接口其實(shí)就是 API 接口,通過實(shí)現(xiàn)對應(yīng)接口類的 Stub 子類來實(shí)現(xiàn)具體的 API 邏輯;通過對應(yīng)接口類的 Stub 子類的 asInterface 方法得到具體的實(shí)現(xiàn)類,調(diào)用具體的 API 方法。

一個(gè)基本的客戶端服務(wù)端的通信結(jié)構(gòu)一般包括如下功能

客戶端的功能

服務(wù)端的功能

客戶端的相關(guān)功能實(shí)現(xiàn)比較簡單,麻煩的是服務(wù)端的功能。因?yàn)?AIDL 接口定義的都是服務(wù)端的接口,是由客戶端來調(diào)用的。而想要實(shí)現(xiàn)服務(wù)端反向調(diào)用客戶端則需要通過其他手段實(shí)現(xiàn)。

想要實(shí)現(xiàn)服務(wù)端主動連接客戶端,最好的辦法就是 服務(wù)端發(fā)送廣播,客戶端收到廣播后再主動連接服務(wù)端 ,通過這種方式變相地實(shí)現(xiàn)服務(wù)端主動連接客戶端的功能

想要實(shí)現(xiàn)服務(wù)端主動斷開客戶端,除了上面 發(fā)送廣播是一種實(shí)現(xiàn)方式外,還可以通過 android 的系統(tǒng)API RemoteCallbackList,用包名作為key值來注冊遠(yuǎn)程回調(diào)接口的方式,讓服務(wù)端持有客戶端的回調(diào)接口,服務(wù)端調(diào)用回調(diào)接口,客戶端在回調(diào)接口中實(shí)現(xiàn)主動斷開服務(wù)端 ,通過這種方式變量地實(shí)現(xiàn)服務(wù)端主動斷開客戶端的功能。而采用后者會顯得更加優(yōu)雅

既然所有的操作歸根結(jié)底都是由客戶端來完成的,那么客戶端必須得有如下的功能模塊:

服務(wù)端必須得有的功能模塊:

那么,整體的通信流程就是如下的步驟:

首先是通信的 aidl 接口定義

然后是客戶端的連接操作與斷開連接操作,包括廣播接收者的注冊以及回調(diào)接口的實(shí)現(xiàn)

然后是客戶端的拉取數(shù)據(jù)和推送數(shù)據(jù)操作

接著是服務(wù)端的 iBinder 接口的實(shí)現(xiàn),完成回調(diào)接口的注冊、業(yè)務(wù)子線程的開啟和關(guān)閉、數(shù)據(jù)的推送和數(shù)據(jù)的拉取操作

然后是服務(wù)端的主動連接和主動斷開連接操作

最后是服務(wù)端的 onUnbind 方法的實(shí)現(xiàn),對回調(diào)接口進(jìn)行反注冊

服務(wù)端模仿 FloatViewPlugin 自定義插件,實(shí)現(xiàn) IServicePlugin 接口,定制個(gè)性化的懸浮窗插件

客戶端在 Appliaction 的 onCreate方法中初始化

在 MainActivity 上實(shí)現(xiàn)連接、斷開、數(shù)據(jù)通信

android進(jìn)階-AIDL之接口注冊/解注冊

AIDL-基本使用

AIDL-自定義數(shù)據(jù)類型

AIDL-修飾符in,out,inout

AIDL-重連方法

AIDL-接口注冊/解注冊

AIDL-連接池

為什么要特意講解一下接口的注冊與取消注冊呢,因?yàn)樵谑褂肁IDL進(jìn)程跨進(jìn)程通信的時(shí)候, 每次傳遞的接口對象在內(nèi)存中的地址都是不一樣的 ,所以在注冊了之后,無法使用常規(guī)的方式去取消, 因?yàn)樽院徒庾詡鬟f的接口地址都不一樣 ,系統(tǒng)無法識別

由于上面的問題,AIDL中提供了一個(gè)專門解決上述情況的類 RemoteCallbackList ,其工作原理就是:

首先,在前面講解 AIDL的基本使用 的基礎(chǔ)上先增加新的AIDL接口以及注冊和解注冊方法:

然后就是 RemoteCallbackList 的使用方法了:

注冊/解注冊很簡單

接著是使用接口的方式:

ps: 需要注意的是 beginBroadcast() 方法和 finishBroadcast() 方法 必須配合使用 ,哪怕只是簡單的獲取集合大小

使用AIDL進(jìn)行跨進(jìn)程間通信中,往往我們是需要注冊監(jiān)聽,讓服務(wù)端通知的,但是服務(wù)端也必須提供解注冊的方法,不然客戶端如果離開某個(gè)界面不想再接受消息了,雖然直接離開不做處理客戶端這邊不會出錯(cuò),但是服務(wù)端那邊的監(jiān)聽集合還存在之前的,那么就會浪費(fèi)系統(tǒng)資源,所以有注冊監(jiān)聽的時(shí)候,最好也要實(shí)現(xiàn)解注冊的方法

《Android開發(fā)藝術(shù)探索》

android之AIDL介紹

AIDL是一個(gè)縮寫,全稱是Android Interface Definition Language,也就是Android接口定義語言。

可以看出,AIDL是一種語言。

設(shè)計(jì)AIDL這門語言的目的是為了實(shí)現(xiàn)進(jìn)程間通信,尤其是在涉及多進(jìn)程并發(fā)情況下的進(jìn)程間通信。

每一個(gè)進(jìn)程都有自己的Dalvik VM實(shí)例,都有自己的一塊獨(dú)立的內(nèi)存,都在自己的內(nèi)存上存儲自己的數(shù)據(jù),執(zhí)行著自己的操作,都在自己的那片狹小的空間里過完自己的一生。

每個(gè)進(jìn)程之間都你不知我,我不知你,就像是隔江相望的兩座小島一樣,都在同一個(gè)世界里,但又各自有著自己的世界。

而AIDL,就是兩座小島之間溝通的橋梁。

我們可以通過AIDL來制定一些規(guī)則,規(guī)定它們能進(jìn)行哪些交流——比如,它們可以在我們制定的規(guī)則下傳輸一些特定規(guī)格的數(shù)據(jù)。

通過這門語言,可以愉快的在一個(gè)進(jìn)程訪問另一個(gè)進(jìn)程的數(shù)據(jù),甚至調(diào)用它的一些方法,當(dāng)然,只能是特定的方法。

默認(rèn)支持的數(shù)據(jù)類型包括:

AIDL實(shí)例文件:

android怎么寫aidl文件

建立AIDL服務(wù)要比建立普通的服務(wù)復(fù)雜一些,具體步驟如下:

(1)在Eclipse Android工程的Java包目錄中建立一個(gè)擴(kuò)展名為aidl的文件。該文件的語法類似于Java代碼,但會稍有不同。詳細(xì)介紹見實(shí)例52的內(nèi)容。

(2)如果aidl文件的內(nèi)容是正確的,ADT會自動生成一個(gè)Java接口文件(*.java)。

(3)建立一個(gè)服務(wù)類(Service的子類)。

(4)實(shí)現(xiàn)由aidl文件生成的Java接口。

(5)在AndroidManifest.xml文件中配置AIDL服務(wù),尤其要注意的是,action標(biāo)簽中android:name的屬性值就是客戶端要引用該服務(wù)的ID,也就是Intent類的參數(shù)值。

建立AIDL服務(wù)

本例中將建立一個(gè)簡單的AIDL服務(wù)。這個(gè)AIDL服務(wù)只有一個(gè)getValue方法,該方法返回一個(gè)String類型的值。在安裝完服務(wù)后,會在客戶端調(diào)用這個(gè)getValue方法,并將返回值在TextView組件中輸出。建立這個(gè)AIDL服務(wù)的步驟如下:

(1)建立一個(gè)aidl文件。在Java包目錄中建立一個(gè)IMyService.aidl文件。IMyService.aidl文件的位置如圖

IMyService.aidl文件的內(nèi)容如下:

Java代碼:

package eoe.demo;

interface IMyService {

String getValue();

}

IMyService.aidl文件的內(nèi)容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務(wù)不支持的數(shù)據(jù)類型(例如,InputStream、OutputStream)等內(nèi)容。

(2)如果IMyService.aidl文件中的內(nèi)容輸入正確,ADT會自動生成一個(gè)IMyService.java文件。讀者一般并不需要關(guān)心這個(gè)文件的具體內(nèi)容,也不需要維護(hù)這個(gè)文件。關(guān)于該文件的具體內(nèi)容,讀者可以查看本節(jié)提供的源代碼。

(3)編寫一個(gè)MyService類。MyService是Service的子類,在MyService類中定義了一個(gè)內(nèi)嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:

Java代碼:

package eoe.demo;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

public class MyService extends Service {

public class MyServiceImpl extends IMyService.Stub {

@Override

public String getValue() throws RemoteException {

return "Android/OPhone開發(fā)講義";

}

}

@Override

public IBinder onBind(Intent intent) {

return new MyServiceImpl();

}

}

在編寫上面代碼時(shí)要注意如下兩點(diǎn):

IMyService.Stub是根據(jù)IMyService.aidl文件自動生成的,一般并不需要管這個(gè)類的內(nèi)容,只需要編寫一個(gè)繼承于IMyService.Stub類的子類(MyServiceImpl類)即可。

onBind方法必須返回MyServiceImpl類的對象實(shí)例,否則客戶端無法獲得服務(wù)對象。

(4)在AndroidManifest.xml文件中配置MyService類,代碼如下:

Java代碼:

service android:name=".MyService"

intent-filter

action android:name="net.blogjava.mobile.aidl.IMyService" /

/intent-filter

/service

下面來編寫客戶端的調(diào)用代碼。首先新建一個(gè)Eclipse Android工程(ch08_aidlclient),并將自動生成的IMyService.java文件連同包目錄一起復(fù)制到ch08_aidlclient工程的src目錄中,如圖所示。

調(diào)用AIDL服務(wù)首先要綁定服務(wù),然后才能獲得服務(wù)對象,代碼如下:

Java代碼:

package net.blogjava.mobile;

import net.blogjava.mobile.aidl.IMyService;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle; import android.os.IBinder;

import android.view.View; import android.view.View.OnClickListener;

import android.widget.Button; import android.widget.TextView;

public class Main extends Activity implements OnClickListener {

private IMyService myService = null;

private Button btnInvokeAIDLService;

private Button btnBindAIDLService;

private TextView textView;

private ServiceConnection serviceConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

// 獲得服務(wù)對象

myService = IMyService.Stub.asInterface(service);

btnInvokeAIDLService.setEnabled(true);

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

};

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.btnBindAIDLService:

// 綁定AIDL服務(wù)

bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);

break;

case R.id.btnInvokeAIDLService:

try {

textView.setText(myService.getValue());

// 調(diào)用服務(wù)端的getValue方法

} catch (Exception e) {

}

break;

}

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);

btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false);

textView = (TextView) findViewById(R.id.textview);

btnInvokeAIDLService.setOnClickListener(this);

btnBindAIDLService.setOnClickListener(this);

}。

android開發(fā)aidl何時(shí)使用

1.什么是aidl:aidl是 Android Interface definition language的縮寫,一看就明白,它是一種android內(nèi)部進(jìn)程通信接口的描述語言,通過它我們可以定義進(jìn)程間的通信接口

icp:interprocess communication :內(nèi)部進(jìn)程通信

2.既然aidl可以定義并實(shí)現(xiàn)進(jìn)程通信,那么我們怎么使用它呢?文檔/android-sdk/docs/guide/developing/tools/aidl.html中對步驟作了詳細(xì)描述:

--1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client.

創(chuàng)建你的aidl文件,我在后面給出了一個(gè)例子,它的aidl文件定義如下:寫法跟java代碼類似,但是這里有一點(diǎn)值得注意的就是它可以引用其它aidl文件中定義的接口,但是不能夠引用你的java類文件中定義的接口

package com.cao.android.demos.binder.aidl;

import com.cao.android.demos.binder.aidl.AIDLActivity;

interface AIDLService {

void registerTestCall(AIDLActivity cb);

void invokCallBack();

}

--2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory.

編譯你的aidl文件,這個(gè)只要是在eclipse中開發(fā),你的adt插件會像資源文件一樣把a(bǔ)idl文件編譯成java代碼生成在gen文件夾下,不用手動去編譯:編譯生成AIDLService.java如我例子中代碼

--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file.

實(shí)現(xiàn)你定義aidl接口中的內(nèi)部抽象類Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService

Stub類繼承了Binder,并繼承我們在aidl文件中定義的接口,我們需要實(shí)現(xiàn)接口方法,下面是我在例子中實(shí)現(xiàn)的Stub類:

private final AIDLService.Stub mBinder = new AIDLService.Stub() {

@Override

public void invokCallBack() throws RemoteException {

Log("AIDLService.invokCallBack");

Rect1 rect = new Rect1();

rect.bottom=-1;

rect.left=-1;

rect.right=1;

rect.top=1;

callback.performAction(rect);

}

@Override

public void registerTestCall(AIDLActivity cb) throws RemoteException {

Log("AIDLService.registerTestCall");

callback = cb;

}

};

Stub翻譯成中文是存根的意思,注意Stub對象是在被調(diào)用端進(jìn)程,也就是服務(wù)端進(jìn)程,至此,服務(wù)端aidl服務(wù)端得編碼完成了。

--4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface.

第四步告訴你怎么在客戶端如何調(diào)用服務(wù)端得aidl描述的接口對象,doc只告訴我們需要實(shí)現(xiàn)Service.onBind(Intent)方法,該方法會返回一個(gè)IBinder對象到客戶端,綁定服務(wù)時(shí)不是需要一個(gè)ServiceConnection對象么,在沒有了解aidl用法前一直不知道它是什么作用,其實(shí)他就是用來在客戶端綁定service時(shí)接收service返回的IBinder對象的:

AIDLService mService;

private ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName className, IBinder service) {

Log("connect service");

mService = AIDLService.Stub.asInterface(service);

try {

mService.registerTestCall(mCallback);

} catch (RemoteException e) {

}

}

public void onServiceDisconnected(ComponentName className) {

Log("disconnect service");

mService = null;

}

};

mService就是AIDLService對象,具體可以看我后面提供的示例代碼,需要注意在客戶端需要存一個(gè)服務(wù)端實(shí)現(xiàn)了的aidl接口描述文件,但是客戶端只是使用該aidl接口,不需要實(shí)現(xiàn)它的Stub類,獲取服務(wù)端得aidl對象后mService = AIDLService.Stub.asInterface(service);,就可以在客戶端使用它了,對mService對象方法的調(diào)用不是在客戶端執(zhí)行,而是在服務(wù)端執(zhí)行。

4.aidl中使用java類,需要實(shí)現(xiàn)Parcelable接口,并且在定義類相同包下面對類進(jìn)行聲明:

上面我定義了Rect1類

之后你就可以在aidl接口中對該類進(jìn)行使用了

package com.cao.android.demos.binder.aidl;

import com.cao.android.demos.binder.aidl.Rect1;

interface AIDLActivity {

void performAction(in Rect1 rect);

}

注意in/out的說明,我這里使用了in表示輸入?yún)?shù),out沒有試過,為什么使用in/out暫時(shí)沒有做深入研究。

轉(zhuǎn)載

新聞名稱:androidaidl,Android aidl校驗(yàn)
網(wǎng)站鏈接:http://chinadenli.net/article35/dsipdsi.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)靜態(tài)網(wǎng)站響應(yīng)式網(wǎng)站定制開發(fā)全網(wǎng)營銷推廣營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)