編輯:Android開發教程
前面LocalService 主要是提供同一Application中組件來使用,如果希望支持不同應用或進程使用Service。可以通過 Messenger。使用Messgener可以用來支持進程間通信而無需使用AIDL。
下面步驟說明裡Messenger的使用方法:
在Service中定義一個Handler來處理來自Client的請求。
使用這個Handler創建一個Messenger (含有對Handler的引用).
Messenger創建一個IBinder對象返回給Client( onBind方法)。
Client 使用從Service返回的IBinder重新構造一個Messenger 對象,提供這個Messenger對象可以給Service 發送消息。
Service提供Handler接受來自Client的消息Message. 提供handleMessage來處理消息。
在這種方式下,Service沒有定義可以供Client直接調用的方法。而是通過”Message”來傳遞信息。
本例Messenger Service 涉及到兩個類 MessengerServiceActivities 和 MessengerService.
首先看看Service的定義,在 MessengerService定義了一個IncomingHandler ,用於處理來自Client的消息。
/**
* Handler of incoming messages from clients.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
case MSG_SET_VALUE:
mValue = msg.arg1;
for (int i=mClients.size()-1; i>=0; i--) {
try {
mClients.get(i).send(Message.obtain(null,
MSG_SET_VALUE, mValue, 0));
} catch (RemoteException e) {
// The client is dead. Remove it from the list;
// we are going through the list from back to front
// so this is safe to do inside the loop.
mClients.remove(i);
}
}
break;
default:
super.handleMessage(msg);
}
}
}
然後使用這個IncomingHandler定義一個Messenger。
final Messenger mMessenger = new Messenger(new IncomingHandler());
應為這種方法采用的“Bound” Service模式,onBind 需要返回一個IBind對象, 可以通過 mMessenger.getBinder()返回與這個Messenger關聯的IBinder對象,Client可以通過這個IBinder對象重新構造一個Messenger對 象,從而建立起與Service之間的通信鏈路。
@Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); }
這個例子單獨運行時(從Launcher啟動),這時接受到的Intent不含ACTION_SEARCH,和一個普通的Activity沒有什麼兩樣。在例(36)時,它是作為查
最近在做一款android手機上的音樂播放器,學習到了很多東西,像是Fragment,ActionBar的使用等等, 這裡就先介紹一下歌詞同步的實現問題。歌詞同步的實現
我們都知道,Android上的界面展示都是通過Activity實現的,Activity實在是太常用了,我相信大家都 已經非常熟悉了,這裡就不再贅述。但是Activity也
ScrollView是一種特殊的FrameLayout,使用ScrollView可以使用戶能夠滾動一個包含views的列表,這樣 做的話,就可以利用比物理顯示區域更大的空