锘??xml version="1.0" encoding="utf-8" standalone="yes"?> AIDL(AndRoid鎺ュ彛鎻忚堪璇█)鏄竴縐嶅熷彛鎻忚堪璇█; 緙栬瘧鍣ㄥ彲浠ラ氳繃aidl鏂囦歡鐢熸垚涓孌典唬鐮侊紝閫氳繃棰勫厛瀹氫箟鐨勬帴鍙h揪鍒頒袱涓繘紼嬪唴閮ㄩ氫俊榪涚▼鐨勭洰鐨? 濡傛灉闇瑕佸湪涓涓狝ctivity涓? 璁塊棶鍙︿竴涓猄ervice涓殑鏌愪釜瀵硅薄, 闇瑕佸厛灝嗗璞¤漿鍖栨垚AIDL鍙瘑鍒殑鍙傛暟(鍙兘鏄涓弬鏁?,
鐒跺悗浣跨敤AIDL鏉ヤ紶閫掕繖浜涘弬鏁? 鍦ㄦ秷鎭殑鎺ユ敹绔? 浣跨敤榪欎簺鍙傛暟緇勮鎴愯嚜宸遍渶瑕佺殑瀵硅薄. AIDL鐨処PC鐨勬満鍒跺拰COM鎴朇ORBA綾諱技, 鏄熀浜庢帴鍙g殑錛屼絾瀹冩槸杞婚噺綰х殑銆傚畠浣跨敤浠g悊綾誨湪瀹㈡埛绔拰瀹炵幇灞傞棿浼犻掑? 濡傛灉瑕佷嬌鐢ˋIDL, 闇瑕佸畬鎴?浠朵簨鎯? 1. 寮曞叆AIDL鐨勭浉鍏崇被.; 2.
璋冪敤aidl浜х敓鐨刢lass.
鍏蜂綋瀹炵幇姝ラ濡備笅: 1銆佸垱寤篈IDL鏂囦歡,
鍦ㄨ繖涓枃浠墮噷闈㈠畾涔夋帴鍙? 璇ユ帴鍙e畾涔変簡鍙緵瀹㈡埛绔闂殑鏂規硶鍜屽睘鎬с?濡? ITaskBinder.adil package com.cmcc.demo; import com.cmcc.demo.ITaskCallback; interface ITaskBinder {
boolean isTaskRunning();
void stopRunningTask();
void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb); } 鍏朵腑: ITaskCallback鍦ㄦ枃浠禝TaskCallback.aidl涓畾涔? package com.cmcc.demo; interface ITaskCallback { void
actionPerformed(int actionId); } 娉ㄦ剰: 鐞嗚涓? 鍙傛暟鍙互浼犻掑熀鏈暟鎹被鍨嬪拰String, 榪樻湁灝辨槸Bundle鐨勬淳鐢熺被, 涓嶈繃鍦‥clipse涓?鐩墠鐨凙DT涓嶆敮鎸丅undle鍋氫負鍙傛暟, 鎹鐢ˋnt緙栬瘧鍙互, 鎴戞病鍋氬皾璇? 2銆佺紪璇慉IDL鏂囦歡,
鐢ˋnt鐨勮瘽, 鍙兘闇瑕佹墜鍔? 浣跨敤Eclipse plugin鐨勮瘽,鍙互鏍規嵁adil鏂囦歡鑷姩鐢熶駭java鏂囦歡騫剁紪璇?
涓嶉渶瑕佷漢涓轟粙鍏? 3銆佸湪Java鏂囦歡涓?
瀹炵幇AIDL涓畾涔夌殑鎺ュ彛. 緙栬瘧鍣ㄤ細鏍規嵁AIDL鎺ュ彛, 浜х敓涓涓狫AVA鎺ュ彛銆傝繖涓帴鍙f湁涓涓悕涓篠tub鐨勫唴閮ㄦ娊璞$被錛屽畠緇ф壙鎵╁睍浜嗘帴鍙e茍瀹炵幇浜嗚繙紼嬭皟鐢ㄩ渶瑕佺殑鍑犱釜鏂規硶銆傛帴涓嬫潵灝遍渶瑕佽嚜宸卞幓瀹炵幇鑷畾涔夌殑鍑犱釜鎺ュ彛浜? ITaskBinder.aidl涓帴鍙g殑瀹炵幇, 鍦∕yService.java涓帴鍙d互鍐呭祵綾葷殑鏂瑰紡瀹炵幇: private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() { public void stopRunningTask() { //@TODO } public boolean isTaskRunning() { //@TODO return false; } public void registerCallback(ITaskCallback cb) { if (cb != null) mCallbacks.register(cb); } public void unregisterCallback(ITaskCallback cb) { if (cb != null) mCallbacks.unregister(cb); } }; 鍦∕yActivity.java涓璉TaskCallback.aidl鎺ュ彛瀹炵幇: private ITaskCallback mCallback = new ITaskCallback.Stub() { public void actionPerformed(int id) { //TODO printf("callback id=" + id); } }; 4銆佸悜瀹㈡埛绔彁渚涙帴鍙TaskBinder, 濡傛灉鍐欑殑鏄痵ervice錛屾墿灞曡Service騫墮噸杞給nBind ()鏂規硶鏉ヨ繑鍥炰竴涓疄鐜頒笂榪版帴鍙g殑綾葷殑瀹炰緥銆傝繖涓湴鏂硅繑鍥炵殑mBinder,灝辨槸涓婇潰閫氳繃鍐呭祵浜嗗畾涔夌殑閭d釜. (MyService.java) public IBinder onBind(Intent t) { printf("service on bind"); return mBinder; } 鍦ˋctivity涓? 鍙互閫氳繃Binder瀹氫箟鐨勬帴鍙? 鏉ヨ繘琛岃繙紼嬭皟鐢? 5銆佸湪鏈嶅姟鍣ㄧ鍥炶皟瀹㈡埛绔殑鍑芥暟. 鍓嶆彁鏄綋瀹㈡埛绔幏鍙栫殑IBinder鎺ュ彛鐨勬椂鍊?瑕佸幓娉ㄥ唽鍥炶皟鍑芥暟, 鍙湁榪欐牱, 鏈嶅姟鍣ㄧ鎵嶇煡閬撹璋冪敤閭d簺鍑芥暟鍦?MyService.java涓? void callback(int val) { final int N = mCallbacks.beginBroadcast(); for (int i=0; i<N; i++) { try { mCallbacks.getBroadcastItem(i).actionPerformed(val); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } mCallbacks.finishBroadcast(); } AIDL鐨勫垱寤烘柟娉? AIDL璇硶寰堢畝鍗?鍙互鐢ㄦ潵澹版槑涓涓甫涓涓垨澶氫釜鏂規硶鐨勬帴鍙o紝涔熷彲浠ヤ紶閫掑弬鏁板拰榪斿洖鍊箋?
鐢變簬榪滅▼璋冪敤鐨勯渶瑕? 榪欎簺鍙傛暟鍜岃繑鍥炲煎茍涓嶆槸浠諱綍綾誨瀷.涓嬮潰鏄簺AIDL鏀寔鐨勬暟鎹被鍨? 1. 涓嶉渶瑕乮mport澹版槑鐨勭畝鍗旿ava緙栫▼璇█綾誨瀷(int,boolean絳? import com.cmcc.demo.ITaskCallback; interface ITaskBinder { //鍑芥暟璺焜ava涓鏍? 鍙互鏈?鍒板涓弬鏁?,鍙互鏈変竴涓繑鍥炲?/strong>
boolean isTaskRunning();
void stopRunningTask(); //鍙傛暟鍙互鏄彟澶栫殑涓涓猘idl瀹氫箟鐨勬帴鍙?/strong>
void registerCallback(ITaskCallback cb); void
unregisterCallback(ITaskCallback cb); //鍙傛暟鍙互鏄疭tring, 鍙互鐢╥n琛ㄥ叆杈撳叆綾誨瀷, out琛ㄧず杈撳嚭綾誨瀷. 涓嬮潰鏄暣涓▼搴? 1. ITaskCallback.aidl package com.cmcc.demo; interface ITaskCallback { void
actionPerformed(int actionId); } 2.
ITaskBinder.aidl package com.cmcc.demo; import com.cmcc.demo.ITaskCallback; interface ITaskBinder {
boolean isTaskRunning();
void stopRunningTask();
void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb); } 3. MyService.java package com.cmcc.demo; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; public class MyService extends Service { @Override public void onCreate() { printf("service create"); } @Override public void onStart(Intent intent, int startId) { printf("service start id=" + startId); callback(startId); } @Override public IBinder onBind(Intent t) { printf("service on bind"); return mBinder; } @Override public void onDestroy() { printf("service on destroy"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { printf("service on unbind"); return super.onUnbind(intent); } public void onRebind(Intent intent) { printf("service on rebind"); super.onRebind(intent); } private void printf(String str) { Log.e("TAG", "###################------ " + str + "------"); } void callback(int val) { final int N = mCallbacks.beginBroadcast(); for (int i=0; i<N; i++) { try { mCallbacks.getBroadcastItem(i).actionPerformed(val); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } mCallbacks.finishBroadcast(); } private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() { public void stopRunningTask() { } public boolean isTaskRunning() { return false; } public void registerCallback(ITaskCallback cb) { if (cb != null) mCallbacks.register(cb); } public void unregisterCallback(ITaskCallback cb) { if (cb != null) mCallbacks.unregister(cb); } }; final RemoteCallbackList<ITaskCallback> mCallbacks = new RemoteCallbackList<ITaskCallback>(); } 4.
MyActivity.java package com.cmcc.demo; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.Color; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.AbsoluteLayout; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.PrintWriter; public class MyActivity
extends Activity { private Button btnOk; private Button btnCancel; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.test_service); btnOk = (Button)findViewById(R.id.btn_ok); btnCancel = (Button)findViewById(R.id.btn_cancel); btnOk.setText("Start Service"); btnCancel.setTag("Stop Service"); btnOk.setOnClickListener(new OnClickListener()
{ public void onClick(View v) { onOkClick(); } }); btnCancel.setOnClickListener(new OnClickListener()
{ public void onClick(View v) { onCancelClick(); } }); } void onOkClick() { Bundle args = new Bundle(); Intent intent = new Intent(this, MyService.class); intent.putExtras(args); //printf("send intent to start"); //startService(intent); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); startService(intent); } void onCancelClick() { Intent intent = new Intent(this, MyService.class); //printf("send intent to stop"); unbindService(mConnection); //stopService(intent); } private void printf(String str) { Log.e("TAG", "###################------ " + str + "------"); } ITaskBinder mService; private ServiceConnection mConnection = new
ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = ITaskBinder.Stub.asInterface(service); try { mService.registerCallback(mCallback); } catch (RemoteException e) { } } public void onServiceDisconnected(ComponentName
className) { mService = null; } }; private ITaskCallback mCallback = new
ITaskCallback.Stub() { public void actionPerformed(int id) { printf("callback id=" + id); } };
妯℃嫙鍣≧AM姣旇緝灝忥紝鍙湁8M鍐呭瓨錛屽綋鎴戞斁鍏ョ殑澶ч噺鐨勫浘鐗囷紙姣忎釜100澶欿宸﹀彸錛夛紝灝卞嚭鐜頒笂闈㈢殑鍘熷洜銆傜敱浜庢瘡寮犲浘鐗囧厛鍓嶆槸鍘嬬緝鐨勬儏鍐點傛斁鍏ュ埌Bitmap鐨勬椂鍊欙紝澶у皬浼氬彉澶э紝瀵艱嚧瓚呭嚭RAM鍐呭瓨錛屽叿浣撹В鍐沖姙娉曞涓嬶細
//瑙e喅鍔犺澆鍥劇墖 鍐呭瓨婧㈠嚭鐨勯棶棰?/span>
//Options 鍙繚瀛樺浘鐗囧昂瀵稿ぇ灝忥紝涓嶄繚瀛樺浘鐗囧埌鍐呭瓨
BitmapFactory.Options opts = new BitmapFactory.Options();
//緙╂斁鐨勬瘮渚嬶紝緙╂斁鏄緢闅炬寜鍑嗗鐨勬瘮渚嬭繘琛岀緝鏀劇殑錛屽叾鍊艱〃鏄庣緝鏀劇殑鍊嶆暟錛孲DK涓緩璁叾鍊兼槸2鐨勬寚鏁板?鍊艱秺澶т細瀵艱嚧鍥劇墖涓嶆竻鏅?/span>
opts.inSampleSize = 4;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);
...
//鍥炴敹
bmp.recycle();
閫氳繃涓婇潰鐨勬柟寮忚В鍐充簡錛屼絾鏄繖騫朵笉鏄渶瀹岀編鐨勮В鍐蟲柟寮忋?/span>
閫氳繃涓浜涗簡瑙o紝寰楃煡濡備笅錛?/span>
浼樺寲Dalvik铏氭嫙鏈虹殑鍫嗗唴瀛樺垎閰?/span>
瀵逛簬Android騫沖彴鏉ヨ錛屽叾鎵樼灞備嬌鐢ㄧ殑Dalvik Java VM浠庣洰鍓嶇殑琛ㄧ幇鏉ョ湅榪樻湁寰堝鍦版柟鍙互浼樺寲澶勭悊錛屾瘮濡傛垜浠湪寮鍙戜竴浜涘ぇ鍨嬫父鎴忔垨鑰楄祫婧愮殑搴旂敤涓彲鑳借冭檻鎵嬪姩騫叉秹GC澶勭悊錛屼嬌鐢?dalvik.system.VMRuntime綾繪彁渚涚殑setTargetHeapUtilization鏂規硶鍙互澧炲己紼嬪簭鍫嗗唴瀛樼殑澶勭悊鏁堢巼銆傚綋鐒跺叿浣?鍘熺悊鎴戜滑鍙互鍙傝冨紑婧愬伐紼嬶紝榪欓噷鎴戜滑浠呰涓嬩嬌鐢ㄦ柟娉? private final static float TARGET_HEAP_UTILIZATION = 0.75f; 鍦ㄧ▼搴弌nCreate鏃跺氨鍙互璋冪敤 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 鍗沖彲銆?/span>
Android鍫嗗唴瀛樹篃鍙嚜宸卞畾涔夊ぇ灝?/span>
瀵逛簬涓浜汚ndroid欏圭洰錛屽獎鍝嶆ц兘鐡墮鐨勪富瑕佹槸Android鑷繁鍐呭瓨綆$悊鏈哄埗闂錛岀洰鍓嶆墜鏈哄巶鍟嗗RAM閮芥瘮杈冨悵鍟紝瀵逛簬杞歡鐨勬祦鐣呮ф潵璇碦AM瀵?鎬ц兘鐨勫獎鍝嶅崄鍒嗘晱鎰燂紝闄や簡 浼樺寲Dalvik铏氭嫙鏈虹殑鍫嗗唴瀛樺垎閰嶅錛屾垜浠繕鍙互寮哄埗瀹氫箟鑷繁杞歡鐨勫鍐呭瓨澶у皬錛屾垜浠嬌鐢―alvik鎻愪緵鐨?dalvik.system.VMRuntime綾繪潵璁劇疆鏈灝忓爢鍐呭瓨涓轟緥:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //璁劇疆鏈灝廻eap鍐呭瓨涓?MB澶у皬銆傚綋鐒跺浜庡唴瀛樺悆绱ф潵璇磋繕鍙互閫氳繃鎵嬪姩騫叉秹GC鍘誨鐞?/span>
]]>
]]>
http://labs.chinamobile.com/community/my_blog/517/4850
鍦ˋndroid涓? 姣忎釜搴旂敤紼嬪簭閮藉彲浠ユ湁鑷繁鐨勮繘紼? 鍦ㄥ啓UI搴旂敤鐨勬椂鍊? 緇忓父瑕佺敤鍒癝ervice.
鍦ㄤ笉鍚岀殑榪涚▼涓? 鎬庢牱浼犻掑璞″憿? 鏄劇劧, Java涓笉鍏佽璺ㄨ繘紼嬪唴瀛樺叡浜? 鍥犳浼犻掑璞? 鍙兘鎶婂璞℃媶鍒嗘垚鎿嶄綔緋葷粺鑳界悊瑙g殑綆鍗曞艦寮? 浠ヨ揪鍒拌法鐣屽璞¤闂殑鐩殑. 鍦↗2EE涓?閲囩敤RMI鐨勬柟寮? 鍙互閫氳繃搴忓垪鍖栦紶閫掑璞? 鍦ˋndroid涓? 鍒欓噰鐢ˋIDL鐨勬柟寮? 鐞嗚涓夾IDL鍙互浼犻払undle,瀹為檯涓婂仛璧鋒潵鍗存瘮杈冮夯鐑?
2. String, CharSequence涓嶉渶瑕佺壒孌婂0鏄?/strong>
3. List, Map鍜孭arcelables綾誨瀷, 榪欎簺綾誨瀷鍐呮墍鍖呭惈鐨勬暟鎹垚鍛樹篃鍙兘鏄畝鍗曟暟鎹被鍨? String絳夊叾浠栨瘮鏀寔鐨勭被鍨?
(
(鍙﹀: 鎴戞病灝濊瘯Parcelables, 鍦‥clipse+ADT涓嬬紪璇戜笉榪? 鎴栬浠ュ悗浼氭湁鎵鏀寔).
涓嬮潰鏄疉IDL璇硶:
// 鏂囦歡鍚? SomeClass.aidl
// 鏂囦歡鍙互鏈夋敞閲? 璺焜ava鐨勪竴鏍?/strong>
// 鍦╬ackage浠ュ墠鐨勬敞閲? 灝嗕細琚拷鐣?
// 鍑芥暟鍜屽彉閲忎互鍓嶇殑娉ㄩ噴, 閮戒細琚姞鍏ュ埌鐢熶駭java浠g爜涓?
package com.cmcc.demo;
// import 寮曞叆璇彞
int getCustomerList(in String branch, out String[] customerList);
}
.鎶涘嚭鐨勫紓甯鎬笉瑕佽繑鍥炵粰璋冪敤鑰? 璺ㄨ繘紼嬫姏寮傚父澶勭悊鏄笉鍙彇鐨?
.IPC璋冪敤鏄悓姝ョ殑銆傚鏋滀綘鐭ラ亾涓涓狪PC鏈嶅姟闇瑕佽秴榪囧嚑姣鐨勬椂闂存墠鑳藉畬鎴愬湴璇濓紝浣犲簲璇ラ伩鍏嶅湪Activity鐨勪富綰跨▼涓皟鐢ㄣ?涔熷氨鏄疘PC璋冪敤浼氭寕璧峰簲鐢ㄧ▼搴忓鑷寸晫闈㈠け鍘誨搷搴? 榪欑鎯呭喌搴旇鑰冭檻鍗曡搗涓涓嚎紼嬫潵澶勭悊.
.涓嶈兘鍦ˋIDL鎺ュ彛涓0鏄庨潤鎬佸睘鎬с?/strong>
1. 澹版槑涓涓帴鍙g被鍨嬬殑鍙橀噺錛岃鎺ュ彛綾誨瀷鍦?aidl鏂囦歡涓畾涔夈?/strong>
2. 瀹炵幇ServiceConnection銆?/strong>
3. 璋冪敤ApplicationContext.bindService(),騫跺湪ServiceConnection瀹炵幇涓繘琛屼紶閫?
4. 鍦⊿erviceConnection.onServiceConnected()瀹炵幇涓紝浣犱細鎺ユ敹涓涓狪Binder瀹炰緥(琚皟鐢ㄧ殑Service). 璋冪敤
YourInterfaceName.Stub.asInterface((IBinder)service)灝嗗弬鏁拌漿鎹負YourInterface綾誨瀷銆?/strong>
5. 璋冪敤鎺ュ彛涓畾涔夌殑鏂規硶銆?浣犳昏媯嫻嬪埌DeadObjectException寮傚父錛岃寮傚父鍦ㄨ繛鎺ユ柇寮鏃惰鎶涘嚭銆傚畠鍙細琚繙紼嬫柟娉曟姏鍑恒?/strong>
6. 鏂紑榪炴帴錛岃皟鐢ㄦ帴鍙e疄渚嬩腑鐨凙pplicationContext.unbindService()
]]>
class bluetoothsetting鏄疷I鐨勫叆鍙o紝閫氳繃鎸塨utton scan榪涘叆鎼滅儲鐘舵侊紝applicaton灞傝皟鐢╞luetoothdevice, 鎺ョ潃灝辨槸bluetoothservice鐨勮皟鐢紝 bluetoothservice璋冪敤native鏂規硶錛屽埌姝ゅ叏閮ㄧ殑java紼嬪簭緇撴潫浜嗐備笅闈㈢殑璋冪敤閮芥槸JNI, cpp瀹炵幇鐨勩俛ndroid_server_bluetoothservice.cpp閲岄潰瀹炵幇浜唍avtive鏂規硶錛屾渶緇堥氳繃dbus灝佽錛岃皟鐢℉CID deamon 鐨刦unction DiscoverDevice.