我正在实施 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);
}
所以有人请帮助我获取当前屏幕(意图)。
我还注意到,有时从“最近”启动时,
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”的热门搜索结果之一,并且其他相关问题都没有提到这个标志,所以希望这个答案可以帮助某人否则。)
对我不起作用。仅当接受的答案也不适合您时,请尝试以下操作: 无论是 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
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
}
来清除意图。