教你如何打开android4.3和4.4中隐藏的AppOps
注:下面的方法在4.4.2更新后已失效!
PreferenceActivity的switchToHeaderInner()函数中会调用isValidFragment函数来检查fragment是否合法。而在Settings.java的isValidFragment
函数中没有把AppOpsSummary放到ENTRY_FRAGMENTS数组中,AppOpsSummaryActivity又没有声明,所以在不修改Settings代码的情况下没
有办法打开AppOpsSummary了 -_-
在Android4.3/4.4中Google在Settings中加入了AppOPs(可以对程序的权限进行控制,但是被隐藏了).
本文将教你如何打开这个界面,以及这么做的原理.
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.Settings");
intent.setAction(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
"com.android.settings.applications.AppOpsSummary");
startActivity(intent);
通过上面这一段代码你就可以打开Settings中AppOps界面了,就是这么简单!
那么,为什么上面的代码可以打开AppOps界面呢?这个的实现原理是什么?如果以后Google在后续版本中在Settings中隐藏了其它界面
我又应该如何打开呢?
显然,如果你想举一反三的话,那你必须要了解Settings中界面的加载机制、流程,那么Settings中的界面是如何展示出来的呢?
简单来讲,在Settings中,每个界面实际上是由Fragment构造好以后用一个Activity(大部分情况下用的是SubSettings这个Activity)把这个
Fragment显示出来.如,Settings中'Display'这个界面实际上是由DisplaySettings这个Fragment构造的,然后用一个Activity显示出来.
如果你想详细的了解Settings的界面加载等问题,可以参考本人(http://www.cnblogs.com/Lefter)的这一篇文章:关于Android Settings中的八个问题
在了解了Settings的这套界面显示机制后,我们就找到了显示AppOps的方案,即启动Settings中的一个Activity,然后用它来展示构造整个
AppOps界面的Fragment(AppOpsSummary,如果你不知道为什么是这个Fragment,再去读一下关于Android Settings中的八个问题这篇文章吧^_^).
这个方案的难点在于,我如何把AppOpsSummary这个Fragment传给Settings里面的那些PreferenceActivity呢?
阅读PreferenceActivity(Settings.java继承自该类)的onCreate函数代码,可以知道它首先会用
String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
来试图获取要显示的Fragment,则显示这个Fragment(当然,也需要其它条件成熟,但我们完全满足).Great,这个Intent.EXTRA_SHOW_FRAGMENT
就是我们要使用的属性了,我们将AppOpsSummary写到Intent对象的这个key里
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
"com.android.settings.applications.AppOpsSummary");
然后用这个intent对象来启动Settings.java(当然,你还需要设置一些其他的属性来让程序更nice).
经过上面的分析后,相信你再看我们在开篇给出的代码就不会陌生了吧.
我写的一个Demo(对Activity使用了透明效果):http://pan.baidu.com/s/1panAD
Hope u guys enjoy it!
教你如何打开android4.3和4.4中隐藏的AppOps的更多相关文章
- android4.0浏览器在eclipse中编译的步骤
工程源码: 注意: 如果下载已经修过的源码,只要进行3.4.8步骤就应该可以了. eclipse版本:adt-bundle-windows (Android Developer Tools Build ...
- 教你正确打开async/await关键字的使用
这段时间在项目开发中看到了一些async/await的使用,在aspnet core的host组件源码中也看到了许多的async/await代码.在开发时,正确的使用了async/await是可以提高 ...
- Eclipse打开当前所属文件所在windows中的文件夹
1.Eclipse设置 依次展开如下菜单: Run ---- External Tools ---- External Tools Configurations 在 program 下面新 ...
- [置顶] 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 已经有好一段时间没有关注Android应用方面的事情了:)最近单位来了一个Androi ...
- Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;
文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...
- android打开存储卡(TF卡\SD卡)中的sqlite文件
android的SDK直接支持sqlite3的API. 打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...
- 设置自己的APP能打开文件(在其他应用中打开显示自己的应用)
http://blog.csdn.net/leewolf130/article/details/29568961 http://www.jianshu.com/p/9711c3daf4bb https ...
- Loadrunner12.5-同一个网址通过vugen不能打开,但是直接在ie11中就可以打开
一:录制选项修改成“WinINet级别数据”,重新录制就可以成功打开网页了. 注:运行时设置--首选项--高级--“使用WinINet回放而非套接字(仅限Windows)”需要勾选上:否则录制脚本结束 ...
- VS2017 打开WebService 提示已经在解决方案中打开了具有该名称的项目
.net开发.用VS2017工具,打开VS2010创建的WebSevice工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...
随机推荐
- [BZOJ1122][POI2008]账本BBB 单调队列+后缀和
Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数 ...
- 01_re正则表达式
正则表达式,是一个特殊的字符串, 是对一类字符串的描述 ( 怎么描述一类字符: 普通字符+元字符+重复)检测给定的字符串,是否和正则表达式描述的字符串相匹配 举例:1) 检查一串数字是否是电话号码2) ...
- MVC ---- 如何使用Action委托
先建立一个Serven 类 public class Seven { public static void TestSeven1() { List<User> userList = Fiv ...
- Hibernate五大核心接口简介
所有的Hibernate应用中都会访问Hibernate的5个核心接口. Configuration接口:配置Hibernate,根启动Hibernate,创建SessionFactory对象. Se ...
- Cocos2d-x学习笔记(五)调度
在init方法中增加下边的代码,建议使用schedule函数,而不是scheduleUpdate函数,因为,后者默认是调用update函数,在如果有多个函数需要调度时,不是很灵活. auto labe ...
- 使用uWSGI和nginx来设置Django和你的web服务器
本教程针对那些想要设置一个生产web服务器的Django用户.它介绍了设置Django以使得其与uWSGI和nginx工作良好的必要步骤.它涵盖了所有三个组成部分,提供了一个web应用和服务器软件的完 ...
- 《剑指offer》第三十七题(序列化二叉树)
// 面试题37:序列化二叉树 // 题目:请实现两个函数,分别用来序列化和反序列化二叉树. #include "BinaryTree.h" #include <iostre ...
- 一个很棒的Flutter学习资源列表
目录 文章 一开始 HOWTO文档 网站/博客 高级 视频 组件 演示 UI 材料设计 图片 地图 图表 导航 验证 文字和富文本 分析.流量统计 自动构建 风格样式 媒体 音频 视频 语音 存储 获 ...
- 查找并替换字符串 Find And Replace in String
2018-07-29 17:08:15 问题描述: 问题求解: 字符串替换的问题有个技巧就是从右向左进行替换,这样的话,左边的index就不需要考虑变动了. public String findRep ...
- mRNA基本概念
mRNA是由DNA的一条链转录而来的(可以是正链,也可以是反链),DNA是由非编码区和编码区组成,编码区也有其特殊的结构,主要有外显子和内含子组成. mRNA的一个重要性质就是可变剪切,也就是同一个编 ...