編輯:Android開發教程
App->Service->Service Start Arguments Controller
本例是ApiDemos關於Service的最後一個例子,這個例子的主要目的是介紹如何向Service傳遞參數。前面的例子忽略了一個重要的問題: Service 的onStartCommand 或是 onStart(2.1版本之前)是使用調用它的Android組件(通常是Activity)同一個Thread來執行的,對應Activity來說,這個Thread通常是UI Thread,前面的Service例子都是提供非常簡單的服務,對於UI 性能不會有很大影響,但如果在Service中使用了較費時的操作,如果網絡訪問,數據庫查詢,如果還是使用UI Thread來運行的話,就可能大大降低UI的響應性能,甚至出現ANR(Application Not Response)對話框,所以通常都是在Service新建一個線程來處理來自Client的請求。
Android.os 的Handler, HandlerThread, Loop, Message 常用於Service中,其中Handler介紹可以參見Android 系統Handler用法簡介。
Android 中每個Thread都可以有一Message Queue,但除UI Thread外,Thread缺省情況下不帶Message Queue, 要為一個Thread 創建一個Message Queue,可以參見下面代碼:
class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } }
Looper.prepare()用來創建一個Message Queue, Looper.loop() 處理消息直到Loop停止。 在Thread在創建的Handler將會和Thread的Message Queue關聯。Handler的handleMessage用來處理消息,其類型為Message類。
HandlerThread派生於Thread,用於方便創建一個帶Looper的Thread。本例就是使用了HandlerThread.
private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { ... } ... HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper);
ServiceStartArguments Service 使用一個新創建的Thread來處理來自Client的消息,這個Thread不是UI Thread,使用HandlerThread 創建一個帶Looper的線程,而具體的消息處理是由ServiceHandler的handleMessage來處理。
Message類定義了消息,可以含有對消息的描述description,類型what,缺省帶arg1,arg2, obj三個參數可以直接使用。 並提供了obtain()靜態函數來構造一個新的Message對象。
ServiceStartArguments.Controller 為ServiceStartArguments Service的Client。它定義了四個按鈕,通過Intent的Extra向Service傳遞參數:
startService(new Intent(Controller.this, ServiceStartArguments.class) .putExtra("name", "One")); startService(new Intent(Controller.this, ServiceStartArguments.class) .putExtra("name", "Two")); startService(new Intent(Controller.this, ServiceStartArguments.class) .putExtra("name", "Three") .putExtra("redeliver", true)); startService(new Intent(Controller.this, ServiceStartArguments.class) .putExtra("name", "Failure") .putExtra("fail", true));
這篇要實現的是一個仿微信的動畫效 果,雖然這種效果的實現在網上到處都有,但是我還是想站在中低端開發者的角度去告訴大家是如何實現的, 當然實現的方式有很多,我也只是列出
先來看一段代碼:public static void main(String[] args) { new Timer().schedule(new TimerT
好長時間沒有再接觸Android了,以至於GenyMotion出現這麼久了,我還沒有試用過,記得當時發布 Android Studio時,當天我就開始試用了,好吧,看到G
1.背景即將結束在sony移動的實習了,在最後的日子有一些傷感有一些感觸,對於android這個傾注一年心血的技術有太多話要說。感謝sony移動的各位大牛們給我這個機會,