25

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

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 打开B带有 Intent 的 Activity,例如“B-notification-intent”,然后我使用“后退”按钮打开 Activity,然后再次A从拥有新 Intent(例如“BA-intent”)启动。我使用下面的代码:BBA

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

然后我得到新数据B(即B刷新屏幕)。但是,如果我按下主页按钮,然后从最近的应用程序启动应用程序,那么我会看到B带有“B-notification-intent”的旧屏幕。相反,我想要最新的 Intent,即“BA-intent”。我正在使用此代码B

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

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

所以任何人都请帮助我获取我当前的屏幕(意图)。

4

2 回答 2

43

我还注意到,有时从“最近”启动时Activity'sonCreate()会变得陈旧Intent,但有一种方法可以检查它,以便您可以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, FLAG_ACTIVITY_RETAIN_IN_RECENTS)并且文档从未更新以反映许多流行的 Android 设备都有一个专门的最近按钮的事实:

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

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

于 2015-04-07T10:22:45.177 回答
0

出于某种原因,bkDJ 的 / 接受的答案对我不起作用。仅当接受的答案也对您不起作用时,请尝试以下操作:

FLAG_ACTIVITY_LAUNCHED_FROM_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
}
于 2021-03-21T18:29:21.793 回答