教你如何打开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工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...
随机推荐
- perl入门知识(3)
引用 在很多场合下使用引用传值,能在很大程度上提高代码的运行效率. 定义一个引用在变量名前加”\”就可以了,如: $ra=\$a; $rb=\@b; ...
- BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
- 【TCP/IP详解 卷一:协议】TCP定时器 小结
前言 在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的. 四种定时器: 2MSL定时器,出现在 ...
- Win7上安装WMware虚拟机和Ubuntu操作系统
效果图: 问题拾遗: 一.如何划分一个新硬盘空间? 参考链接:如何新建磁盘空间 效果图: 我划分了20G的内存空间给Ubuntu的硬盘空间.一般来说15G就够用了. 二.VMware上拷贝Ubuntu ...
- Croc Champ 2013 - Round 1 E. Copying Data 分块
E. Copying Data time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- MongoDB(课时30 $group)
3.7.5.聚合框架(核心) MapReduce功能强大,但是它的复杂度和功能一样强大,那么我们需要MapReduce的功能,使用聚合框架中的聚合函数:aggregate(). 3.7.5.1.gro ...
- jQuery.extend()意义及用途
一.意义 用于将一个或多个对象的内容合并到目标对象 二.用法: $.extend( [deep ], target, object1 [, objectN ] ) 注意: 1. 如果只为$.exten ...
- Java 密码扩展无限制权限策略文件[转]
因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: JDK ...
- 如何查看DNS?
查看dns服务ip: 命令: ipconfig/all 查看dns缓存: 命令:ipconfig/displaydns 强制更新缓存: 命令:ipconfig /flush ...
- Codeforces 834D - The Bakery(dp+线段树)
834D - The Bakery 思路:dp[i][j]表示到第j个数为止分成i段的最大总和值. dp[i][j]=max{dp[i-1][x]+c(x+1,j)(i-1≤x≤j-1)},c(x+1 ...