Android前台服务如何在后台启动activity?

本来最近在开发一个app保活另外一个app的功能,方案介绍如下:

  1. 应用A 启动一个前台服务保活自己
  2. 应用A 用grpc连接应用B(服务端)是否存活
  3. 如果发现B不存活,则在服务中拉起B

这次没有做好调研,直接开始了开发工作,等grpc都调试开发完了,才发现 后台服务中启动应用B有时候能成功,有时候不能正常,不能成功报错如下:

Background activity start [callingPackage。。。。

问题原因就是 android10增加了后台启动activity的限制,当应用A在前台时,拉起应用B是可以的,担当应用A回到后台,即使有一个前台服务,也不能直接拉起应用B。

在网上查了很多资料,参考:Android 后台启动Activity适配

解决方案

我采用的是添加SYSTEM_ALERT_WINDOW权限,并申请该权限。

只需要申请权限,并不需要真的弹出一个悬浮窗出来。

  1. 在AndroidManifest.xml中添加
XML 复制代码
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  1. 申请权限
Kotlin 复制代码
private val requestAlertWindowsPermission = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        Log.i(TAG, "result code:${result.resultCode}")
        if (result.resultCode == Activity.RESULT_OK) {
            Log.i(TAG, "data_return:${result.data?.getStringExtra("data_return")}")
        }
        if (!Settings.canDrawOverlays(this)) {
            Log.i(TAG, "request alert windows Permission failed")
        } else {
            Log.i(TAG, "request alert windows Permission success")
        }
    }

private fun requestAlertWindowPermission() {
        if (!Settings.canDrawOverlays(this)) {
            Log.i(TAG, "requestAlertWinPerm: request alert windows Permission")
            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
            intent.setData(Uri.parse("package:$packageName"))
            requestAlertWindowsPermission.launch(intent)
        } else {
            Log.i(TAG, "requestAlertWindowPermission already has Permission.")
        }
    }
  1. 服务中启动activity。别忘了添加 FLAG_ACTIVITY_NEW_TASK
Kotlin 复制代码
val packageName = "pkg"
val launchIntent = packageManager.getLaunchIntentForPackage(packageName)
if (launchIntent == null) {
    Log.e(TAG, "目标应用未安装")
    throw RuntimeException("目标应用未安装")
}
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(launchIntent)
相关推荐
唐诺1 小时前
Android USB ADB 调试方案完全解析
android·adb·usb
寰宇星城6 小时前
AppActuator - 让 AI Agent 直接理解并操作运行中的 Android App
android
波罗丁牌6 小时前
uni-app 实现视频聊天、屏幕分享,支持Android、HarmonyOS、iOS
android·uni-app·音视频
峥嵘life6 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
jieyucx6 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
凡泰AI8 小时前
APP同时覆盖了iOS、安卓和鸿蒙,如何选择混合开发架构才能减少重复建设,提高功能上线效率~
android·ios·harmonyos·mpaas·uni·小程序容器
叶辞树8 小时前
死锁问题分析
android
TimeFine9 小时前
让 Codex “用上”Android Studio:JetBrains MCP Server 接入与实践
android
__Witheart__10 小时前
3568 Android 设置首次烧录后 usb otg 口模式
android·adb·rockchip
AFinalStone11 小时前
Android 7系统编译与刷机(三)从编译产物到高通刷机包
android·系统编译