android 10 后台启动activity
摘要:Android 10(API 级别 29)及更高版本会限制应用何时可以启动 activity 背景。这些限制有助于最大限度地减少对用户的干扰, 让用户能够更好地控制其屏幕上显示的内容。本文以此为出发点,基于展锐平台对系统代码进行改造,通过白名单的方式允许部分应用可以从后台启动activity。
Google官方:
针对从后台启动 activity 的限制
1.添加白名单
Index: build/make/target/product/base_system.mk
===================================================================
--- build/make/target/product/base_system.mk (版本 1957)
+++ build/make/target/product/base_system.mk (版本 1959)
@@ -269,6 +269,9 @@wifi-service \wm \+PRODUCT_PACKAGES += background-startactivity-package-whitelist.txt
+# VINTF data for system imagePRODUCT_PACKAGES += \system_manifest.xml \
Index: frameworks/base/data/etc/background-startactivity-package-whitelist.txt
===================================================================
--- frameworks/base/data/etc/background-startactivity-package-whitelist.txt (不存在的)
+++ frameworks/base/data/etc/background-startactivity-package-whitelist.txt (版本 1959)
@@ -0,0 +1 @@
+com.android.permissioncontroller
Index: frameworks/base/data/etc/Android.bp
===================================================================
--- frameworks/base/data/etc/Android.bp (版本 1957)
+++ frameworks/base/data/etc/Android.bp (版本 1959)
@@ -133,3 +133,9 @@sub_dir: "permissions",src: "com.android.timezone.updater.xml",}
+
+prebuilt_etc {
+ name: "background-startactivity-package-whitelist.txt",
+ sub_dir: "permissions",
+ src: "background-startactivity-package-whitelist.txt",
+}
2. 实现方案
Index: frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
===================================================================
--- frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java (版本 1957)
+++ frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java (版本 1959)
@@ -1064,6 +1064,14 @@+ " allowed because SYSTEM_ALERT_WINDOW permission is granted.");return false;}
+
+ // don't abort if the callingPackage on the whitelist
+ if (ActivityBackgroundStartCheckUtil.isWhitelistApp(callingPackage, intent)) {
+ Slog.w(TAG, "Background activity start for " + callingPackage
+ + " allowed because it is on the whitelist.");
+ return false;
+ }
+// anything that has fallen through would currently be abortedSlog.w(TAG, "Background activity start [callingPackage: " + callingPackage+ "; callingUid: " + callingUid
Index: frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java
===================================================================
--- frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java (不存在的)
+++ frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java (版本 1959)
@@ -0,0 +1,100 @@
+package com.android.server.wm;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Environment;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.util.ArrayUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+
+public class ActivityBackgroundStartCheckUtil{
+
+ private static String TAG = "ActivityBackgroundStartCheckUtil";
+
+ private static final File GRANT_SYS_APP_LIST_SYSTEM = Environment
+ .buildPath(Environment.getRootDirectory(), "etc", "permissions",
+ "background-startactivity-package-whitelist.txt");
+
+ private static HashSet<String> mWhitelistAppSet = new HashSet<String>();
+
+ private static String Key[] = {"android", "call"};
+
+ public static boolean isWhitelistApp(String callingPackage, Intent intent){
+ sGetGrantSystemAppFromFile(mWhitelistAppSet, GRANT_SYS_APP_LIST_SYSTEM);
+ Log.d(TAG, "isWhitelistApp callingPackage="+callingPackage);
+ try {
+ String packageName = intent.getComponent().getPackageName();
+ String className = intent.getComponent().getClassName();
+ if (mWhitelistAppSet.contains(callingPackage) ||
+ mWhitelistAppSet.contains(packageName)) {
+ return true;
+ }
+ for (String key : Key) {
+ if (className.contains(key)) {
+ return true;
+ }
+ }
+ } catch (Exception e) {
+ //e.printStackTrace();
+ Log.d(TAG, e.getMessage());
+ }
+ return false;
+ }
+
+
+ /**
+ * Get removable system app list from config file
+ *
+ * @param resultSet
+ * Returned result list
+ * @param file
+ * The config file
+ */
+ private static void sGetGrantSystemAppFromFile(
+ HashSet<String> resultSet, File file) {
+ resultSet.clear();
+ FileReader fr = null;
+ BufferedReader br = null;
+ try {
+ if (file.exists()) {
+ fr = new FileReader(file);
+ } else {
+ Log.d(TAG, "file in " + file + " does not exist!");
+ return;
+ }
+ br = new BufferedReader(fr);
+ String line;
+ while ((line = br.readLine()) != null) {
+ line = line.trim();
+ if (!TextUtils.isEmpty(line)) {
+ Log.d(TAG, "read line " + line);
+ resultSet.add(line);
+ }
+ }
+ Log.e(TAG,"GRANT_SYS_APP_LIST_SYSTEM size="+resultSet.size());
+ } catch (Exception io) {
+ Log.d(TAG, io.getMessage());
+ } finally {
+ try {
+ if (br != null) {
+ br.close();
+ }
+ if (fr != null) {
+ fr.close();
+ }
+ } catch (IOException io) {
+ Log.d(TAG, io.getMessage());
+ }
+ }
+ }
+}
+
相关文章:
android 10 后台启动activity
摘要:Android 10(API 级别 29)及更高版本会限制应用何时可以启动 activity 背景。这些限制有助于最大限度地减少对用户的干扰, 让用户能够更好地控制其屏幕上显示的内容。本文以此为出发点,基于展锐平台对系统代码进行…...
文案创作新思路:Python与文心一言API的完美结合
在这个信息爆炸的时代,内容创作似乎成了一项需要魔法才能完成的任务。不过,别担心!今天,我们将向你介绍一种新的“魔法”工具——百度文心一言 API。这款大语言模型不仅能与人对话互动,还能高效便捷地协助你获取创意灵…...

CentOS 7 上安装 MySQL 8.0 教程
🌟 你好 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
Chromium HTML5 新的 Input 类型url对应c++
一、Input 类型: url url 类型用于应该包含 URL 地址的输入域。 在提交表单时,会自动验证 url 域的值。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body&g…...

java多线程编程(二)一一>线程安全问题, 单例模式, 解决程线程安全问题的措施
引言: 如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的 线程安全问题的原因: 一.操作系统的随机调度 : 二.多个线程修改同一个变量: 三.修改操作不是…...

Leetcode 213. 打家劫舍 II 动态规划
原题链接:Leetcode 213. 打家劫舍 II class Solution { public:int rob(vector<int>& nums) {int n nums.size();if (n 1)return nums[0];if (n 2)return max(nums[0], nums[1]);// 如果偷了第一家,就不能偷最后一家int dp[n - 1];dp[0] …...

就业市场变革:AI时代,我们将如何评估人才?
内容概要 在这个充满变革的时代,就业市场正被人工智能(AI)技术深刻改变。随着技术的进步,传统的人才评估方式逐渐显示出其局限性。例如,过去依赖于纸质简历和面试评估的方式在快速变化的环境中难以准确识别真实的人才…...
富格林:安全操作方式稳健出金
富格林认为,黄金一直是吸引投资者关注的投资产品之一,投资者不断踏入黄金投资交易市场。很多投资者都以为现货黄金投资是很容易实现出金获得丰厚利润,但是面对复杂的交易市场,不仅不能轻易实现安全获利出金,甚至可能还…...

早点包子店点餐的软件下载和点餐操作教程 佳易王餐饮点餐管理系统操作方法
一、概述 【软件试用版资源文件可以点文章最后卡片了解】 早点包子店点餐的软件下载和点餐操作教程 适合于早点早餐餐饮行业的软件,实现早点点餐,收银会员管理,库存统计,销售统计等一体化操作。 点餐的时候可以用手触摸点&…...

uniapp一键打包
1.先安装python环境, 2.复制这几个文件到uniapp项目里面 3.修改自己证书路径,配置文件路径什么的 4.在文件夹页面双击buildController.py或者cmd直接输入buildController.py 5.python报错,哪个依赖缺少安装哪个依赖 6.执行不动的话&…...
什么是ksqlDB?流处理世界里的新范式
在大数据技术快速迭代的今天,我们见证了数据处理范式的不断演进。从批处理到流处理,从复杂的编程框架到声明式API,技术在不断简化与进化。而ksqlDB的出现,为我们带来了一个全新的视角 - 它不仅仅是一个流处理引擎,更是重新定义了我们与实时数据交互的方式。 让我们重新认识流处…...
Vue.js组件开发
Vue.js 是一个流行的 JavaScript 框架,用于构建用户界面和单页应用程序。开发 Vue.js 组件是 Vue.js 开发的核心部分。下面是一些关于 Vue.js 组件开发的基本概念和示例。 1. 创建一个基本的 Vue 组件 <template><div><h1>{{ title }}</h1>…...

Oracle视频基础1.1.2练习
1.1.2 需求: 查询oracle组件和粒度大小, select component,granule_size from v$sga_dynamic_components;Oracle SGA 中组件和粒度大小查询详解 在 Oracle 数据库的内存结构中,SGA(System Global Area,系统全局区&am…...
Hadoop分布式文件系统架构和设计
Hadoop分布式文件系统架构和设计 引言Hadoop 分布式文件系统 (HDFS) 是一个设计用于在普通硬件上运行的分布式文件系统。它与现有的分布式文件系统有许多相似之处。然而,HDFS 与其他分布式文件系统的差异是显著的。HDFS具有高度的容错能力,并且设计用于在低成本硬件上部署。H…...

Prompt Engineering (Prompt工程)
2 prompt工程2大原则 2.1 给出清晰,详细的指令 策略1:使用分割符清晰的指示输出的不同部分,比如"",<>,<\tag>等分隔符 策略2:指定一个结构化的输出,比如json,html等格式 策略3:要…...
第十四课 Vue中的HTML及文本渲染
Vue中的HTML及文本渲染 HTML渲染 v-html指令可以在DOM中渲染新的子HTML DOM,Vue官方认为HTML渲染是不安全的,并不建议直接做HTML插入操作。 <div id"app"><div v-html"vals"></div></div><script>n…...

无人机救援系统简单解读
无人机救援系统简单解读 1. 源由2. 场景分析2.1 人员搜索2.2 紧急物资投送2.3 环境评估 3. 系统分解4. 初步总结5. 参考资料 1. 源由 最近,关于《Rapid Response UAV Post-Disaster Location Network Incorporating ML, Radio Control, and Global Positioning Sys…...
广西自闭症儿童寄宿学校:打造温馨成长的家
在广西这片美丽的土地上,有一群特殊的孩子,他们生活在自己的世界里,对外界的喧嚣似乎无动于衷,他们就是自闭症儿童。自闭症,这个看似遥远的词汇,却实实在在影响着许多家庭。幸运的是,在这片热土…...
python 查看服务器主机 IP 地址
import socket hostname socket.gethostname() ## 获取主机名 ip_address socket.gethostbyname(hostname) # 通过主机名获取 IP 地址 print(“服务器主机 IP 地址为:”, ip_address)...

应对市场变化与竞争对手挑战的策略
应对市场和竞争对手的变化需要企业具备敏锐的市场洞察力、灵活的战略调整能力、持续的创新意识、有效的资源配置等关键能力。敏锐的市场洞察力是企业能够及时捕捉市场趋势和竞争动态的基础,它不仅帮助企业预见潜在的机会和威胁,还能指导企业制定更具前瞻…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...