教你如何打开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(可以对程序的权限进行控制,但是被隐藏了).
本文将教你如何打开这个界面,以及这么做的原理.
1 Intent intent = new Intent(); 2 intent.setClassName("com.android.settings", 3 "com.android.settings.Settings"); 4 intent.setAction(Intent.ACTION_MAIN); 5 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 6 | Intent.FLAG_ACTIVITY_CLEAR_TASK 7 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 8 intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, 9 "com.android.settings.applications.AppOpsSummary"); 10 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!