Android 12 Indirect notification activity start (trampoline) from xx blocked解决方案

文章描述了在Android12上因通知trampoline限制导致点击通知无法启动Activity的问题。解决方案是创建一个透明的跳板Activity,用于接收通知点击并执行相关逻辑,然后启动目标Activity。在TrampolineActivity中处理业务并启动MainActivity后立即结束自身,以此规避系统限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在写一个点击通知发出Broadcast并在Broadcast Receiver中处理一些事情后再打开Activity的功能。调试时没有问题,但在应用打包后点击通知时Activity无法被打开。在Logcat 中可以看到以下调试信息:Indirect notification activity start (trampoline) from xx blocked

关于问题

经过测试发现:已成功触发广播接收器的onReceive方法,问题出在无法在点击通知时间接地打开Activity

查阅了相关资料,以Android 12为目标平台的应用有一些行为变更。其中,限制通知 trampoline 导致无法间接地打开Activity

通知 trampoline:当用户与通知互动时,某些应用会启动一个应用组件(如 Broadcast)来响应通知点按操作,该应用组件最终会启动用户最终看到并与之互动的 activity。此应用组件被称为通知 trampoline。

如何解决

思路

我建立了一个用户感知不到的Activity,在点击通知时直接打开这个跳板Activity。在跳板ActivityonCreate 方法中处理数据、发送广播、启动服务等,最后启动想要打开的Activity。进行完以上所有操作后,调用finish方法结束这个跳板Activity

实现

  1. 新建一个空的Activity(不要勾选Generate a Layout File

在这里插入图片描述

  1. AndroidManifest.xml中对Activity进行配置
<activity
    android:name=".TrampolineActivity"
    android:excludeFromRecents="true"
    android:exported="false"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="TrampolineActivity" />
  1. TrampolineActivity中编写业务代码
package xxx;
import static xxx.NOTIFICATION_PRESS_ACTION;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;

public class TrampolineActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 编写你的代码,发送 Broadcast 等
        
        Intent mainActivityIntent = new Intent(this, MainActivity.class);
        mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(mainActivityIntent); // 启动要打开的Activity
        
        finish(); // 结束跳板Activity
    }
}
  1. 设置NotificationContentIntent
Intent intent = new Intent(context, TrampolineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, gatheringEventItem.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
        .setContentTitle("通知标题")
        .setContentText("通知内容")
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)
        .build();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值