诸暨汉妇网络科技有限公司

電腦技術(shù)網(wǎng) - 從此開始了解電腦、科技、手機(jī)、智能硬件、網(wǎng)絡(luò)相關(guān)的各項(xiàng)適用知識(shí)!

電腦技術(shù)網(wǎng)_it資訊_游戲攻略_手機(jī)教程_電腦教程_無(wú)線路由器設(shè)置_設(shè)置無(wú)線路由器_辦公軟件教程_電腦系統(tǒng)安裝_電腦維修知識(shí)

android studio如何創(chuàng)建AIDL服務(wù)文件

欄目:Android系統(tǒng)技巧
已被:人瀏覽過(guò)
本文主要介紹:android studio的AIDL服務(wù)是什么 為了使其他的應(yīng)用程序也可以訪問(wèn)本應(yīng)用程序提供的服務(wù),Android系統(tǒng)采用了遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)方式來(lái)實(shí)現(xiàn)。與很多其他的基于RPC的解決方案
  android studio的AIDL服務(wù)是什么

  為了使其他的應(yīng)用程序也可以訪問(wèn)本應(yīng)用程序提供的服務(wù),Android系統(tǒng)采用了遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)方式來(lái)實(shí)現(xiàn)。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語(yǔ)言(Interface Definition Language,IDL)來(lái)公開服務(wù)的接口。因此,可以將這種可以跨進(jìn)程訪問(wèn)的服務(wù)稱為AIDL(Android Interface Definition Language)服務(wù)。

  android studio創(chuàng)建AIDL服務(wù)文件具體步驟如下:

  1、要進(jìn)行創(chuàng)建AIDL的接口之前,需要進(jìn)行選中當(dāng)前的項(xiàng)目的文件中,選中完成項(xiàng)目之后。

android studio如何創(chuàng)建AIDL服務(wù)文件

  2、然后進(jìn)行點(diǎn)擊Android studio菜單中的;file”的選項(xiàng),就會(huì)彈出了一個(gè)下拉的菜單中;new”選項(xiàng)。

android studio的aidl

  3、就會(huì)彈出了一個(gè)下一級(jí)的菜單中,進(jìn)行選擇下一級(jí)菜單中的;AIDL”的選項(xiàng)。

android studio的aidl

  4、就會(huì)彈出了一個(gè)菜單中,進(jìn)行點(diǎn)擊這個(gè)菜單中的;AIDL FILE”的選項(xiàng)。

android studio的aidl

  5、就會(huì)彈出了一個(gè)AIDL的窗口的選項(xiàng),需要給接口進(jìn)行添加名稱,在interface name的輸入框中進(jìn)行輸入名稱,點(diǎn)擊”finish;的選項(xiàng)。

android studio的aidl

  6、然后在項(xiàng)目中進(jìn)行天機(jī)了一個(gè)aidl的文件,在該文件下中,有一個(gè)aidl的后綴的文件,其實(shí)就是一個(gè)接口文件。

android studio的aidl

  實(shí)例:

  服務(wù)器端:

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

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

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

  package cn.m9.mobile.aidl;

  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會(huì)自動(dòng)生成一個(gè)IMyService.java文件。讀者一般并不需要關(guān)心這個(gè)文件的具體內(nèi)容,也不需要維護(hù)這個(gè)文件。

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

  package cn.m9.mobile.aidl;

  import android.app.Service;

  import android.content.Intent;

  import android.os.IBinder;

  public class MyService extends Service {

  public class MyServiceImpl extends IMyService.Stub {

  public String getValue

  {

  return "Android is very powerful";

  }

  }

  @Override

  public IBinder onBind(Intent arg0) {

  // TODO Auto-generated method stub

  return new MyServiceImpl;

  }

  }

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

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

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

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

  其中"cn.m9.activity.IMyService"是客戶端用于訪問(wèn)AIDL服務(wù)的ID。

  下面來(lái)編寫客戶端的調(diào)用代碼。首先新建一個(gè)Eclipse Android工程(TestAidlClient),并將自動(dòng)生成的IMyService.java文件連同包目錄一起復(fù)制到 testAIDL_client工程的src目錄中(R文件除外).

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

  package cn.m9.mobile;

  import cn.m9.mobile.R;

  import cn.m9.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.util.Log;

  import android.view.View;

  import android.view.View.OnClickListener;

  import android.widget.Button;

  import android.widget.TextView;

  public class TestAidlClient extends Activity implements OnClickListener {

  /** Called when the activity is first created. */

  private IMyService myService = null;

  private Button btnInvokeAIDLService;

  private Button btnBindAIDLService;

  private TextView textView;

  private static final String TAG="TestAIDLClient";

  private ServiceConnection serviceConnection = new ServiceConnection

  {

  @Override

  public void onServiceConnected(ComponentName name, IBinder service) {

  // TODO Auto-generated method stub

  myService = IMyService.Stub.asInterface(service);

  btnInvokeAIDLService.setEnabled(true);

  }

  @Override

  public void onServiceDisconnected(ComponentName arg0) {

  // TODO Auto-generated method stub

  }

  };

  @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);

  }

  @Override

  public void onClick(View view) {

  // TODO Auto-generated method stub

  switch (view.getId)

  {

  case R.id.btnBindAIDLService:

  //綁定AIDL服務(wù)

  bindService(new Intent("cn.m9.mobile.aidl.IMyService"), serviceConnection,Context.BIND_AUTO_CREATE);

  break;

  case R.id.btnInvokeAIDLService:

  try{

  textView.setText(myService.getValue);

  } catch (Exception e)

  {

  }

  break;

  }

  }

  }

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

  使用bindService方法來(lái)綁定AIDL服務(wù)。其中需要使用Intent對(duì)象指定AIDL服務(wù)的ID,也就是標(biāo)簽中android:name屬性的值。

  在綁定時(shí)需要一個(gè)ServiceConnection對(duì)象。創(chuàng)建ServiceConnection對(duì)象的過(guò)程中如果綁定成功,系統(tǒng)會(huì)調(diào)用onServiceConnected方法,通過(guò)該方法的service參數(shù)值可獲得AIDL服務(wù)對(duì)象。

  首先運(yùn)行AIDL服務(wù)程序,然后運(yùn)行客戶端程序,單擊【綁定AIDL服務(wù)】按鈕,如果綁定成功,【調(diào)用AIDL服務(wù)】按鈕會(huì)變?yōu)榭蛇x狀態(tài),單擊這個(gè)按鈕,會(huì)輸出getValue方法的返回值.

本文地址: http://www.laotiku.cn/android/2077.html 手機(jī)版

相關(guān)推薦Related Recommendations