You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何设置应用自启动以接收Firebase推送通知及通用跳转代码实现

嘿,针对你关于Firebase推送和应用自启动的两个问题,我整理了开发者们实际验证过的实用方案:

1. 如何将应用添加至自启动列表以接收Firebase推送通知?

首先得明确:国内多数安卓厂商的ROM都有后台进程限制,当应用被彻底关闭后,FCM(Firebase Cloud Messaging)的推送服务可能无法正常唤醒应用,导致收不到通知。所以引导用户开启自启动是必要的操作。

不同厂商的自启动设置入口差异很大,你可以在应用内针对主流厂商给出清晰的引导步骤:

  • 小米/Redmi:设置 → 应用设置 → 应用管理 → 找到你的应用 → 权限管理 → 自启动 → 允许自启动
  • 华为/荣耀:设置 → 应用和服务 → 应用启动管理 → 找到你的应用 → 关闭“自动管理”,手动开启“允许自启动”“允许后台活动”
  • OPPO/Realme:设置 → 应用 → 应用管理 → 找到你的应用 → 权限管理 → 自启动管理 → 允许自启动
  • vivo/iQOO:设置 → 应用与权限 → 权限管理 → 自启动 → 找到你的应用并开启
  • 三星:设置 → 电池和设备维护 → 电池 → 后台使用限制 → 应用耗电管理 → 找到你的应用 → 允许后台活动 + 允许自启动

建议在应用首次启动、或者用户反馈收不到推送时,弹出友好提示,告诉用户开启自启动的必要性,再引导他们去设置。

2. 能否通过通用Intent跳转至自启动设置页面?

遗憾的是,没有完全通用的Intent——因为每个厂商的自启动设置页面都是各自定制的,包名和组件名各不相同。不过我们可以针对主流厂商做适配,通过判断设备厂商来跳转对应的设置页面,失败时 fallback 到应用详情页。

这里给你一段Android平台的实用代码示例,已经覆盖了大部分主流厂商:

public void navigateToAutoStartSettings(Context context) {
    String manufacturer = Build.MANUFACTURER.toLowerCase();
    Intent intent = new Intent();
    
    try {
        switch (manufacturer) {
            case "xiaomi":
                intent.setComponent(new ComponentName(
                    "com.miui.securitycenter",
                    "com.miui.permcenter.autostart.AutoStartManagementActivity"
                ));
                break;
            case "huawei":
                intent.setComponent(new ComponentName(
                    "com.huawei.systemmanager",
                    "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"
                ));
                break;
            case "oppo":
                intent.setComponent(new ComponentName(
                    "com.coloros.safecenter",
                    "com.coloros.safecenter.permission.startup.StartupAppListActivity"
                ));
                break;
            case "vivo":
                intent.setComponent(new ComponentName(
                    "com.vivo.permissionmanager",
                    "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"
                ));
                break;
            case "samsung":
                intent.setAction("android.intent.action.MAIN");
                intent.setComponent(new ComponentName(
                    "com.samsung.android.sm_cn",
                    "com.samsung.android.sm.ui.ram.AutoRunActivity"
                ));
                break;
            case "oneplus":
                intent.setComponent(new ComponentName(
                    "com.oneplus.security",
                    "com.oneplus.security.chainlaunch.view.ChainLaunchAppListActivity"
                ));
                break;
            default:
                // fallback到应用详情页
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", context.getPackageName(), null);
                intent.setData(uri);
                break;
        }
        
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        // 跳转失败时,同样 fallback到应用详情页
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", context.getPackageName(), null);
        intent.setData(uri);
        context.startActivity(intent);
    }
}

使用注意事项:

  • 不需要额外申请权限,跳转系统设置页面是合法操作
  • 部分厂商的ROM版本可能会调整页面组件,建议在对应机型上测试验证
  • 调用前记得检查context是否有效,避免空指针异常

最后,一定要在跳转前给用户明确的提示,比如“为了确保您能及时收到重要通知,请开启应用的自启动权限”,这样用户的配合度会更高哦~

内容的提问来源于stack exchange,提问作者Jude Fernandes

火山引擎 最新活动