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

问题描述 投票:0回答:3

我正在实施 GCM。我的应用程序有两个活动,即

A
B
。我正在使用此代码从通知栏启动
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 打开 Activity

B
,例如“B-notification-intent”,然后我使用“后退”按钮从
A
打开 Activity
B
,然后再次从
B
启动具有新 Intent 的
A
(说“B-A-意图”)。我使用下面的代码:

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

然后我在

B
中得到新数据(即
B
的屏幕被刷新)。 但是,如果我按“主页”按钮,然后从“最近使用的应用程序”启动该应用程序,那么我会看到带有“B-通知意图”的较旧的
B
屏幕。相反,我想要最新的意图,即“B-A-意图”。我在
B
中使用此代码:

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

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

所以有人请帮助我获取当前屏幕(意图)。

android android-intent notifications flags
3个回答
47
投票

我还注意到,有时从“最近”启动时,

Activity
onCreate()
会变得陈旧,但是
is
有一种方法可以检查这一点,以便您可以适当地处理Intent

JAVA:

Intent

科特林:

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_RECENTS
)并且文档从未更新以反映许多流行的 Android 设备都有专用的事实最近按钮:

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

(注意:我意识到您几年前以另一种方式解决了您的问题,但这个问题是“android oldintentcentre”的热门搜索结果之一,并且其他相关问题都没有提到这个标志,所以希望这个答案可以帮助某人否则。)


0
投票
bkDJ/接受的答案

对我不起作用。仅当接受的答案也不适合您时,请尝试以下操作: 无论是 FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 还是在第一次处理意图后为意图设置布尔值都不会阻止意图被重用。

我必须为发生此问题的每个意图添加时间戳。并且仅在时间戳不超过 30 秒时才执行意图。

像这样:

FLAG_ACTIVITY_RETAIN_IN_RECENTS

然后在处理意图时:

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



0
投票
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 }

来清除意图。

    

© www.soinside.com 2019 - 2024. All rights reserved.