首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用通知打开安卓应用程序& getLaunchIntentForPackage不通过LauncherActivity

使用通知打开安卓应用程序& getLaunchIntentForPackage不通过LauncherActivity
EN

Stack Overflow用户
提问于 2020-09-14 08:21:27
回答 1查看 328关注 0票数 1

我使用Firebase (FCM)向用户显示推送通知,我遇到了一个奇怪的问题。

我的代码适用于以下场景(使用FirebaseMessagingService):

  • App in前台-在onReceive()中接收数据,在应用程序中显示弹出;在onReceive()中显示后台接收数据的
  • 应用程序,并显示给用户的通知。如果这是点击,应用程序将被带回到前面。open.
  • App的意图是在LauncherActivity中接收的,后面是一个finish()调用,它带我进行任何我已经完全封闭的活动--与背景完全相同。在调用finish()之前,App将启动并在LauncherActivity中进行处理。

这里是有趣的地方:

  • App完全关闭了->,通过通知打开它(意图在LauncherActivity中接收),->将应用程序放在后台,并在单击此通知时发送另一个通知->,LauncherActivity被完全忽略(onCreate不再被调用),我被直接带到我已经进行的任何活动中。这里的意图没有额外的或类别。为什么在这种特殊情况下绕过LauncherActivity?请记住,如果应用程序最初是正常启动的(而不是通过单击notification)

),这是很好的。

代码语言:javascript
运行
复制
Intent mainIntent = getPackageManager().getLaunchIntentForPackage(getPackageName()); 
if (mainIntent != null) {
    mainIntent.addCategory(NOTIFICATION_CATEGORY);
    mainIntent.putExtra(.........);
}
PendingIntent pendingMainIntent = PendingIntent.getActivity(this, SERVICE_NOTIFICATION_ID, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, context.getString(R.string.default_notification_channel_id));
notificationBuilder.setContentIntent(pendingMainIntent);
//.....icon, color, pririty, autoCancel, setDefaults, setWhen, setShowWhen, contentText, setStyle

NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(
            getString(R.string.default_notification_channel_id),
            getString(R.string.default_notification_channel),
            NotificationManager.IMPORTANCE_HIGH
        );
        notificationManager.createNotificationChannel(channel);
        notificationBuilder.setChannelId(getString(R.string.default_notification_channel_id));
    }
    notificationManager.notify(SERVICE_NOTIFICATION_ID, notificationBuilder.build());
}

如果有任何想法我会很感激。谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2020-09-15 12:03:16

当你第一次启动一个应用程序时,安卓会记住用来启动它的Intent。通常,当您从主屏幕启动应用程序时,这是一个包含ACTION=MAIN和CATEGORY=LAUNCHER的ACTION=MAIN。如果您的应用程序然后转到后台(无论出于什么原因),用户稍后点击主屏幕上的图标,就会使用相同的启动Intent。安卓将这与第一次启动应用程序的Intent相匹配,如果这些匹配,安卓不会启动新的Activity,它只会将包含应用程序的任务从后台带到前台,不管移动到后台时处于何种状态。在正常情况下,这正是您想要的行为(以及用户期望的行为)。

然而,当应用程序第一次从Notification上启动时,这可能会把事情搞砸。在你的情况下,这就是你所看到的。你从Notification启动应用程序,安卓会记住使用的Intent (从Notification),当你稍后启动应用程序时(同样是从Notification),安卓将Notification中的Intent与第一次启动应用程序的Intent相匹配,并认为您希望将现有的应用任务从后台带到前台。

根据你想要的行为,有几种方法可以解决这个问题。最好的做法可能是不要从Activity ( ACTION=MAIN和CATEGORY=LAUNCHER)中启动根Notification。相反,启动一个不同的Activity,让Activity决定下一步应该做什么(即:根据应用程序的状态,重定向到根Activity或其他什么东西)。您还应该在放置在NO_HISTORY中的Intent上设置IntentNotification标志。这将确保安卓不会将这款Intent视为发布该应用程序的原因。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63880616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档