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

aidlandroid的簡單介紹

aidl android 5.0上怎么使用

Android中使用AIDL需要遵循一套規(guī)范,最關鍵的就是定義AIDL文件,下面以AndroidStudio為例一步步說明AIDL的使用。

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設、成都網(wǎng)站設計與策劃設計,阿城網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:阿城等地區(qū)。阿城做網(wǎng)站價格咨詢:13518219792

由于要測試Android的跨進程通信,所以這里我們需要建立兩個項目,一個項目調用另外一個項目的服務。

(1)新建遠程服務項目,取名為MyRemoteService,該項目主要用于開放接口,提供服務給調用者使用。

(2)為MyRemoteService項目編寫AIDL文件。AIDL文件聲明了可以被跨進程調用的函數(shù)接口,AIDL文件的語法跟聲明Java接口很類似,但又稍有區(qū)別,下面是本例子中MyRemoteService項目的AIDL文件代碼:

[html] view plain copy print?

// IService.aidl

package com.test.myremoteservice;

// Declare any non-default types here with import statements

interface IService {

/**

* 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 add(int a, int b);

}

android 為什么用aidl

AIDL:Android Interface Definition Language,即Android接口定義語言。

Android系統(tǒng)中的進程之間不能共享內存,因此,需要提供一些機制在不同進程之間進行數(shù)據(jù)通信。

為了使其他的應用程序也可以訪問本應用程序提供的服務,Android系統(tǒng)采用了遠程過程調用(Remote

Procedure Call,RPC)方式來實現(xiàn)。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語言(Interface

Definition

Language,IDL)來公開服務的接口。我們知道4個Android應用程序組件中的3個(Activity、BroadcastReceiver

和ContentProvider)都可以進行跨進程訪問,另外一個Android應用程序組件Service同樣可以。因此,可以將這種可以跨進程訪問

的服務稱為AIDL(Android Interface Definition Language)服務。

android怎么寫aidl文件

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

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

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

(3)建立一個服務類(Service的子類)。

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

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

建立AIDL服務

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

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

IMyService.aidl文件的內容如下:

Java代碼:

package eoe.demo;

interface IMyService {

String getValue();

}

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

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

(3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(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();

}

}

在編寫上面代碼時要注意如下兩點:

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

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

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

Java代碼:

service android:name=".MyService"

intent-filter

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

/intent-filter

/service

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

調用AIDL服務首先要綁定服務,然后才能獲得服務對象,代碼如下:

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) {

// 獲得服務對象

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服務

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

break;

case R.id.btnInvokeAIDLService:

try {

textView.setText(myService.getValue());

// 調用服務端的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:AIDL進程間通信基本框架

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

而進程間通信,一般采用AIDL機制的客戶端與服務端通信。

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

當傳遞自定義 Parcelable 時,有三處地方需要注意:

當傳遞其他 aidl 接口時,同樣必須要 import 這個 aidl 文件

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

一個基本的客戶端服務端的通信結構一般包括如下功能

客戶端的功能

服務端的功能

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

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

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

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

服務端必須得有的功能模塊:

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

首先是通信的 aidl 接口定義

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

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

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

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

最后是服務端的 onUnbind 方法的實現(xiàn),對回調接口進行反注冊

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

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

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

android之AIDL介紹

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

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

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

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

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

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

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

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

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

AIDL實例文件:

分享文章:aidlandroid的簡單介紹
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article13/dsshdds.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計云服務器標簽優(yōu)化動態(tài)網(wǎng)站品牌網(wǎng)站設計自適應網(wǎng)站

廣告

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

成都做網(wǎng)站