注:下面的方法在4.4.2更新後已失效!html
PreferenceActivity的switchToHeaderInner()函數中會調用isValidFragment函數來檢查fragment是否合法。而在Settings.java的isValidFragmentjava
函數中沒有把AppOpsSummary放到ENTRY_FRAGMENTS數組中,AppOpsSummaryActivity又沒有聲明,因此在不修改Settings代碼的狀況下沒android
有辦法打開AppOpsSummary了 -_-數組
在Android4.3/4.4中Google在Settings中加入了AppOPs(能夠對程序的權限進行控制,可是被隱藏了).app
本文將教你如何打開這個界面,以及這麼作的原理.函數
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界面了,就是這麼簡單!spa
那麼,爲何上面的代碼能夠打開AppOps界面呢?這個的實現原理是什麼?若是之後Google在後續版本中在Settings中隱藏了其它界面code
我又應該如何打開呢?htm
顯然,若是你想觸類旁通的話,那你必需要了解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!