当前位置: 首页 > 知识库问答 >
问题:

Android:如果从最近的任务启动应用程序,活动正在使用旧意图

尹何平
2023-03-14

我正在实施GCM。我的应用程序有两个活动,比如AB。我正在使用此代码从通知栏启动B

long when = System.currentTimeMillis();
NotificationManager notificationManager =
    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
String title = context.getString(R.string.app_name);        
Notification notification = new Notification(R.drawable.app_notification_icon, "De Centrale", when);//message
Intent notificationIntent = new Intent(context, B.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); //|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(context, title, msg, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

NotificationBar打开带有Intent的活动B,说“B-通知-意图”,然后我使用后退按钮从B打开活动A,然后我再次启动BA有一个新的Intent(说“B-A-意图”)。我使用下面的代码:

intent = new Intent(this, B.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);              
startActivity(intent);

然后我在B中获得新数据(即B的屏幕被刷新)。但如果我按下Home(主页)按钮,然后从最近的应用程序启动应用程序,那么我会变老B屏幕上显示“B-notification-intent”。相反,我想要最新的意图,即“B-A-Intent”。我在B中使用此代码:

@Override
protected void onCreate(Bundle b)
{
    fetchDataFromDB(getIntent());           
}

@Override
protected void onNewIntent(Intent intent)
{
    fetchDataFromDB(intent);        
}

所以有人请帮我得到我当前的屏幕(意图)。

共有2个答案

司寇正志
2023-03-14

出于某种原因,bkDJ的/公认的答案对我不起作用。只有当被接受的答案对你也不适用时,才尝试以下方法

无论是标记_ACTIVITY_从_HISTORY启动_,还是在第一次处理意图后将其设置为布尔值,都不会阻止意图被重用。

我必须在出现此问题的每个意图中添加一个时间戳。并且只有当时间戳不超过30秒时才执行意图。

这样地:

Intent intent = new Intent(CONTEXT, TargetActivity.class);
Calendar now = Calendar.getInstance();
intent.putExtra("timestampOfIntentInMilliseconds", now.getTimeInMillis());
// put your actual extras to the intent 

然后在处理意图时:

Bundle extras = intent.getExtras();
long timestampOfIntentInMilliseconds = extras.getLong("timestampOfIntentInMilliseconds");
now = Calendar.getInstance();
if(now.getTimeInMillis() < (timestampOfIntentInMilliseconds + 30000))
{
   // do what you want to do with the intent
}
卫博
2023-03-14

我还注意到,有时从最近启动的活动onCreate()会变得过时Intents,但有一种方法可以检查它,以便您可以适当地处理Intent

JAVA:

protected boolean wasLaunchedFromRecents() {
    return (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
}

静态编程语言

fun wasLaunchedFromRecents(): Boolean {
    val flags: Int = intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    return flags == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
}

在我看来,这个标志的名称很糟糕(参考最近列表的其他标志实际上使用了这个词,例如,flag_ACTIVITY_EXCLUDE_FROM_Recentsflag_ACTIVITY_RETAIN_In_Recents),文档从未更新,以反映出许多流行的Android设备都有一个专门的最近事件按钮:

此标志通常不由应用程序代码设置,但如果此活动是从历史记录启动的(长按home键),则由系统为您设置。

(注意:我知道几年前你用另一种方式解决了你的问题,但这个问题是“android old intent recent”的顶级搜索结果之一,其他相关问题都没有提到这个标志,所以希望这个答案能帮助其他人。)

 类似资料:
  • 我正在开发一款针对ICS手机的应用程序。 在应用程序中,我有一个飞溅屏幕和几个其他屏幕,可以从飞溅屏幕或通过NFC触摸启动。我的一个活动包含以下意图过滤器: 由于某些原因,我无法理解,每当启动包含上述意图过滤器的活动时,当用户按下“主页”按钮时,该活动不会出现在“最近的应用”列表中。通过调试器,我验证了它没有被销毁,只是停止了。 如果启动屏幕在ThingActivity之前打开,则启动将显示在最近

  • 在我的应用程序中,我有一个在后台(和前台)运行。 在这个中,有一个,当它完成时,我想在某个中启动应用程序并在中自动执行一些操作,即使我的应用程序被杀死或关闭,我也希望它能正常工作。 我看到了一些答案,这是其中之一,但它对我不起作用。我找到了一个更好的解决方案,并将其作为答案发布在下面,但仍然只有在应用程序关闭但未完全关闭时才有效。 如何从后台启动,即使应用程序已关闭或关闭?

  • 我的应用程序有如下活动堆栈 A:加载活动 B:主要活动 C:细节活动 清单是这样的 当我从启动器启动应用程序时,它充当A- 但当我从通知启动应用程序时,因为我不想显示加载屏幕,启动活动B。所以,用户可以导航B- 但当用户在活动C中按Home键并从最近的应用程序列表中选择应用程序时,B会重新启动,状态不会保留。所以C活动总是消失。 我尝试了许多标志选项,但我没有找到解决方案。我想要的是应用程序的行为

  • 当我收到通知时,我的应用和活动在我最近的应用列表中。当我点击通知时,我希望通知的意图得到尊重。在我的例子中,我想重新启动活动(暴力)并传递新的意图:所以,完成,然后重新创建。我正在阅读一些标签,比如和,但我对它们的理解还不够,不知道如何强制“完成然后重新创建”我的活动。哦,这个活动就是main ACTIVITY。 GcmListenerService中的代码片段使用 用于发送通知意图 或者说 如果

  • 我的应用程序包含多个活动,主要活动(A)是在启动模式单层,每个over活动都在单层模式。 如果我这样导航,我会选择singleInstance来防止不受限制的导航:A- 它按预期工作。 问题:如果我在- 如果从“最近的应用程序”菜单打开应用程序,为什么任务历史记录不保留? 多谢你的帮忙

  • 另外,是否有可能在保留用户数据的同时清除使用ADB的应用程序的缓存?似乎清除了所有用户数据。我只想清除缓存。 我之所以这么问是因为我正在对一些用户应用程序进行性能测试。为了使每个测试有效,我希望确保没有任何用户应用程序有任何任务,活动,服务和缓存已经在后台。