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

小米手机无法从Worker启动Activity问题求助

问题描述

我正在开发一款视频通话应用,流程如下:

  • 通过FirebaseMessaingService接收来电消息
  • 从该服务启动Worker
  • 由Worker启动显示通话界面的Activity

目前在小米设备上,Worker已能正常调用(此前无法调用,开启自启动权限后恢复正常),但无法从Worker启动通话Activity,恳请提供解决办法。

解决方案

1. 修正Activity启动的Flag与配置

从后台进程(Worker)启动Activity必须添加必要的Flag,同时适配高版本Android的后台启动限制:

Intent intent = new Intent(context, CallActivity.class);
// 必须添加NEW_TASK Flag,因为Worker无任务栈
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Android 10+ 需添加此Flag,规避后台启动限制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    intent.addFlags(Intent.FLAG_ACTIVITY_REQUIRE_NON_BROWSER);
}
// Android 12+ 需确保Activity在Manifest中声明android:exported="true"
context.startActivity(intent);

2. 适配MIUI的系统管控

小米MIUI有严格的后台权限限制,需完成以下配置:

  • 授予悬浮窗权限:在系统设置中开启应用的「显示悬浮窗」权限(通话界面属于弹窗类场景,无此权限无法正常启动)
  • 设置无限制省电策略:进入「设置-电池与性能-应用省电策略」,将应用设为「无限制」
  • 锁定应用到后台:多任务界面长按应用图标,选择「锁定」,避免被系统后台清理

3. 改用通知引导启动(推荐方案)

若后台启动Activity仍受限制,可通过发送高优先级全屏通知,引导用户启动通话界面,这是符合系统规范的最优解:

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent callIntent = new Intent(context, CallActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
        context,
        0,
        callIntent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);

Notification callNotification = new NotificationCompat.Builder(context, "CALL_CHANNEL_ID")
        .setContentTitle("新视频来电")
        .setContentText("点击接听通话")
        .setSmallIcon(R.drawable.ic_call_icon)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setFullScreenIntent(pendingIntent, true) // 模拟系统来电的全屏弹窗
        .build();

notificationManager.notify(1001, callNotification);

4. 将Worker设为前台进程

提升Worker的优先级,避免被系统终止,同时确保后续操作的执行:

@Override
public Result doWork() {
    // 构建前台通知
    Notification foregroundNotification = new NotificationCompat.Builder(context, "WORKER_CHANNEL_ID")
            .setContentTitle("处理来电")
            .setSmallIcon(R.drawable.ic_worker)
            .build();
    // 设置Worker为前台进程
    setForegroundAsync(new ForegroundInfo(1002, foregroundNotification));
    
    // 执行后续启动逻辑...
    return Result.success();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:32:46