zoukankan      html  css  js  c++  java
  • 教你如何打开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!

  • 相关阅读:
    ThinkPHP5如何修改默认跳转成功和失败页面
    layer:web弹出层解决方案
    js插件---video.js如何使用
    【Leetcode】Search a 2D Matrix
    tableView 短剪线离开15像素问题
    经Apache将tomcat转用80port这两个域名
    [Python 2.7] Hello World CGI HTTP Server
    《代码的第一行——Android》封面诞生
    MySQL汇总数据
    Windows移动开发(一)——登堂入室
  • 原文地址:https://www.cnblogs.com/Lefter/p/3451853.html
Copyright © 2011-2022 走看看