2011-12-23 33 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