【问题标题】:Android - When launch the same activity from widget with different extras, how to prevent the same instance show up after returned from HOME button?Android - 当从具有不同附加功能的小部件启动相同的活动时,如何防止从 HOME 按钮返回后显示相同的实例?
【发布时间】:2010-11-05 00:28:39
【问题描述】:

我有一个包含 4 个按钮来显示 4 个股票价格的小部件,每个按钮都会启动到同一个活动 Quote.class 以显示股票详细信息。在 onUpdate() 中,它将使用带有股票代码的附加内容设置 pendingIntent。在我点击按钮 A 后,它转到显示股票 A 的报价活动。然后我点击返回按钮到主屏幕,报价活动调用 onDestroy(),当我点击按钮 B 时,股票 B 将正确显示。但是,当我在显示股票 A 后点击 HOME 按钮时,报价活动仅调用 onStop 而不调用 onDestroy(),然后当我点击按钮 B 时,它将调用 onStart() 并显示显示股票 A 的相同实例。

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 并获得新的附加功能?任何帮助表示赞赏。谢谢

【问题讨论】:

    标签: android android-widget


    【解决方案1】:
    • 如果您进行简单的任务切换(如按住 HOME 按钮),onDestroy 可能不会被调用是正常的。如果需要清理,需要进入onPause。
    • 我相信问题在于你有一个PendingIntent,它只是额外的不同。 PendingIntent 被缓存,因此如果您使用两个具有相同操作和数据的,它们将相互覆盖。您可以通过给每个随机数据来规避这种情况。尝试在数据中传递符号,而不是通过额外的符号(无论如何这是首选)。

    【讨论】:

    • 我应该如何传递数据?您的意思是使用 intent.setData(Uri uri) 方法吗?
    • 是的。为股票创建自己的简单 Uri。
    • 它适用于随机数据吗?我避免缓存待处理意图的方法是为不同的按钮/小部件使用不同的意图名称。
    • 我还不得不在我的 Activity 类的onNewIntent() 方法中调用setIntent(intent)。
    【解决方案2】:

    你可以试试这个:

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

    您的活动不会出现在历史堆栈中

    【讨论】:

      【解决方案3】:
      clickIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
      

      Since: API Level 1 如果设置,新活动不会保留在 历史堆栈。一旦用户导航离开它, 活动结束。这也可以用 noHistory 设置 属性。

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

      【讨论】:

        【解决方案4】:

        当你按下 home 键时,很可能活动不会被破坏。在这种情况下,它会进入 pause 状态。所以,我猜您启动股票视图的代码将驻扎在 onCreate 而不是 onResume 中。因此,将这些移至 onResume 应该可以解决问题。

        【讨论】:

        • 我已经尝试在 onResume 中调用 getIntent().getStringExtra("Symbol") 而不是 onCreate。但是,每次单击小部件中的其他按钮时,它仍然会获得符号 A。看起来同样的额外费用会留在那里。反正有没有更换一个新的额外?我应该在 onStop() 中做些什么吗?
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-31
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 2018-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多