教你如何打開android4.3和4.4中隱藏的AppOps

注:下面的方法在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!

相關文章
相關標籤/搜索