亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android遠程服務編寫和調用教程

2020-01-02 07:03:46
字體:
來源:轉載
供稿:網友

網上汗牛充棟的文章都是介紹Android遠程服務的,一個個將Binder機制、AIDL講得頭頭是道,然而沒有幾個人能夠給出清晰的范例說明如何用最快的方法學會編寫和調用一個Android遠程服務。若你僅僅是想如何編寫或者調用Android的遠程服務,而懶得去理解Binder機制是如何運行的,那么本篇文章正好適合你。畢竟現在人人都會開車,但沒有幾個人明白發動機到底是如何運作的。

預備知識

讀者應該有基本的java知識,和Android簡單app的開發經驗。

環境

代碼運行環境:
1.ADT2014版本;
2.android:minSdkVersion=”8”;android:targetSdkVersion=”20”
3.workspace中已經生成了appcompatv7,它的版本是android-22;

遠程服務開發教程

在開始開發之前,先弄清楚幾個概念:
1. IPC:進程間通信,你只需要知道Android是依賴這個東西來進行遠程服務調用的就可以了。
2. Binder機制:Android發明的一種IPC機制,據說非常非常的好,你就當它是個黑盒子,通過這個黑盒子就可以進行遠程服務調用了,而且Android中的很多機制都是通過它實現的。
3. AIDL語言:一種專門用來寫遠程接口的語言,看它的名字就知道了,Android Interface Definition
Language。AIDL語言可以被android提供的編譯器編譯為Java源代碼,這個Java源代碼將會被服務的和客戶端使用,用來簡化遠程服務開發流程。如果你當初玩過CORBA,那就更能明白什么是IDL語言了
4. IInterface接口、IBinder接口、IBinder類等等:都是用來實現Binder機制的接口和類,在本教程中,你就當它們是Binder黑盒子的一部分,不需要了解。
再說一點,其實Android提供的ApiDemos中就有一個遠程服務的標準范例,但是其一是它沒有將服務端和客戶端分開寫,其二是例子中摻雜了太多其他的功能,因此理解起來較為困難。這個例子是com.example.android.apis.app.RemoteService,有興趣的可以在看完本文后再去詳細研究。

第一步,創建一個普通Android應用

應用名為WxbRemoteService,這個應用可以刪掉其Activity類,但是為了簡單,我們就保留所有自動創建的代碼。

第二步,編寫AIDL

AIDL語言的語法和Java其實很像,你甚至可以先編寫一個Java接口,然后刪掉public、protected、private這些權限限定詞即可。例子如下IWxbService.aidl:

package com.dumaisoft.wxbremoteservice;interface IWxbService { void setName(String name); String getName();}

注意幾點:
1.接口名和aidl文件名相同。
2.接口和方法前不用加訪問權限修飾符public,private,protected等,也不能用final,static。
3.Aidl默認支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、 CharSequence),使用這些類型時不需要import聲明。對于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作 為參數或返回值,自定義類型必須實現Parcelable接口。
4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應該顯式import,即便在該類和定義的包在同一個包中。
5.在aidl文件中所有非Java基本類型參數必須加上in、out、inout標記,以指明參數是輸入參數、輸出參數還是輸入輸出參數。
6.Java原始類型默認的標記為in,不能為其它標記
IWxbService.aidl文件的位置是在com.dumaisoft.wxbremoteservice包中,只要語法正確,則會在ADT的gen目錄下的com.dumaisoft.wxbremoteservice包中生成java文件IWxbService.java。
IWxbService.aidl定義了一個遠程接口,它包含兩個方法getName和setName。

第三步,編寫服務類

添加一個WxbService類,它繼承了Service類,源代碼如下:

package com.dumaisoft.wxbremoteservice;import com.dumaisoft.wxbremoteservice.IWxbService.Stub;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class WxbService extends Service { private ServiceImpl serviceImpl; //繼承由IWxbService.aidl生成的com.dumaisoft.wxbremoteservice.IWxbService.Stub類 class ServiceImpl extends Stub{  private String _name;  @Override  public void setName(String name) throws RemoteException {   _name = name;  }  @Override  public String getName() throws RemoteException {   return _name;  } } //將ServiceImpl做一個簡單的單例模式 private ServiceImpl getInstance(){  if(serviceImpl == null){   serviceImpl = new ServiceImpl();  }  return serviceImpl; } @Override public IBinder onBind(Intent intent) {  return getInstance(); }}

通過研究代碼可知,和普通的服務類相比,遠程服務類最大的區別就是它擁有一個名為ServiceImpl的成員變量,這個成員變量繼承了Stub類,并實現了Stub類的getName和setName方法。這個Stub類就是由 IWxbService.aidl生成的IWxbService.java提供的。我們不用研究其源代碼,只用知道它的用法:
第一:讓Service的一個成員變量繼承Stub,并實現遠程接口的方法;
第二:在Service的onBind方法中返回一個Stub子類的實例。

第四步,配置AndroidManifest.xml

加上如下代碼:

  <service android:name="WxbService">   <intent-filter>    <action android:name="com.dumaisoft.wxbremoteservice.REMOTE_SREVICE"/>   </intent-filter>  </service>

注意action的name為”com.dumaisoft.wxbremoteservice.REMOTE_SREVICE”,這個由開發者保證不重名即可。

第五步,安裝app到手機上

安裝完成后,你的遠程服務就被注冊到Binder黑盒子中了,任何客戶端只要知道你的遠程服務action名稱和接口,就可以bind服務,并調用接口。

遠程服務調用教程

第一步,創建一個android應用

應用名為WxbRemoteServiceClient,src包中自動生成了com.dumaisoft.wxbremoteserviceclient包。

第二步,引入遠程服務的AIDL文件

在src包中創建com.dumaisoft.wxbremoteservice包(為了與服務端的包名相同),然后將上面編寫的IWxbService.aidl文件拷貝入此目錄。顯然,在本工程的gen目錄中也生成了IWxbService.java文件。

第三步,編寫調用遠程服務的代碼

代碼如下:

package com.dumaisoft.wxbremoteserviceclient;import com.dumaisoft.wxbremoteservice.IWxbService;import android.app.Activity;import android.app.Service;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.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity { private Button btnBind; private Button btnSetName; private Button btnGetName; private IWxbService serviceProxy; //遠程服務的代理 private ServiceConnection conn = new ServiceConnection() {  @Override  public void onServiceDisconnected(ComponentName name) {    }  @Override  public void onServiceConnected(ComponentName name, IBinder service) {   //獲取遠程服務代理   serviceProxy = IWxbService.Stub.asInterface(service);  } }; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  btnBind = (Button) this.findViewById(R.id.btnBind);  btnSetName = (Button) this.findViewById(R.id.btnSetName);  btnGetName = (Button) this.findViewById(R.id.btnGetName);  btnBind.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    Intent service = new Intent();    //Remote Service Action name    service.setAction("com.dumaisoft.wxbremoteservice.REMOTE_SREVICE");    bindService(service, conn, Service.BIND_AUTO_CREATE);   }  });  btnSetName.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    try {     serviceProxy.setName("MyName");    } catch (RemoteException e) {     e.printStackTrace();    }   }  });  btnGetName.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    try {     String name = serviceProxy.getName();     Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();    } catch (RemoteException e) {     e.printStackTrace();    }   }  });   }}

注意幾點:
一、創建一個ServiceConnection的匿名子類,在其onServiceConnected方法中獲取遠程服務代理對象serviceProxy。事實上,onServiceConnected方法會在bindService方法調用時被調用,因此能確保一定可以獲得遠程服務的代理對象;
二、IWxbService.Stub.asInterface(service)方法也是由IWxbService.java文件提供的,其內部機制不用研究,只需要知道它會返回一個IWxbService接口的對象,該對象可以通過Binder黑盒子調用遠程服務的setName和getName方法;
三、使用Intent指定action為”com.dumaisoft.wxbremoteservice.REMOTE_SREVICE”,即可正確的bind到遠程服務。
四、bind成功后,就可以通過遠程服務的代理對象,使用遠程服務的功能了。

小結

至此,讀者應該能比較快速的開發出一個遠程服務,并能編寫客戶端輕松的調用它了。還有一點需要說明的是,除了使用AIDL來進行遠程服務的編寫和調用外,還可以直接使用IBinder、Binder等接口和類來進行遠程服務編寫調用。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲成人在线观看| 日韩视频第一页| 中文字幕亚洲国产| 国产精品高潮在线| 亚洲精品在线视频| 国产主播欧美精品| 国产精品视频男人的天堂| 日韩在线免费观看视频| 高清视频欧美一级| 91精品国产高清久久久久久91| 成人自拍性视频| 欧美激情a∨在线视频播放| 国产精品盗摄久久久| 91在线视频一区| 国产午夜精品一区二区三区| 欧美在线中文字幕| 中文字幕日韩欧美在线视频| 欧美大尺度在线观看| 亚洲国产中文字幕久久网| 91精品国产综合久久香蕉最新版| 欧美另类老女人| 亚洲电影在线观看| 亚洲精品视频免费在线观看| 欧洲亚洲在线视频| 国产精品一区二区在线| 国产精品视频一区二区三区四| 91在线观看免费高清完整版在线观看| 中文字幕久精品免费视频| 97久久精品人搡人人玩| 成人www视频在线观看| 欧美国产视频一区二区| 国产91精品最新在线播放| 国产香蕉精品视频一区二区三区| 久热99视频在线观看| 国产xxx69麻豆国语对白| 97视频在线看| 尤物精品国产第一福利三区| 久久久久九九九九| 精品国产一区av| 日韩精品免费观看| 国产精品稀缺呦系列在线| 日韩欧美一区二区在线| 欧美精品一本久久男人的天堂| 91精品国产成人| 欧美日韩第一视频| 欧美激情一级二级| 成人欧美一区二区三区在线| 午夜精品久久久久久久99热浪潮| 91精品国产777在线观看| 两个人的视频www国产精品| 欧美做受高潮1| 欧美成人在线免费| 精品亚洲男同gayvideo网站| 最近日韩中文字幕中文| 国产97在线视频| 久久国产天堂福利天堂| 欧美成人黑人xx视频免费观看| 欧洲亚洲女同hd| 成人久久一区二区| 亚洲xxx视频| 国产精品国产三级国产专播精品人| 亚洲小视频在线| 国产精品777| 日本国产高清不卡| 亚洲午夜性刺激影院| 国产精品福利网站| 国内精品视频久久| 91免费观看网站| 欧美在线视频观看免费网站| 亚洲第一中文字幕在线观看| 综合激情国产一区| 亚洲欧美国产va在线影院| 岛国视频午夜一区免费在线观看| 91在线视频导航| 日韩欧美大尺度| 国产精品视频大全| 亚洲免费影视第一页| 国产91对白在线播放| 国产精品一区电影| 成人精品一区二区三区电影免费| 91精品免费看| 日韩精品999| 2021国产精品视频| 4k岛国日韩精品**专区| 日韩av在线资源| 欧美日韩综合视频网址| 精品久久久久人成| 国产91精品在线播放| 日韩欧美福利视频| 国产区精品在线观看| 国产精品精品视频一区二区三区| 美女av一区二区| 国产精品丝袜视频| 深夜精品寂寞黄网站在线观看| 国产精品一区二区久久久久| 日韩中文字幕在线播放| 久久91精品国产| 在线色欧美三级视频| 亚洲国产高清高潮精品美女| 97视频在线看| 国产免费亚洲高清| 91超碰中文字幕久久精品| 国产精品白丝av嫩草影院| 精品一区二区三区电影| 一本色道久久综合狠狠躁篇的优点| 亚洲qvod图片区电影| 美女av一区二区| 亚洲www在线观看| 亚洲精品久久久久久下一站| 久久久噜噜噜久久中文字免| 97人洗澡人人免费公开视频碰碰碰| 色综合影院在线| 欧美成人免费大片| 亚洲bt欧美bt日本bt| 黄色一区二区在线观看| 午夜精品一区二区三区在线| 日韩国产高清视频在线| 久久精品国产亚洲| 91色精品视频在线| 91免费欧美精品| 亚洲人成在线电影| 亚洲а∨天堂久久精品喷水| 国产精品美女网站| 日本成人激情视频| 欧美一乱一性一交一视频| 91av视频在线免费观看| 国产在线精品一区免费香蕉| 欧美风情在线观看| 国产精品www| www.日韩.com| 日韩av日韩在线观看| 国内精品久久久久伊人av| 91视频九色网站| 国产精品户外野外| 97视频免费在线看| 欧美日韩在线视频观看| 国产精品视频一区二区三区四| 国产精品影片在线观看| 韩国一区二区电影| 精品视频www| 国产亚洲欧美日韩一区二区| 国内精品久久久久久久久| 国产在线观看一区二区三区| 久久久久亚洲精品| 黄色精品在线看| 欧美性极品少妇精品网站| 久久精品国产一区二区电影| 亚洲欧美日韩第一区| 亚洲成人a级网| 亚洲欧美日韩中文视频| 亚洲第五色综合网| 国产欧美一区二区三区视频| 亚洲在线一区二区| 久久99精品国产99久久6尤物| 久久免费视频在线观看| 亚洲国产精品高清久久久| 国产mv免费观看入口亚洲| 日韩av电影中文字幕| 成人欧美在线观看| 国产精品福利观看| 色悠悠久久88| 欧美日韩国内自拍| 91人人爽人人爽人人精88v| 九九热这里只有精品6|