編輯:關於Android編程
AIDL (Android Interface Definition Language )AIDL 適用於 進程間通信,並且與Service端多個線程並發的情況,如果只是單個線程 可以使用 Messenger ,如果不需要IPC 可以使用BinderAIDL語法:基礎數據類型都可以適用,List Map等有限適用。static field 不適用。AIDL基本用法
接口描述文件
1、導入的包名
2、如果有使用Object對象,需要該對象 implement Parcelable 接口,並且需要導入該接口包名+類名;
如果是primitive type 不需要這步。
3、定義方法名稱。
4、所有的.aidl文件已經需要傳遞的對象接口需要在Service 與Client中各一份
package com.aidl;
import com.aidl.Data;
interface IaidlData
{
int getPid();
String getName();
com.aidl.Data getData();
}
實際實現的接口是在 gen中自動生成的 IaidlData.java的抽象內部類 Stub
1、需要在配置文件Androidmanifest.xml文件中聲明Service,並且添加intent-filter 節點 的action屬性,
此屬性一般可以使用 aidl的包名+文件名(因為該值在服務器與客戶端一致)
2、需要實現IaidlData.aidl文件中定義的接口。
aidl文件是一個接口描述文件,會在gen中自動生成一個同名的IaidlData.java接口文件,該接口文件包含一個抽象類stub,其繼承了android.os.Binder、實現IaidlData接口
故,我們實際需要實現的是Stub抽象類。
public class AidlService extends Service
{
public void onCreate()
{
Log.d(aidl, aidlService--------------onCreate);
}
public IBinder onBind(Intent intent)
{
return mBinder;
}
private final IaidlData.Stub mBinder = new IaidlData.Stub()
{
public int getPid()
{
return Process.myPid();
}
public String getName() throws RemoteException
{
return go or not go is a problem;
}
public Data getData() throws RemoteException
{
Data data = new Data();
data.id = Process.myPid();
data.name = go or not go is a problem;
return data;
}
};
}
1、建立連接,使用Action屬性定位需要的Service
actoin的屬性的采用aidl文件的類名+包名(與服務一致),之前需要在服務中設置相同的action屬性,否則找不到服務。
2、獲取服務返回的stub對象,mIaidlData = IaidlData.Stub.asInterface(service);
package com.clent;
import com.aidl.IaidlData;
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.util.Log;
import android.view.View;
public class AidlClientActivity extends Activity
{
IaidlData mIaidlData;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
protected void onStart()
{
super.onStart();
Log.d(aidl , onstart ----------bindservice-----+IaidlData.class.getName());
Intent intent = new Intent(IaidlData.class.getName());
bindService(intent, mSecondaryConnection, BIND_AUTO_CREATE);
}
private ServiceConnection mSecondaryConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
{
Log.d(aidl, onServiceConnected----------------);
mIaidlData = IaidlData.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName className)
{
mIaidlData = null;
}
};
public void onClick(View view)
{
System.out.println( onclick--------------- : );
if(mIaidlData != null)
{
try
{
System.out.println( name : +mIaidlData.getName());
System.out.println( id : +mIaidlData.getPid());
System.out.println( data : +mIaidlData.getData().id + +mIaidlData.getData().name);
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
protected void onDestroy()
{
super.onDestroy();
unbindService(mSecondaryConnection);
}
}
1、定義該對象Data,並實現Parcelable
2、添加Data.aidl文件,並采用如下方式編寫導入Data
3、需要在引用到Data的.aidl文件中 import com.aidl.Data
4、需要在服務端和 客戶端都添加 Data.aidl與 Data.java文件 並且需要一致。
Data.aidl
aidl文件:
package com.aidl;
parcelable Data;
public class Data implements Parcelable
{
public int id;
public String name;
public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
{
public Data createFromParcel(Parcel in)
{
return new Data(in);
}
public Data[] newArray(int size)
{
return new Data[size];
}
};
public Data()
{
}
private Data(Parcel in)
{
readFromParcel(in);
}
public void readFromParcel(Parcel in)
{
id = in.readInt();
name = in.readString();
}
public int describeContents()
{
return 0;
}
public void writeToParcel(Parcel dest, int flags)
{
dest.writeInt(id);
dest.writeString(name);
}
}
Android提高之BroadcastReceiver實例詳解
前面幾篇文章分別討論了Activity和Service,本文就來討論BroastcastReceiver,Broastcast是應用程序間通信的手段。Broastcast
Android學習路線(二十四)ActionBar Fragment運用最佳實踐
通過前面的幾篇博客,大家看到了Google是如何解釋action bar和fragment以及推薦的用法。俗話說沒有demo的博客不是好博客,下面我會介紹一
java代碼質量檢測評價工具
如果能在構建代碼前發現代碼中潛在的問題會怎麼樣呢?很有趣的是,Eclipse 插件中就有這樣的工具,比如 JDepend 和 CheckStyle,它們能幫您在軟件問題暴
Android中的縮略圖加載-不浪費一點多余的內存
1. Why,為什麼要加載縮略圖? 有的時候不需要展示原圖,只需展示圖片的縮略圖,可以節省內存。比如:網易新聞中的圖片浏覽,左邊展示的小獅子圖片就是一個縮略