FLAG_ACTIVITY_NEW_TASK对小部件没有影响

时间:2012-01-18 06:57:10

标签: android widget

我有一个小部件,我可以从中开始两项活动:

public final void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) {

    // some stuff here
    ...

    Intent intent = new Intent(context.getApplicationContext(), B.class);
    // forces intent update in pending intent
    intent.setAction("NO CACHE: " + System.currentTimeMillis());            
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.rlFrame, pendingIntent);

    intent = new Intent(context.getApplicationContext(), A.class);
    // forces intent update in pending intent
    intent.setAction("NO CACHE: " + System.currentTimeMillis());
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.ivWidgetIcon, pendingIntent);

    // some stuff here

}

情景A:

  • 从小部件启动活动A
  • 按HOME按钮
  • 从小部件
  • 启动活动B.

结果:

这两项活动与活动A的任务完全相同。

情景B:

  • 从小部件
  • 启动活动B.
  • 按HOME按钮
  • 从小部件启动活动A

结果:

两个活动与活动B以root身份处于同一任务中。

似乎完全忽略了FLAG_ACTIVITY_NEW_TASK。我希望这两项活动都是在不同的任务中启动的。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

使用以下标志

FLAG_ACTIVITY_MULTIPLE_TASK

答案 1 :(得分:0)

Here says:

  

如果传递给startActivity()的意图包含FLAG_ACTIVITY_NEW_TASK标志,则系统会查找另一个任务以容纳新活动。通常,这是一项新任务。但是,它不一定是。如果已存在与新活动具有相同亲缘关系的现有任务,则会将活动启动到该任务中。如果没有,它开始一项新任务。

使用singletask可能会解决您的问题。

答案 2 :(得分:0)

来自PendingIntent documentation:

  

PendingIntent本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将保持可用于已经给出它的其他进程。如果创建应用程序稍后重新检索相同类型的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件以及相同的标志),它将接收表示同一令牌的PendingIntent,如果它仍然有效,并且可以因此调用cancel()将其删除。

这意味着为了让它知道它有一个新的PendingIntent,它所看到的事物中至少有一个必须是不同的。您的Intent具有不同的Intent,但Intent.FLAG_ACTIVITY_NEW_TASK动作相同。最容易改变的可能是requestCode(参见粗体)。

  

//这里的一些东西   ...

     

Intent intent = new Intent(context.getApplicationContext(),B.class);   //强制意图更新挂起意图intent.setAction(“NO CACHE:   “+ System.currentTimeMillis());
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);的PendingIntent   pendingIntent = PendingIntent.getActivity(context, 0 ,intent,0);   views.setOnClickPendingIntent(R.id.rlFrame,pendingIntent);

     

intent = new Intent(context.getApplicationContext(),A.class); //   强制意图更新未决意图intent.setAction(“NO CACHE:”+   System.currentTimeMillis的());   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); pendingIntent =   PendingIntent.getActivity(context, 1 ,intent,0);   views.setOnClickPendingIntent(R.id.ivWidgetIcon,pendingIntent);

     

//这里的一些东西

此外,在我的应用程序中,getActivity()被设置为{{1}}中的flags参数。不确定这是否有所作为。

答案 3 :(得分:0)

对于我遇到的类似情况:

我将我的活动设置为android:launchMode =“singleTop”,然后在活动中覆盖onNewIntent(Intent)方法,以处理来自小部件的新意图。

https://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent)