注:下面的方法在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的更多相关文章

  1. android4.0浏览器在eclipse中编译的步骤

    工程源码: 注意: 如果下载已经修过的源码,只要进行3.4.8步骤就应该可以了. eclipse版本:adt-bundle-windows (Android Developer Tools Build ...

  2. 教你正确打开async/await关键字的使用

    这段时间在项目开发中看到了一些async/await的使用,在aspnet core的host组件源码中也看到了许多的async/await代码.在开发时,正确的使用了async/await是可以提高 ...

  3. Eclipse打开当前所属文件所在windows中的文件夹

    1.Eclipse设置 依次展开如下菜单:    Run ---- External Tools ---- External Tools Configurations    在 program 下面新 ...

  4. [置顶] 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 已经有好一段时间没有关注Android应用方面的事情了:)最近单位来了一个Androi ...

  5. Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;

    文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...

  6. android打开存储卡(TF卡\SD卡)中的sqlite文件

    android的SDK直接支持sqlite3的API.   打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...

  7. 设置自己的APP能打开文件(在其他应用中打开显示自己的应用)

    http://blog.csdn.net/leewolf130/article/details/29568961 http://www.jianshu.com/p/9711c3daf4bb https ...

  8. Loadrunner12.5-同一个网址通过vugen不能打开,但是直接在ie11中就可以打开

    一:录制选项修改成“WinINet级别数据”,重新录制就可以成功打开网页了. 注:运行时设置--首选项--高级--“使用WinINet回放而非套接字(仅限Windows)”需要勾选上:否则录制脚本结束 ...

  9. VS2017 打开WebService 提示已经在解决方案中打开了具有该名称的项目

    .net开发.用VS2017工具,打开VS2010创建的WebSevice工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...

随机推荐

  1. perl入门知识(3)

    引用       在很多场合下使用引用传值,能在很大程度上提高代码的运行效率.       定义一个引用在变量名前加”\”就可以了,如:       $ra=\$a;       $rb=\@b;   ...

  2. BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  3. 【TCP/IP详解 卷一:协议】TCP定时器 小结

    前言 在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的. 四种定时器: 2MSL定时器,出现在 ...

  4. Win7上安装WMware虚拟机和Ubuntu操作系统

    效果图: 问题拾遗: 一.如何划分一个新硬盘空间? 参考链接:如何新建磁盘空间 效果图: 我划分了20G的内存空间给Ubuntu的硬盘空间.一般来说15G就够用了. 二.VMware上拷贝Ubuntu ...

  5. 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 ...

  6. MongoDB(课时30 $group)

    3.7.5.聚合框架(核心) MapReduce功能强大,但是它的复杂度和功能一样强大,那么我们需要MapReduce的功能,使用聚合框架中的聚合函数:aggregate(). 3.7.5.1.gro ...

  7. jQuery.extend()意义及用途

    一.意义 用于将一个或多个对象的内容合并到目标对象 二.用法: $.extend( [deep ], target, object1 [, objectN ] ) 注意: 1. 如果只为$.exten ...

  8. Java 密码扩展无限制权限策略文件[转]

    因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: JDK ...

  9. 如何查看DNS?

    查看dns服务ip:    命令: ipconfig/all  查看dns缓存:    命令:ipconfig/displaydns     强制更新缓存:    命令:ipconfig /flush ...

  10. 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 ...