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());
+            }
+        }
+    }
+}
+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可编辑97页PPT | 制造企业数字化转型战略咨询及IT总体规划方案

荐言分享&#xff1a;制造企业数字化转型是当前市场环境下的必然趋势&#xff0c;旨在通过引入先进的信息技术&#xff0c;优化业务流程&#xff0c;提升运营效率&#xff0c;增强客户体验&#xff0c;实现可持续发展。这一转型过程涉及多个方面&#xff0c;需要综合考虑企业战…

计算机视觉中的点算子:从零开始构建

Hey小伙伴们&#xff01;今天我们要聊的是一个非常基础但极其重要的计算机视觉技术——点算子&#xff08;Point Operators&#xff09;。点算子主要用于对图像的每个像素进行独立的处理&#xff0c;比如亮度调整、对比度增强、灰度化等。通过这些简单的操作&#xff0c;我们可…

001-Kotlin界面开发之Jetpack Compose Desktop学习路径

Compose Desktop学习之路 学习过程 理解Kotlin的基本语法 Compose Desktop采用Kotlin构建&#xff0c;因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。 用一句话概括&#xff0c;Kotlin是一种现代的、静态类型的编程语言&#xff0c;它结合…

小金标认证的头戴式蓝牙,QCY H3 Pro耳机,平价高音质的新选择

我发现如今市面上百元级的头戴式无线耳机都有非常出色的音质表现了&#xff0c;这其中国产品牌的表现尤为亮眼&#xff0c;与入耳式耳机相比&#xff0c;头戴式耳机拥有更大的发音单元和更包裹耳朵的耳罩设计&#xff0c;提供了更舒适稳固的佩戴体验&#xff0c;在音质和降噪效…

方法+数组

1. 方法 1. 什么是方法 方法定义&#xff1a; // []表示可写可不写[public] [static] type name ( [type formal , type formal , ...]){方法体&#xff1b;[return value ;] }[修饰符] 返回值类型 方法名称([参数类型 形参 , 参数类型 形参 ...]){方法体代码;[return 返回值…

大语言模型(LLM)入门级选手初学教程 II

模型架构 5.1 输入编码&#xff1a; i. 词元序列编码 Input Embedding Module ii. 位置编码&#xff08;Position Embedding, PE)&#xff0c;Transformer 的编码器结构本身无法识别序列中元素的顺序。 &#x1d499;&#x1d461; &#x1d497;&#x1d461; &#x1d491…

【深度学习】实验 — 动手实现 GPT【二】:注意力机制、注意力掩码、多头注意力机制

【深度学习】实验 — 动手实现 GPT【二】&#xff1a;注意力机制、多头注意力机制 注意力机制简单示例&#xff1a;单个元素的情况简单示例&#xff1a;计算所有输入词元的注意力权重推广到所有输入序列词元&#xff1a; 注意力掩码代码实现多头注意力测试 注意力机制 简单示例…

数据库(31)——事务

事务 数据库事务&#xff08;Database Transaction&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中执行的一组逻辑操作单元&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;以保持数据的一致性和完整性。事务是确保数据可靠性的重要机…

Android 获取OAID

获取OAID 老规矩&#xff0c;直接上&#xff1a; implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid&#xff0c;还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

每日互动基于 Apache DolphinScheduler 从容应对ClickHouse 大数据入库瓶颈

引言 大家好&#xff0c;我叫张琦&#xff0c;来自每日互动&#xff0c;担任大数据平台架构师。今天我将分享我们团队在基于Apache DolphinScheduler实现ClickHouse零压入库过程中的实践经验。 这个实践项目涉及到两个关键组件&#xff1a;Apache DolphinScheduler和ClickHous…

[vulnhub] Brainpan1

https://www.vulnhub.com/entry/brainpan-1,51/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是166 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-1…

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法&#xff0c;它们不仅帮助我们理解和描述复杂系统的行为&#xff0c;还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发&#xff0c;逐步深入到各种优化算法&#xff0c;并探讨它们在实际问题中的应用。 思维导图文件可获取&#xff1a;https:…

基于Intel Gaudi AI加速器的大语言模型微调与推理优化赛题等你挑战 | CCF BDCI进行时

一年一度的行业盛事2024 CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;又在激烈进行中啦&#xff01; 多个赛题等你挑战还没有报名的伙伴们抓紧时间咯&#xff0c;叫上你伙伴练起来吧&#xff01; 2024 CCF大数据与计算智能大赛 CCF大数据与计算智能大…

使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人

如今任何项目开发节奏都很快&#xff0c;及时掌握项目动态是很重要滴&#xff0c;GitHub Issues 一般都是开发者和用户反馈问题的主要渠道。 然而&#xff0c;随着 Issue 数量的增加&#xff0c;及时跟进每一个问题会变得越来越困难。 为了解决这个痛点&#xff0c;我们开发了…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

探索C嘎嘎:初步接触STL

#1024程序员节&#xff5c;征文# 前言&#xff1a; 在前文小编讲述了模版初阶&#xff0c;其实讲述模版就是为了给讲STL提前铺垫&#xff0c;STL是C中很重要的一部分&#xff0c;各位读者朋友要知道它的份量&#xff0c;下面废话不多说&#xff0c;开始走进STL的世界。 目录&am…

指令系统 I(指令的格式、寻址)

一、指令系统 1. 指令集体系结构 指令&#xff08;机器指令&#xff09;是指示计算机执行某种操作的命令&#xff0c;是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统&#xff0c;也称指令集。 指令系统是指令集体系结构&#xff08;ISA&#xf…

如何精准选择Yandex关键词

Hey小伙伴们&#x1f44b;&#xff0c;今天来聊聊如何精准选择Yandex关键词&#xff0c;让你的广告投放效果最大化&#xff01;&#x1f50d; 1.使用Yandex关键词工具&#xff1a;Yandex提供了关键词工具&#xff0c;如Yandex Keyword Planner和Yandex Wordstat&#xff0…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

jmeter附件上传

可以采用录制的方式获取附件上传的http请求 普通参数 附件参数 文件名称: 方式一:如果只添项目名称,默认充jmeter的bin目录下获取 方式二:点击文件名称,再点击浏览,可以自己选择文件信息