注:下面的方法在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. java中子类实例化过程中的内存分配

    知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...

  2. Java ServletContext详解

    转载: ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletConte ...

  3. poj 2480 Longge's problem 欧拉函数+素数打表

    Longge's problem   Description Longge is good at mathematics and he likes to think about hard mathem ...

  4. JMeter源码导入到Intellij IDEA

    环境: Windows10,jdk1.8,Intellij IDEA 2018.1.5 x64,apache-jmeter-4.0_src.zip  http://jmeter.apache.org/ ...

  5. PROC怎么遇到错误全局rollback---SQLServer 异常的处理

    ALTER PROCEDURE [dbo].[PROC_SMSACTIVE_UPDATE] AS BEGIN SET XACT_ABORT ON

  6. JS + flash 复制

    js代码ZeroClipboard组件制作复制剪切板复制粘贴文字内容,一键即可复制粘贴文字内容.兼容各大主流浏览器firefox,,Chrome,IE等. 演示代码 如下: <script ty ...

  7. Qt5_各种路径

    1.Qt5.3.2 -- vs2010 -- OpenGL 1.1.发布时需要的 DLL文件的路径 F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\msvc2 ...

  8. 《剑指offer》第三十题(包含min函数的栈)

    // 面试题30:包含min函数的栈 // 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min // 函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). #i ...

  9. onLoad和DomContentLoad的区别

    onLoad是的在页面所有文件加载完成后执行 DomContentLoad是Dom加载完成后执行,不必等待样式脚本和图片加载 domContentLoad更为合理, 原理: 如果是webkit引擎则轮 ...

  10. _proto_和prototype区别

    推荐一篇阅读:http://cometosay.com/2016/08/31/js-proto.html es中创建对象的方法 (1)对象字面量的方式 (2)new 的方式 (3)ES5中的`Obje ...