注:下面的方法在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. 2、extract-text-webpack-plugin提取Sass编译的Css

    cnpm install css-loader --save-dev    //css-loader 是将css打包进js cnpm install style-loader --save-dev   ...

  2. java的事务类型及定义

    转载: 什么是事务: 首先,说说什么事务.我认为事务,就是一组操作数据库的动作集合. 事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务. ...

  3. 【Coursera】Sixth Week(1)

    Transport Layer 在学习完 Link Layer(Ethernet),Internetwork Layer(IP)之后,我们来到了TCP/IP协议簇的上半部分. Review:Magic ...

  4. ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误

    一.ng-include 引入的文件中 ,ng-model 数据不更新 例如, $scope.username = “Jones”  .此时,在 ng-include 引入的文件中,直接使用 ng-m ...

  5. Myeclipse下配置svn

    转载高鑫的..嘻嘻.. MyEclipse安装配置SVN 2013.10.15 No Comments 67 Views 配置之前请先关闭MyEclipse,OK开始了 1.解压site-1.6.18 ...

  6. nginx 跨域解决

    server { listen 8811 default_server; root /opt/bp; # Make site accessible from http://localhost/ ser ...

  7. 《Robot Framework自动化测试修炼宝典》道长

    1. Python下载https://www.python.org/downloads 2. Setuptools下载https://pypi.python.org/pypi/setuptools用原 ...

  8. 01_DllZZ.cpp

    1. // DllZZ.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" ...

  9. Beta冲刺一《WAP团队》

    β冲刺第一天  1. 今日完成任务情况以及遇到的问题. ①马麒.杜有海:管理员审核表的完善 ②郝明宇:登录.注册界面的完善 ③马宏伟.周欣:前端数据借用与后台的连接 ④乌勒扎:登录与注册功能的测试 2 ...

  10. Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'as3'

    执行更新时的出错信息 Whitelabel Error Page This application has no explicit mapping for /error, so you are see ...