<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                大家好,好久不見,今天要給大家分享的是android aidl的使用。在Android中, 每個應用程序都可以有自己的進程. 在寫UI應用的時候, 經常要用到Service. 在不同的進程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進程內存共享. 因此傳遞對象, 只能把對象拆分成操作系統能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.? AIDL(AndRoid接口描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然后使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.? AIDL的IPC的機制和COM或CORBA類似, 是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.? ? 今天的兩個實例用到兩個Android工程,一個是AIDL的服務端另一個是客戶端。 ? **服務端的實現步驟:** 首先看一下服務端,工程目錄如下: ![](https://box.kancloud.cn/2016-08-10_57aaf0ecedc1e.gif) 首先創建IaidlServerService.aidl文件,代碼如下(一個簡單方法,另一個返回對象方法),當我們點擊保存時會在gen目錄下生成對應的java文件,如上圖紅色部分: ? package com.chapter8.aidl;import com.chapter8.aidl.Book;interface IAIDLServerService { String sayHello(); Book getBook();}? 第二步:因為這個接口里有傳遞對象,所以對象要特殊處理一下,這里繼承了Parcelable,Book.java代碼如下: 如果大家不明的地方,請參見,下面連接的文章: [Android高手進階教程(十七)之---Android中Intent傳遞對象的兩種方法(Serializable,Parcelable)!](http://blog.csdn.net/Android_Tutor/archive/2010/07/16/5740845.aspx) ~~~ package com.chapter8.aidl;import android.os.Parcel;import android.os.Parcelable;public class Book implements Parcelable { private String bookName; private int bookPrice; public Book(){ } public Book(Parcel parcel){ bookName = parcel.readString(); bookPrice = parcel.readInt(); } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public int getBookPrice() { return bookPrice; } public void setBookPrice(int bookPrice) { this.bookPrice = bookPrice; } public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(bookName); parcel.writeInt(bookPrice); } public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { public Book createFromParcel(Parcel source) { return new Book(source); } public Book[] newArray(int size) { return new Book[size]; } };}? ~~~ 第三步:寫一個與Book類對應的aidl,命名為Book.aidl,代碼非常簡單,代碼如下: parcelable Book;? 第四步:新建一個名為AidlServerService的Service.代碼如下: ~~~ package com.chapter8.aidl;import com.chapter8.aidl.IAIDLServerService.Stub;import com.chapter8.aidl.IAIDLServerService;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class AidlServerService extends Service { @Override public IBinder onBind(Intent intent) { return mBinder; } /** * 在AIDL文件中定義的接口實現。 */ private IAIDLServerService.Stub mBinder = new Stub() { public String sayHello() throws RemoteException { return "Hello"; } public Book getBook() throws RemoteException { Book mBook = new Book(); mBook.setBookName("Android應用開發"); mBook.setBookPrice(50); return mBook; } };}? ~~~ 第五步:在AndroidManifest.xml注冊Service,代碼如下: ~~~ <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.chapter8.aidl" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="AidlServerActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="AidlServerService" android:process=":remote"> <intent-filter> <action android:name="com.chapter8.aidl.IAIDLServerService"></action> </intent-filter> </service> </application></manifest>? ~~~ 第六步:運行服務端工程,到設備上,好讓客戶端調用,服務端的Activity什么都沒做.效果如下: ![](https://box.kancloud.cn/2016-08-10_57aaf0ed18ff4.gif) **客戶端的具體實現步驟:** 第一步:新建客戶端工程,目錄結構如下: ![](https://box.kancloud.cn/2016-08-10_57aaf0ed2d666.gif) 第二步:引入Aidl文件以及用到的類,如上面的com.chapter8.aidl包。直接從服務端里代碼copy過來就OK. 第三步:修改main.xml布局文件,增加一個按鈕,代碼如下: ~~~ <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="調用AIDL服務" /></LinearLayout>? ~~~ 第四步:修改AidlClientActivity.java代碼如下: ~~~ package com.chapter8.aidlclient;import com.chapter8.aidl.IAIDLServerService;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.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class AidlClientActivity extends Activity { private TextView mTextView; private Button mButton; private IAIDLServerService mIaidlServerService = null; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { mIaidlServerService = null; } public void onServiceConnected(ComponentName name, IBinder service) { mIaidlServerService = IAIDLServerService.Stub.asInterface(service); //aidl通信 try { String mText = "Say hello: " + mIaidlServerService.sayHello() + "/n"; mText += "書名: " + mIaidlServerService.getBook().getBookName()+"/n"; mText += "價格: " + mIaidlServerService.getBook().getBookPrice(); mTextView.setText(mText); } catch (RemoteException e) { e.printStackTrace(); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //初始化控件 mTextView = (TextView)findViewById(R.id.textview); mButton = (Button)findViewById(R.id.button); //增加事件響應 mButton.setOnClickListener(new OnClickListener(){ public void onClick(View v) { //bindService Intent service = new Intent("com.chapter8.aidl.IAIDLServerService"); bindService(service, mConnection,BIND_AUTO_CREATE); } }); } }? ~~~ 第五步:運行客戶端工程,效果如下: ![](https://box.kancloud.cn/2016-08-10_57aaf0ed47a11.gif) ![](https://box.kancloud.cn/2016-08-10_57aaf0ed5d1de.gif) Ok,上面就完整的作了一個Aidl開發的流程,有什么不對的地方希望大家多多指教,今天就講到這里。謝謝!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看