如何从通知或应用程序图标单击 android 知道应用程序打开?

Posted

技术标签:

【中文标题】如何从通知或应用程序图标单击 android 知道应用程序打开?【英文标题】:How to know app open from notification or app icon click android? 【发布时间】:2019-03-20 06:42:20 【问题描述】:

实际上我想知道应用程序是从通知点击打开还是从应用程序图标点击打开,我从通知点击传递了一些参数。

 Intent notificationIntent = new Intent(context, SplashScreen.class);
        notificationIntent.putExtra("IS_FROM_NOTIFICATION", Utility.NOTI_TYPE_VERSE);
        notificationIntent.putExtra("firebase_node_name", Utility.FIREBASE_AFTERNOON_BIBLE_VERSE_NOTE);
        notificationIntent.putExtra("title", context.getResources().getString(R.string.menuAfternoonVerse));

并且这些数据进入启动屏幕并将其传递给相关活动,然后打开此活动,当我返回关闭应用程序时,现在应用程序处于后台状态,当我从后台恢复应用程序时,它将显示通知活动,

【问题讨论】:

当来自后台时,您希望显示其他活动而不是通知活动的问题是什么? 问题是点击通知后打开通知活动,然后关闭应用程序并从最近的应用程序打开它会打开通知活动这不会发生 实际上当我从最近的应用程序打开时,它会打开我的默认活动,而不是打开通知活动 【参考方案1】:

你可以检查:

if (!wasLaunchedFromRecents() && (myIntentData.getStringExtra("IS_FROM_NOTIFICATION").equals(Utility.NOTI_TYPE_1))) 
        // from notification
    

private fun wasLaunchedFromRecents(): Boolean 
    return getIntent().flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY === Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

【讨论】:

我已经尝试过了,但是当我从最近的应用程序返回时,我也得到了 IS_FROM_NOTIFICATION 值 它有价值吗? 是的,我在我的问题中定义了通过值,并且我还从最近的应用程序中获取了值, 只有应用图标点击启动应用我无法获得价值 获取值时,删除 getIntent().removeExtra("IS_FROM_NOTIFICATION ")【参考方案2】:
 Intent intent = new Intent(this, SplashScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("IS_FROM_NOTIFICATION", Utility.NOTI_TYPE_VERSE);
intent.putExtra("firebase_node_name", Utility.FIREBASE_AFTERNOON_BIBLE_VERSE_NOTE);
intent.putExtra("title", context.getResources().getString(R.string.menuAfternoonVerse));

PendingIntent pendingIntent = PendingIntent.getActivity(this, notificationId + 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder mBuilder1 = new NotificationCompat.Builder(this, "my_channel_01").setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle(getString(R.string.app_name)).setContentText(remoteMessage.getData().get("title")).setContentIntent(pendingIntent1);

mBuilder1.setAutoCancel(true);

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
         mBuilder1.setChannelId("my_channel_01");

         CharSequence name = "My New Channel";                   // The user-visible name of the channel.
         int importance = NotificationManager.IMPORTANCE_HIGH;

         NotificationChannel channel = new NotificationChannel("my_channel_01", name, importance); //Create Notification Channel
         mNotificationManager1.createNotificationChannel(channel);
  
  mNotificationManager1.notify((int) System.currentTimeMillis(), mBuilder1.build());

【讨论】:

【参考方案3】:

首先,当您将数据发送到初始屏幕时,将标志添加到意图,如下所示

Intent notificationIntent = new Intent(context, SplashScreen.class);
        notificationIntent.putExtra("IS_FROM_NOTIFICATION", Utility.NOTI_TYPE_VERSE);
        notificationIntent.putExtra("firebase_node_name", Utility.FIREBASE_AFTERNOON_BIBLE_VERSE_NOTE);
        notificationIntent.putExtra("title", context.getResources().getString(R.string.menuAfternoonVerse));
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

然后在通知活动 onBackPressed 不要调用finish()

【讨论】:

以上是关于如何从通知或应用程序图标单击 android 知道应用程序打开?的主要内容,如果未能解决你的问题,请参考以下文章

从 android 推送通知单击启动时,意图数据未在活动中更新

如何在 C# 中单击通知图标来聚焦模态对话框?

如何使用 android-maps-utils 更改单击的标记图标?

检测应用程序是不是通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时)

当用户在 Qt 应用程序中单击任务栏/停靠图标时获取事件或通知

Xamarin Android - 自定义通知托盘图标(状态栏)