实战|Android后台启动Activity实践之路续

Android 10 后台启动Activity(app切换到前台) 目录 过程分析 解决方案 在AndroidManifest.xml上添加权限 检查是否开启悬浮窗权限 打开悬浮窗权限设置页 最近需要开发一个某些时候需要把app唤醒并置于前台的功能。刚开发时,在模拟器正常,后来上真机出问题了。进行排查发现模拟器api是28的,真机是api29(Android 10),查资料发现,api29版本禁止后台启动activity,而造成的。 过程分析 具体资料如下: 从后台启动 Activity 的限制 Android10(Api 29)新特... 阅读详情

概述

家人们!后台启动 Activity 的 Demo 工程请私聊我, 如有问题欢迎提出,觉得不错的话就点个赞吧。

前段时间调研 Android 后台启动 Activity 的方案,参考 实战|Android后台启动Activity实践之路 一文,当时的结论如下:

原生Android ROM

Android 原生 ROM 都能正常地从后台启动 Activity 界面,无论是 Android 9(直接启动) 还是 10 版本(借助全屏通知)。

定制化ROM

Android P版本的机型:

  • 通过 moveTaskToFront 方法将应用切换到前台,如果切换失败的话可以多尝试几次调用 moveTaskToFront 方法;
  • 小米机型可以通过Hook相关参数来后台启动Activity;

Android Q版本的机型:

  • 通过系统全屏通知的方式调起后台 Activity;
  • 在一些另作了限制的 ROM 上可能调起失败;

后来又想到如果能够拿到这些机型 ROM 的源码,那么通过阅读 startActivity 以及后台启动权限设置页面的源码,那么就有可能找到破解的方法。至于怎么获取 ROM 的源码,我这里有两种方式:

  • 如果手里有现成的机型,则可以直接将 /system/framework/ 中的内容通过 adb pull 命令拉下来,然后通过一些反编译工具可以查阅相关的源码;
  • 去相关厂商的官网下载对应机型的 ROM 包,通过工具将其解压转换,最终也可以拿到源码。

这篇文章主要是延续上篇文章的内容,介绍一下怎么拿到 ROM 包源码,并以小米某机型为例,找出它们针对后台启动权限所做的定制化。

获取ROM源码

adb pull

我一开始也没想到原来不需要 root 权限即可从手机里 pull /system/framework/ 里的内容,方式也很简单,手机连接电脑后运行命令即可在当前路径下拿到 framework 文件夹内容:

$ adb pull /system/framework

这种方式做过 Android 开发的应该都知道,就不再多说了。不过需要注意的是在一些机器里 pull 下来的 framework 文件夹下的 jar 文件可能都是只有 1Kb 的大小,这种 jar 文件里不含有源代码,在 framework 下还有一些 odex 文件,需要将其转换成 dex 等格式才更好反编译,具体怎么转换的可以网上搜,貌似还有挺多教程的。

解压ROM

首先去对应厂商的官网下载 ROM 包,以小米为例是在 MIUI下载 里下载,下载了目标 ROM.zip 后将其解压缩,我下载的是小米 Max3(Android 9) 的 ROM 包,解压后我们需要的有两个文件: system.new.dat.br 和 system.transfer.list。接下来分步骤看看怎么反编译出它的源码:

  1. 下载 ROM 制作工具: 下载地址,下载安装打开后,选择其 实用工具 栏,然后打开 new.dat编辑 功能,如下图:

实战|Android后台启动Activity实践之路续

 

  1. 按照下图的两个步骤转换。首先第一步选择 system.new.dat.br 文件转换,得到 .new.dat 后缀的 system.new.dat 文件;然后第二步选择这个 system.new.dat 文件转换,可能提示需要 .transfer.list 文件,直接选择上面的 system.transfer.list 文件即可,转换后会得到一个 img 后缀的文件,将其解压缩。

实战|Android后台启动Activity实践之路续

 

  1. 打开解压缩后的文件夹,进入 /system/framework/ 目录下,即可看到我们需要的 jar 文件们。

反编译ROM源码

这一步是要将上面得到的 jar 或者 dex 文件反编译得到源码,网上有很多介绍反编译的文章,也有很多工具比如说 apktool, dex2jar, jd-gui 等,这里介绍一个傻瓜式操作的工具——jadx,如果想要省事的话可以直接使用这个工具,它可以直接打开 jar, dex, apk 等后缀的文件,直接查看反编译后的源码,是不是很方便呢?

另外如果要使用 jd-gui 查看的话,网上有很多教程了,或者直接 --help 查看相关工具的 Usage。

后台启动权限做了什么?

经过上面的步骤我们得到了 ROM 反编译后的源码,这一章开始进入具体的源码分析流程。从之前 实战|Android后台启动Activity实践之路 可以知道,当我们调用 startActivity 后,会来到 AMS 这一端,AMS 进行了一些处理后,会调用到 ActivityStarter.startActivity 方法,对这个流程有疑问的可以看看 Activity 的启动流程,可以参考 Android-Activity启动流程。查看反编译后的代码,发现里面调用了小米自定义的 Inject 类中的静态方法(在 services.jar 中):

private int startActivity(IApplicationThread paramIApplicationThread, Intent paramIntent1, ...) {
    // ...
    // 这个 i 在 AOSP 源码中原名叫 boolean abort
    i = activityStackSupervisor.checkStartAnyActivityPermission(...) ^ true | this.mService.mIntentFirewall.checkStartActivity(...) ^ true;
    paramInt1 = i;
    if (i == 0) { // 表示 !abort
        paramInt1 = i;
        if (!ActivityTaskManagerServiceInjector.isAllowedStartActivity(this.mService, this.mSupervisor, paramIntent1, ...))
            paramInt1 = 1; 
    }
    // 根据上面的bool值判断是否接着执行 startActivity 流程
    // ...
}

其实这样的 XXXInject 类在源码中还有很多,都是用来做一些自定义逻辑的,我们重点看下这个 ActivityTaskManagerServiceInjector.isAllowedStartActivity() 方法的逻辑:

static boolean isAllowedStartActivity(..., Intent paramIntent, ...) {
    StringBuilder stringBuilder;
    // 1
    if (UserHandle.getAppId(paramInt) == 1000 || (paramIntent.getMiuiFlags() & 0x2) != 0 || PendingIntentRecordInjector.containsPendingIntent(paramString) || PendingIntentRecordInjector.containsPendingIntent(paramActivityInfo.applicationInfo.packageName) || paramInt == mLastStartActivityUid || paramActivityTaskManagerService.isUidForeground(paramInt)) {
      return true;
    } 
    // 2
    if (paramActivityTaskManagerService.mWindowManager.isKeyguardLocked() && paramActivityTaskManagerService.getAppOpsService().noteOperation(10020, paramInt, paramString) != 0) {
      stringBuilder = new StringBuilder();
      stringBuilder.append("MIUILOG- Permission Denied Activity KeyguardLocked: ");
      // ...
      Slog.d("ActivityTaskManagerServiceInjector", stringBuilder.toString());
      return false;
    } 
    // ...
    // 3
    if (stringBuilder.getAppOpsService().checkOperation(10021, paramInt, paramString) != 0) {
      SparseArray<WindowProcessController> sparseArray = ((ActivityTaskManagerService)stringBuilder).mProcessMap.getPidMap();
      for (int i = sparseArray.size() - 1; i >= 0; i--) {
        int j = sparseArray.keyAt(i);
        WindowProcessController windowProcessController = (WindowProcessController)sparseArray.get(j);
        if (windowProcessController != null && windowProcessController.mUid == paramInt && (windowProcessController.hasForegroundActivities() || (ExtraActivityManagerService.isProcessRecordVisible(j, paramInt) && windowProcessController.hasActivities() && paramInt == activityRecord.launchedFromUid))) {
          mLastStartActivityUid = paramActivityInfo.applicationInfo.uid;
          return true;
        } 
      } 
      stringBuilder.getAppOpsService().noteOperation(10021, paramInt, paramString);
      stringBuilder = new StringBuilder();
      stringBuilder.append("MIUILOG- Permission Denied Activity : ");
      // ...
      Slog.d("ActivityTaskManagerServiceInjector", stringBuilder.toString());
      return false;
    } 
    return true;
}

接下来我们从上面标的数字讲起:

  • 首先看看数字2的部分:我们看到了这里有一个 OpCode=10020, 这个 Code 对应的权限也是小米增加的,看下面的日志可以知道这个 Code 就是我们常看到的小米锁屏显示的权限,由此可以知道如果我们调用 startActivity 时手机没有解锁,那么会走到这个流程,判断应用有没有这个 10020 的权限,如果有则接着往下走,如果没有权限则直接返回 false 表示不能启动目标 Activity。
  • 然后看数字3的部分:跟上面类似,它处理 OpCode=10021 的权限鉴定,这个值跟我们在前一篇文章里讲到的后台启动权限的 Code 是一样的!也就是说这段代码就是用来判断应用有没有后台启动的权限的。

至于这两个权限相关的日志:Permission Denied Activity KeyguardLocked: ... 和 Permission Denied Activity: ...,我们在遇到这两种场景后,在 logcat 中过滤 MIUILOG Tag 是可以看到这两种日志输出的,有兴趣的同学可以验证一下~

接下来再看数字1部分,这里就是我们绕过这两个权限的关键!它在这个方法的开头,如果这个 if 判断为真的话则会直接返回 true,从而跳过后面权限认证的逻辑,我们重点关注 (paramIntent.getMiuiFlags() & 0x2) != 0 这个判断条件:由此可以看出小米在 Intent 类中增加了一个形如 MiuiFlags 的标志位,我们打开 Intent 类看看具体情况,Intent 类在 framework.jar 中:

public class Intent implements Parcelable, Cloneable {
    private int mMiuiFlags;

    // ...

    public Intent addMiuiFlags(int flags) {
        this.mMiuiFlags |= flags;
        return this;
    }

    public Intent setMiuiFlags(int flags) {
        this.mMiuiFlags = flags;
        return this;
    }

    public int getMiuiFlags() {
        return this.mMiuiFlags;
    }
}

果然,Intent 中被增加了一个标志位,那么我们估计就知道怎么去解决这个问题了,那就是在小米平台上通过反射将我们的 Intent 参数中的 mMiuiFlags 设置成 0x2 即可绕过这两个权限的认证!

另外这里要注意一个问题:在 Android 9 以上 Intent 类中的属性是不能被反射的,因此我们需要想办法解决这个问题,网上已经有了许多现成的方式,这里我就不做展开了,想了解具体原理的直接 Google 即可。我借用了 Github 上的一个开源库——FreeReflection,通过它可以方便地防止反射 Intent 抛出异常崩溃。

经过实际测试,当我将 Intent 中的这个属性修改成 0x2 以后,可以直接从后台或在锁屏时启动我们应用的 Activity。

总结

其实整体来说这套解决方案还是挺简单的,在找到工具反编译 ROM 代码后,熟悉 Activity 启动源码的同学还是能比较轻松地找到其中的突破点的,当然中间可能会走错方向,像我有时候就容易盯着一个跟目标毫无关联的方法看,因为不能确定到底哪里才是真正的关键点。猜测其他版本的小米机器应该都是用的这种方式,毕竟同一个厂商没必要弄多套方案去做这个权限的功能。

参考上述方式,如果对于一些厂商 ROM 的定制化功能有疑问或者开发中有这种奇怪Bug(与厂商定制相关)的,都可以从它们的源码中找到蛛丝马迹,也算是一种解决思路吧,时间足够的话,可以自己直接从源码中寻找答案,不然在网上搜来搜去的,有的能找到答案那是万幸,有的则完全不知所云晕头转向的。

最后

为了让大家更好的去学习和提升自己,在这里我也分享一份由几位大佬一起收录整理的 Flutter进阶资料以及Android学习PDF+架构视频+面试文档+源码笔记 ,并且还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料……

这些都是我闲暇时还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。
如果你有需要的话,可以前往 GitHub 自行查阅。

[android q] 从后台启动 Activity 的限制 https://developer.android.com/guide/components/activities/background-starts https://developer.android.com/training/notify-user/time-sensitive 从AndroidQ开始android进一步限制了从后台(组件)启动Activity的行为,前台的不受限制。说白... 阅读详情

相关推荐

Android 10.0以后高版本后台启动Activity的方法

在Android 10.0以后在后台直接启动Activity已经不行了 查看官方文档 发现这种方式为了安全起见已经受限了 给出了一些不受限制的例外情况,此外官方的推荐是对于后台启动的需求,先向用户展示一个 Notification 而不是直接启动 Activity,然后在用户点击 Notification 后才处理对应的逻辑。还可以在设置 Notification 时通过 setFullScreenIntent 添加一个全屏 Intent 对象,该方法经过测试 下面就来实现这种方式启动Activity 1.

安卓兼职framework和app工程师的博客 7777

android 10+从后台启动 Activity 的限制

Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity 的时间施加限制。这些限制有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。 在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:

xiaoyantan的博客 1万+

Android11 后台启动Activity

【代码】Android11 后台启动Activity。

告别南半球的博客 1341

android 豁免的广播及广播白名单,通俗易懂弄清Android P非SDK接口限制

Android P非SDK接口限制1. 三种名单黑名单:不可使用,否则会抛出异常。灰名单:如果当前apk的API级别白名单:受支持的接口,可以使用。2. 抛出异常如果使用了黑名单的接口,就会抛出异常,调用getDeclaredField()方法会抛出NoSuchFieldException,调用getDeclaredMethod()方法会抛出NoSuchMethodException。如果是调用了...

weixin_39670849的博客 638

Sigmastar平台WDR调试实战:从参数解析到鬼影消除的完整指南

本文提供了Sigmastar平台宽动态(WDR)技术的实战调试指南。针对逆光、运动场景下的核心痛点,系统性地解析了从多曝光采集、HDR融合到色调映射的完整管线,并重点阐述了如何通过调整曝光比、运动阈值与调整曲线等关键参数,有效消除运动鬼影、平衡暗部噪声与细节,最终实现清晰稳定的图像效果。

Jerry的专栏 926

2024年安卓最新实战|Android后台启动Activity实践之路续,2024年最新零基础学习android开发

!最后放上一个大概的Android学习方向及思路(详细的内容太多了~),提供给大家:对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!Android架构师之路很漫长,一起共勉吧!如果你觉得文章写得不错就给个赞呗?获取ROM源码=======adb pull========

2401_84562041的博客 1000

单窗算法的地表温度反演:谷歌地球引擎GEE代码

该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。

2301_78834737的博客 556

2024年最全实战|Android后台启动Activity实践之路续(1),测试面试宝典

那我们该怎么做才能做到年薪60万+呢,对于程序员来说,只有不断学习,不断提升自己的实力。我之前有篇文章提到过,感兴趣的可以看看,到底要学习哪些知识才能达到年薪60万+。通过职友集数据可以查看,以北京 Android 相关岗位为例,其中 【20k-30k】 薪酬的 Android 工程师,占到了整体从业者的 30.8%!北京 Android 工程师「工资收入水平 」今天重点内容是怎么去学,怎么提高自己的技术。1.合理安排时间2.找对好的系统的学习资料3.有老师带,可以随时解决问题。

2301_82244718的博客 1214

晶晨S905L3S/S905L3SB芯片刷机实战:BL加载工具与线刷固件全解析

本文针对晶晨S905L3S/S905L3SB芯片电视盒子刷机时常见的2%失败问题,提供了两种核心解决方案。一是使用已集成特殊通信协议的专用版USB Burning Tool(如V2.2.5/V2.2.7),二是采用旧版工具配合独立的BootLoader加载工具。文章详细解析了两种方案的原理、操作步骤、固件选择及常见问题排查,旨在帮助用户成功完成刷机,让老旧设备焕发新生。

weixin_29238147的博客 1109

股票分时数据获取-东方财富

获取下股票分时数据,分时均价下线,分时成交额等,用于量化t0交易条件还是很不错了的。

meiaoxue1234的博客 1万+

最全实战|Android后台启动Activity实践之路续(1),2024年最新字节跳动面试官

给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84556528的博客 1295

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

实战|Android后台启动Activity实践之路

概述 前几天产品提了一个需求,想在后台的时候启动我们 APP 的一个 Activity,随着 Android 版本的更新,以及各家 ROM 厂商的无限改造,这种影响用户体验的功能许多都受到了限制,没办法,虽然是比较流氓的功能,但拿人钱财替人消灾,于是开启了哼哧哼哧的调研之路。 原生Android ROM 首先从 Android 的原生 ROM 开始,根据官方的介绍,后台启动 Activity 的限制是从 Android 10(API 29) 才开始的,在此之前原生 ROM 是没有这个限制的,于是我分别启动了

Androidbye的博客 3465

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 454

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 200

Android 在后台无法启动Activity

前言 前几天接触的一个闹钟APP项目,闹钟触发从后台启动一个activity,执行之后的响铃操作,但是却失效了,闹钟并没有按时响铃。最后发现是系统拦截了从后台启动的Activity。 具体原因 一、AndroidQ从后台启动Activity的限制 Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity进行限制。Android10中, 当App的Activit...

屈佳俊的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 后台启动Activity适配

先判断是否是特殊机型,如果是则需要申请后台弹出界面权限如果不是特殊机型,则有两种方案,一是全屏通知,二是申请在其他应用上层绘制权限。

极致的专注 无限的热情 5202

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android Q 限制后台启动Activity

描述 Android Q限制在没有用户交互的情况下加载Activity。这一变化可以最大限度的减少对用户的打扰,保持用户对屏幕上所显示内容的可控性。 运行在Android Q上的APP仅在以下一种或多种情况下可运行Activity: APP存在一个可视的窗口,例如一个处于前台的Activity 另外一个处于前台的APP发送一个属于当前APP的PendingIntent。例如Custom Tabs...

iPeak的专栏 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

如何解决Android 后台进程启动 activity 限制?

这仅适用于在调用 finish() 时,应用在前台中具有一项 activity,或在前台任务的返回栈中具有一项 activity 的情况。不过也可以看出这些代码中的额外一些条件,其实都不是普通第三方app可以的达到的条件,所以文档中也没有列出这些,文档主要还是列出第三方应用可以达到条件。那么这个问题应该如何解决呢?所以对于系统应用而言,如果想要后台启动,只需要在自己的apk中添加权限既可以,注意同时要有系统签名或其他条件。3、应用在“最近使用的应用”屏幕上现有任务的返回堆栈中具有 activity。

learnframework的博客 2037

最全实战_Android后台启动Activity实践之路,春招的面试时间

原生Android ROMAndroid 原生 ROM 都能正常地从后台启动 Activity 界面,无论是 Android 9(直接启动) 还是 10 版本(借助全屏通知)。定制化ROM通过反射 AppOpsManager 相关方法检测对应 opCode 的权限;opCode = 10021(小米机型);其它机型可以尝试遍历得到 opCode;通过Hook相关参数来后台启动Activity,代码由于某些原因不能给出了,有需要的同学可以留言告诉我哈;只测试过小米机型,其它机型不一定可用;

2401_84556528的博客 1309

Android 10 后台启动Activity

从官方文档得知,在一些情况下,可以允许从后台启动Activity,具体如下: 在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity: 应用具有可见窗口,例如前台 Activity。 应用在前台任务的返回栈中拥有 Activity。 应用在 Recents 屏幕上现有任务的返回栈中拥有 Activity。 注意:当此类应用尝试启动新的 Activity 时,系统会将该 Activity 放置到应用现有任务的顶部,但不会离开当前可见的任务。当用户稍后返

xiaowang_lj的博客 5987

Android 后台限制启动Service、Activity与Notification、PendingIntent浅析

Android O之后,很多后台启动的行为都开始受限,比如O的时候,不能后台启动Service,而在Android10之后,连Activity也加到了后台限制中。在Android O 后台startService限制简析中,层分析Android O之后,后台限制启动Service的场景,一般而言,APP退到后台(比如按Home键),1分钟之后变为后台APP,虽然进程存活,但是已经不能通过start...

happylishang的专栏 5588

实战_Android后台启动Activity实践之路,android工程师面试题目和答案

} fun noteOpNoThrow(context: Context, op: Int): Int { val ops = context.getSystemService(Context.APP_OPS_SERVICE) as AppOp sManager try { val method: Method = ops.javaClass.getMethod( “noteOpNoThrow”, Int::class.javaPrimitiveType, Int::class.javaPrimitiveT

m0_65322636的博客 944

[AMS] Android 后台进程启动 activity 限制

当此类应用尝试启动新的 activity 时,系统会将该 activity 置于应用的现有任务之上,但不会离开当前可见的任务。当用户稍后返回应用任务时,系统会启动新的 activity,而不是之前在应用任务之上的 activity。:从 Android 14 开始,如果绑定到该服务的应用以 Android 14 或更高版本为目标平台,它将不再允许具有该服务的应用默认启动后台 activity。时,应用在前台运行的 activity,或在前台任务的返回堆栈中具有 activity。

qq_27122177的博客 6167
上一篇: 年龄越来越大,技术却提不上去?看看三十三岁老程序员怎么说:
下一篇: 苦于技术没办法提升,年龄和工资没有成正比,我到底该怎么办?
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值