点击打开登录活动而不是主要活动的通知

Posted

技术标签:

【中文标题】点击打开登录活动而不是主要活动的通知【英文标题】:Notification on click opening login activity instead of main activity 【发布时间】:2019-03-08 17:10:48 【问题描述】:

我的应用中有基于 Firebase 的通知。从服务器收到消息后,我可以在手机中看到通知。但是当我点击通知中的消息时,它总是打开我的启动画面,然后是 LoginActivity 而不是 MainActivity。我想打开 MainActivity 并显示消息详细信息,为此我使用“putExtra”将通知的消息正文传递给 MainActivity。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 

    //Calling method to generate notification
    sendNotification(remoteMessage.getNotification().getTitle().toString(), remoteMessage.getNotification().getBody());


//This method is only generating push notification
private void sendNotification(String messageTitle, String messageBody) 
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Title", messageTitle);
    intent.putExtra("data", messageBody);
    intent.putExtra("KEY", "Notify");

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
            PendingIntent.FLAG_ONE_SHOT);

    numNotifications = numNotifications + 1;
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    inboxStyle.setBigContentTitle(getString(R.string.app_notification)) ;
    inboxStyle.setSummaryText(getString(R.string.app_count_notifications1)
            + numNotifications + getString(R.string.app_count_notifications2));

    inboxStyle.bigText(messageBody);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.q_me_notify)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setStyle(inboxStyle)
            .setGroup(TAG)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    try 
        notificationManager.notify(TAG, APPID, notificationBuilder.build());
     catch (Exception e) 
        e.printStackTrace();
    

我的 android 清单文件如下所示:

<application
    android:allowBackup="true"
    android:icon="@drawable/final"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".SplashActivity"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".LoginActivity"
        android:theme="@style/LoginTheme"
        android:launchMode="singleTask"/>
    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme"
        android:launchMode="singleTask"/>

    <!-- Defining Services -->
    <service android:name=".services.FirebaseMessageService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <service android:name=".services.FirebaseInstanceService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

这发生在我的带有 Android 7.0 的 Samsung On8 (J7 Pro) 中 - 无论应用程序是在前台还是后台(它总是打开 LoginActivity)。但是在我的 Nexus 5 有 Android 5.1.1 时,只有当应用程序处于后台/终止时才会出现这种行为,而当应用程序处于前台时它可以正常工作。

所以,我的问题是:

    无论型号和操作系统版本如何,如何让应用在前台显示 MainActivity,以便正确显示通知消息详细信息?

    当应用程序处于后台/终止状态时,如何跨(Splash --> LoginActivity --> MainActivity)传递通知值,以便在 MainActivity 中正确显示消息?

【问题讨论】:

【参考方案1】:

添加TaskStackBuilder,替换:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

用这个:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

编辑:显然在您的MainActivity 中,您应该有逻辑从Intent 检索数据并更新Activity

【讨论】:

【参考方案2】:

在浏览了几篇文章和博客后,我解决了这个问题。对我有很大帮助的最好的和详细的答案是 Mukesh Rana 在这篇文章中的回答 Clicking on notification doesn't open mentioned activity

我现在使用 REST api 从服务器发送“数据”有效负载,无论应用程序是在前台还是后台,它总是被拾取。如果应用程序处于后台,通知的 onClick 始终会启动启动画面(启动器)。在 onMessageReceived 中,我使用 remoteMessage.getData() 获取“数据”。在意图中,我使用 intent.putExtra(key, value) 将值传递给意图(后台应用程序默认为启动画面)。从那里我将它传递给 MainActivity 并使用 getStringExtra(key) 获取值。

【讨论】:

以上是关于点击打开登录活动而不是主要活动的通知的主要内容,如果未能解决你的问题,请参考以下文章

FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动

点击通知打开新活动

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

确定是不是从 FCM 通知调用活动

单击推送通知时对特定活动的意图。

单击 fcm 通知而不是打开启动器活动时打开浏览器