Android - 当从具有不同附加功能的小部件启动相同的活动时,如何防止从HOME按钮返回后显示相同的实例?

时间:2010-11-05 00:28:39

标签: android android-widget

我有一个小部件,其中包含4个显示4个股票价格的按钮,每个按钮都将启动到相同的活动Quote.class中以显示股票详细信息。在onUpdate()中,它将使用库存符号设置pendingIntent和extras。在我按下按钮A之后,它进入显示股票A的Quote活动。然后我点击BACK按钮进入主屏幕,Quote活动调用onDestroy(),当我点击按钮B时,股票B将正确显示。但是,当我在显示库存A后点击HOME按钮时,Quote活动只调用onStop而不调用onDestroy(),然后当我按下按钮B时,它将调用onStart()并显示显示库存A的相同实例。 / p>

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.etappwidget); 
setQuoteIntent(context, views, R.id.view1, "BAC", 1);
setQuoteIntent(context, views, R.id.view2, "C", 2);
setQuoteIntent(context, views, R.id.view3, "GOOG", 3);
setQuoteIntent(context, views, R.id.view4, "AAPL", 4);

 private static void setQuoteIntent(Context context, RemoteViews views, int viewId, String symbol, int requestCode) {
 Intent i = new Intent(context, Quote.class);
 i.putExtra("SYMBOL", symbol);
 i.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
 PendingIntent pi = PendingIntent.getActivity(context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
 views.setOnClickPendingIntent(viewId, pi);

}

最初我认为在Intent中添加一个标志应该可以解决这个问题。但我试过了 i.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK或FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_NO_HISTORY),它们都没有任何区别。

那么有什么方法可以让它发挥作用?如何从HOME按钮中删除历史堆栈?当我按下按钮B时,如何在Quote活动中调用onCreate并获取新的额外内容?任何帮助表示赞赏。谢谢

5 个答案:

答案 0 :(得分:2)

  • 如果您执行简单的任务切换(例如按住HOME按钮),onDestroy可能无法调用是正常的。如果您需要进行清理,则需要进入onPause
  • 我认为问题在于你有PendingIntent只有额外的差别。 PendingIntents被缓存,因此如果您使用具有相同操作和数据的两个,它们将相互覆盖。你可以通过给每个随机数据来规避这一点。尝试在数据中传递符号,而不是通过额外传递(无论如何都是首选)。

答案 1 :(得分:1)

你可以试试这个:

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

您的活动将不会在历史堆栈中看到

答案 2 :(得分:1)

clickIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  

自:API级别1如果设置,则新活动不会保留在   历史堆栈。一旦用户离开它,就会   活动结束了。这也可以使用noHistory设置   属性。

这解决了我在实现小部件活动时遇到的同样问题。

答案 3 :(得分:0)

当你按回家时,很可能活动不会被破坏。在这种情况下,它被置于暂停状态。因此,我猜您启动股票视图的代码将驻留在 onCreate 而不是 onResume 。因此,将它们移到 onResume 可以解决问题。

答案 4 :(得分:0)

如果您在Intent中使用不同的Action并使用SingleTop或类似的标志并覆盖onNewIntent来检测应该执行该操作的正确操作。您需要准备好处理onCreate和onNewIntent中的意图。