2011-12-23 28 views
0

我想使用Messenger作爲我的appwidget和活動之間的IPC機制。信使消失從捆綁onCreate

我執行以下操作: 我創建了一個意圖,當我的appwidget上的按鈕被單擊時,開始一個特定的活動。

intent = new Intent(mContext, TorchLightActivity.class); 
intent.putExtra(RPC, new Messenger(mHandler)); 
intent.putExtra(TYPE, mType); 
... 
final PendingIntent actionPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); 
remoteView.setOnClickPendingIntent(layout, actionPendingIntent); 

當我點擊我的微件按鈕活動啓動

onCreate(...) 
final Bundle bun = getIntent().getExtras(); 
// Get null here 
mMessanger = (Messenger) bun.get(FlashlightModule.RPC); 
// Working great 
mType = bun.getInt(FlashlightModule.Type); 

當在捆綁的樣子,我可以看到的唯一額外的數據我已經是FlashlightModule.Type例如int值。

這樣做的目的是從一開始就創建額外(見Get the intent from onCreate in Android),並使用setData從一開始就使用(見Application widget with bundle?

是否有可能在所有AppWidget之間的信使傳遞給我自己的活動?

謝謝。

+0

我發現了一個奇怪的行爲,也許有人可以闡明它。我正在使用setData來區分它與類似的意圖(我使用相同的活動,但具有不同的額外)。突然刪除setData時,包裹正確傳遞。 – 2011-12-23 22:08:04

回答

0

我試圖使用Messenger作爲我的appwidget和活動之間的IPC機制。

這沒有任何意義。

你的AppWidgetProvider實例會活幾毫秒 - 而且你做錯了。它絕不會有機會通過Messenger或任何其他方式在您的活動中使用「IPC」。

而且,你永遠不應該創建一個從BroadcastReceiver你期望住過去的onReceive()(應onUpdate()AppWidgetProvider)的東西(如AppWidgetProvider),比如你Handler,更不用說Messenger

當您的活動希望更新應用程序小部件的UI時,它可以創建RemoteViews並更新應用程序小部件。

+0

我沒有解釋得很好。接收消息的對象作爲靜態對象的一部分而存在,因此只要進程處於活動狀態,它就會一直存在。在我的情況下,AppWidget BroadcastReceiver什麼都不做。 – 2011-12-23 22:05:37

+0

@EfiMK:「接收消息的對象作爲一個靜態對象的一部分而存在,因此它只要進程存活就存在」 - 但是你肯定不需要'Handler'或'Messenger'。只需在「靜態對象」上調用一個方法即可。 – CommonsWare 2011-12-23 22:09:40

+0

同意,有時你需要別人來告訴你明顯的。但是你知道爲什麼包裹不屬於臨時演員嗎? – 2011-12-24 10:41:21