点击通知无法启动应用程序

5

当应用程序未运行时收到推送通知,用户按下通知后,通知将消失,日志显示:

2019-10-22 12:42:45.747 23260-23260/de.app.test.staging E/FirebaseMessaging: Notification pending intent canceled

这是SplashActivity,它应该被作为启动器活动来启动:

    <activity
        android:name="de.app.test.login.SplashActivity"
        android:screenOrientation="portrait"
        android:exported="true"
        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>

这里可能出了什么问题?

尝试将exported设置为true,但没有帮助。 - Sava Dimitrijević
分享待处理意图代码 - Zar E Ahmer
这个问题只出现在 PIE 上吗?或者你可能没有在清单文件中配置 Firebase 消息传递。 - Zar E Ahmer
现在无法在Pie以下的设备上尝试,将在今天内查看。 - Sava Dimitrijević
3个回答

8

对于任何寻找答案的人,后端将“click_action”发送到通知,因此没有针对该活动的意图过滤器。

对于我来说,click_action是“OPEN_ACTIVITY_1”,因此我只需像这样向我的SplashActivity添加一个更多的意图过滤器:

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

0

前台应用:

您需要一个PendingIntent来打开应用程序。

请尝试以下方法:

NotificationManager notificationManager = (NotificationManager) context
        .getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, SplashActivity.class);

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent intent = PendingIntent.getActivity(context, 0,
        notificationIntent, 0);

notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

如果Activity在后台或关闭,则通知消息将显示在应用程序启动器活动的通知中心中。
您可以使用BroadcastReceiver类。当您关闭应用程序时,广播可以侦听此操作。因此,如果您创建一个BroadcastReceiver类,则不会遇到此问题。
public class ClosedBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(new Intent(context, HomePage.class));
        } else {
            context.startService(new Intent(context, HomePage.class));
        }
    }
}

更多信息:

https://firebase.google.com/docs/cloud-messaging/android/receive


那时应用程序在前台运行,这是有效的。问题是当应用程序在后台运行时(没有进程运行)。 - Sava Dimitrijević
你是对的。答案已经被编辑了。@SavaDimitrijević - majid ghafouri
谢谢您的回答,但那并不是问题所在。启动器活动根本没有启动,日志显示“通知待定意图已取消”。 - Sava Dimitrijević
我应该在哪里注册这个广播,为什么只有设备在Oreo以上才能使用? - Sava Dimitrijević
请参考此链接 https://dev59.com/U2Uo5IYBdhLWcg3w3yqi#44881551 - majid ghafouri
我理解 BroadcastReceiver 的原理,但由于应用程序在通知点击时根本没有启动,因此这无法工作。 - Sava Dimitrijević

0

你需要在notificationBuilder实例中设置pendingIntent对象,例如:

 mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID);
    Intent intent = new Intent(context, TargetActivity.class));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);

请注意,CHANNEL_ID 仅适用于 Android 版本大于或等于 Oreo。
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CHANNEL_ID = createNotificationChannel(CHANNEL_ID, "channelName");
    }


  @RequiresApi(Build.VERSION_CODES.O)
private String createNotificationChannel(String channelId, String channelName) {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is new and not in the support library

    String description = "description";

    NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_NONE);
    channel.setLightColor(Color.BLUE);
    channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
    channel.setDescription(description);
    // Register the channel with the system; you can't change the importance
    // or other notification behaviors after this
    mNotificationManager.createNotificationChannel(channel);
    return channelId;

}

那时应用程序在前台可以正常工作。问题是当应用程序在后台时(没有进程运行)。 - Sava Dimitrijević

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接