【问题标题】:Not opening specific activity on notification click when the app is in background/not running当应用程序处于后台/未运行时,未在通知单击时打开特定活动
【发布时间】:2016-11-25 12:11:57
【问题描述】:

仅当应用程序打开并执行通知单击时,通知单击才会启动指定的活动。如果应用程序处于后台/未运行并且执行了通知单击,则应用程序的 MainActivity 将打开。简而言之,就像应用正常打开是跟随activity栈而不是打开PendingIntent中的指定activity一样。

我想根据类型将通知点击重定向到两个不同的活动(ApprovalDetailActivity 和 ConversationDetailActivity)。

我正在使用 FCM 进行推送通知。我在这里粘贴我的清单文件和我的 FCMListener 文件。请帮帮我。

sendNotification() 函数在 MyFirebaseMessagingService.java 中

private void sendNotification(String messageBody)
    {
        Intent intent;
        System.out.println("----message body: " + messageBody);
        if(notificationBundle.getCategory().equalsIgnoreCase(Master.KEY_PUSH_NOTIFICATION_CONVERSATION))
        {
            intent = new Intent(this, ConversationDetailActivity.class);
            /*Conversation conversation = Master.notificationBundle.getConversation();
            Master.conversationsList = new ArrayList<>();
            Master.conversationsList.add(conversation);*/
        }
        else
        {
            intent = new Intent(this, ApprovalDetailActivity.class);
            if(notificationBundle.getApprovalType().equals("I"))
                intent.putExtra(Master.KEY_WHICH_APPROVAL, Master.KEY_VERIFICATIONS);
            else if(notificationBundle.getApprovalType().equals("A"))
                intent.putExtra(Master.KEY_WHICH_APPROVAL, Master.KEY_APPROVALS);
            else
                intent.putExtra(Master.KEY_WHICH_APPROVAL, Master.KEY_COMPLETED);

            intent.putExtra(Master.KEY_IS_FROM_CONVERSATION, false);
        }

        intent.putExtra(Master.KEY_PUSH_NOTIFICATION_POST_ID , notificationBundle.getPostID());
        intent.putExtra(Master.KEY_IS_FROM_PUSH_NOTIFICATION, true);
        intent.putExtra(Master.KEY_POSITION, 0);

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

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.mnet_icon)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        int random = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
        notificationManager.notify(random, notificationBuilder.build());
    }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="mnet.mediaware.com.m_net">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name=".MnetApplication"
        android:allowBackup="true"
        android:icon="@drawable/mnet_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".activities.LoginActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_main"
            android:launchMode="singleTask"
            android:theme="@style/AppTheme.NoActionBar" />

        <activity
            android:name=".activities.ConversationDetailActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_conversation_detail"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:launchMode="singleTask"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="mnet.mediaware.com.m_net.activities.ConversationDetailActivity" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" />
            </intent-filter>

            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="mnet.mediaware.com.m_net.activities.MainActivity" />
        </activity>
        <activity
            android:name=".activities.ApprovalDetailActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_approval_detail"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="mnet.mediaware.com.m_net.activities.MainActivity" />
        </activity>
        <activity
            android:name=".activities.NewConversationActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_new_conversation"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="mnet.mediaware.com.m_net.activities.MainActivity" />
        </activity>
        <activity
            android:name=".activities.NotificationActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_notification"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="mnet.mediaware.com.m_net.activities.MainActivity" />
        </activity>
        <activity
            android:name=".activities.ProfileActivity"
            android:label="@string/title_activity_profile"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:parentActivityName=".activities.MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="mnet.mediaware.com.m_net.activities.MainActivity" />
        </activity>

        <service
            android:name=".utils.firebase.MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <service
            android:name=".utils.firebase.MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>

    </application>

</manifest>

【问题讨论】:

  • 使用 PendingIntent.FLAG_UPDATE_CURRENT
  • 使用标志PendingIntent.FLAG_UPDATE_CURRENT 将使您进入您的活动。继续编码,伙计;)哈哈哈哈
  • 你是怎么解决的,我也有同样的问题

标签: android push-notification notifications firebase-cloud-messaging


【解决方案1】:

根据 Firebase 云消息传递文档 - 如果 Activity 处于前台,则将调用 onMessageReceived。如果 Activity 在后台或关闭,则通知中心会显示应用启动器活动的通知消息。 For More information Check this link

【讨论】:

  • Launcher Activity (LoginActivity) 的意图有 Extras。但是,当我从此 Activity 启动 ConversationDetailActivity 时(如果存在 FCM 附加功能), startActivity() 函数什么也不做。因此,ConversationDetailActivity 没有打开。可能是什么原因?
  • 您是否已将此标志添加到意图中? intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • 是的,我也试过这个,但没有帮助。我已经针对这个问题发布了另一个问题。请在这里回答:link
  • 这就是答案;但这里最重要的是消息中的数据有效负载实际上将在启动器意图中。因此,与其在 FirebaseMessasingService 的 onMessageReceived() 中解析该数据负载,不如尝试在活动的 onNewIntent 中解析它。
  • @SiraLam 我们也可以像邮递员一样使用来自 API/后端的通知。然后将在 FirebaseMessagingService Payload 中可用。因此,不要使用 Firebase 控制台,而是使用后端或来自 Postman 的 Firebase API。
【解决方案2】:

当您的应用在后台时发送的通知消息。在这种情况下,通知将传送到设备的系统托盘。默认情况下,用户点击通知会打开应用启动器。

在后台接收时带有通知和数据负载的消息。在这种情况下,通知被传送到设备的系统托盘,并且 数据负载在您的启动器 Activity 的 Intent 中传递

if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()){
    String value = getIntent().getExtras().getString(key);
    Log.d(TAG, "Key: " + key + " Value: " + value);
}}

使用此代码获取意图数据

【讨论】:

    【解决方案3】:

    只有这个东西对我有用。对我有用的东西很简单。确保将其添加到要直接打开的活动中。

            <intent-filter>
                <action android:name="MainActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    

    并且您必须从推送通知中添加一个新的有效负载:click_action 它看起来像这样 -

    "notification": {
      "title": "hello",
      "body": "test message",
      "click_action": "MAIN_ACTIVITY"
    },
    

    注意:您可以根据需要命名它MAIN_ACTIVITY,但两者必须相同。

    【讨论】:

      【解决方案4】:

      我想我已经为你找到了确切的答案。

      TaskStackBuilder Usage and Definition

      请不要忽略以上链接中的精彩视频。

      TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(getContext());
      taskStackBuilder.addNextIntentWithParentStack(intent);
      PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
      

      【讨论】:

      • 我仍然尝试使用这个pendingIntent,点击推送通知它只会闪屏。有什么帮助吗?我想参加一个特定的活动。
      【解决方案5】:

      从启动器活动的意图中获取包(用于推送通知数据有效负载),然后开始您的特定活动。

      【讨论】:

        【解决方案6】:

        当应用处于后台时,Firebase 推送通知数据有效负载传递到 Launcher Activity,

        因此,在 Launcher Activity 中,您可以简单地检查并打开相应的屏幕

         if (intent.hasExtra("data")) {
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多