You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OneSignal NotificationExtenderService中设置PendingIntent未被识别的问题

解决OneSignal应用被杀时点击通知无法唤起指定Activity的问题

我之前也碰到过一模一样的问题,OneSignal的NotificationExtenderService里直接用setContentIntent()很容易被SDK内部逻辑覆盖,导致应用被杀后点击通知完全没反应。下面是亲测可行的解决方案:

问题根源

当你在onNotificationProcessing()中返回true(表示要自定义通知显示逻辑)时,OneSignal内部会对通知Builder做额外的处理流程,这会直接覆盖你通过Extender设置的contentIntent,所以你的自定义跳转逻辑根本不会生效。

解决方案:完全自主构建通知

不要依赖NotificationCompat.Extender去修改OneSignal的默认Builder,而是从头构建完整的通知实例,手动设置好contentIntent,再通过OverrideSettings传递给displayNotification()。这样能完全掌控通知的所有属性,避免被OneSignal的内部逻辑覆盖。

修改后的完整代码示例

@Override
protected boolean onNotificationProcessing(final OSNotificationReceivedResult notification) {
    Log.d(TAG, "onNotificationProcessing");
    
    // 1. 准备跳转至Webview_activity的Intent
    Intent intent = new Intent(getApplicationContext(), Webview_activity.class);
    JSONObject data = notification.payload.additionalData;
    if (data != null) {
        String url = data.optString("url", null);
        if (url != null) {
            intent.putExtra("url", url);
        }
    }
    // 设置适配应用被杀状态的Intent Flag
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
    // 2. 创建PendingIntent,注意适配Android 12+的Flag要求
    PendingIntent pendIntent = PendingIntent.getActivity(
        getApplicationContext(),
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
    );
    
    // 3. 构建自定义通知(替换成你自己的通知图标、渠道ID)
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "你的通知渠道ID")
        .setContentTitle(notification.payload.title)
        .setContentText(notification.payload.body)
        .setSmallIcon(R.drawable.your_notification_icon)
        .setContentIntent(pendIntent)
        .setAutoCancel(true) // 点击通知后自动取消
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    
    // 4. 将自定义通知传入OverrideSettings
    OverrideSettings overrideSettings = new OverrideSettings();
    overrideSettings.notification = builder.build();
    
    // 5. 显示自定义通知
    OSNotificationDisplayedResult displayedResult = displayNotification(overrideSettings);
    Log.d("OneSignalExample", "Notification displayed with id: " + displayedResult.androidNotificationId);
    
    return true;
}

额外注意事项

  • 通知渠道:Android 8.0+ 必须提前创建对应的通知渠道,否则通知无法正常显示,记得在应用启动时完成渠道初始化。
  • PendingIntent Flag:Android 12及以上版本,创建PendingIntent必须指定FLAG_IMMUTABLE或FLAG_MUTABLE,如果你的Intent不需要后续动态修改,用FLAG_IMMUTABLE更安全。
  • Intent Flag:FLAG_ACTIVITY_NEW_TASK确保应用被杀时能启动新的任务栈,FLAG_ACTIVITY_CLEAR_TOP可以避免重复创建Activity实例(可根据你的业务需求调整)。

这样修改后,不管应用处于存活还是被杀状态,点击通知都能正确唤起Webview_activity并传递URL参数。

内容的提问来源于stack exchange,提问作者Karan Gada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:38:48