美文网首页安卓墙Android开发程序员
Android Developer 的正确姿势之获得手机当前界

Android Developer 的正确姿势之获得手机当前界

作者: badmask | 来源:发表于2017-09-16 16:56 被阅读103次

    前文:
    写这篇文章的初衷其实是这样的,最近想在用户启动 APP 时,引导用户进入系统的设置界面,于是我在网上看到了这段代码:

    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if(Build.VERSION.SDK_INT >= 9){
         intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
         intent.setData(Uri.fromParts("package", mContext.getPackageName(), null));
    } else if(Build.VERSION.SDK_INT <= 8){
         intent.setAction(Intent.ACTION_VIEW);
         intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
         intent.putExtra("com.android.settings.ApplicationPkgName", mContext.getPackageName());
    }
    startActivity(intent);
    
    设置界面,这里以「微信」为例.png

    我很好奇为什么会在「intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");」这段代码中这么写?同时又受到这篇文章的启发,就想玩玩「adb shell dumpsys」命令,毕竟代码的一大禁忌就是「功能实现了,但是写的不明不白」~

    好了,正文来了

    注:下面所有的命令都需要在数据线连接手机的情况下进行,检测是否连接成功的最好方法就是看 Android Studio 的 「Connected Devices」是否正常显示了~

    捕捉当前的 activity 「即,当前通过 USB 连接电脑的手机的界面上显示『onResume』的 Activity 的信息」:

    在命令行窗口输入如下内容:

    adb shell dumpsys activity top
    

    输出:

    TASK null id=488
      ACTIVITY com.android.settings/.applications.InstalledAppDetails 955e010 pid=13576
        Local Activity d7e4b34 State:
          mResumed=false mStopped=true mFinished=false
          mChangingConfigurations=false
          mCurrentConfig={1.0 460mcc2mnc en_US ldltr sw360dp w360dp h616dp 480dpi nrml long port finger -keyb/v/h -nav/h s.13 themeId=0, affectGlobal:true}
          mLoadersStarted=true
          Active Fragments in 517189:
            #0: InstalledAppDetails{c3b458e #0 id=0x7f120256}
            「省略一堆代码」
        ViewRoot:
          mAdded=true mRemoved=false
          mConsumeBatchedInputScheduled=false
      「省略一些代码」
        View Hierarchy:
          com.android.internal.policy.PhoneWindow$DecorView{fee7866 V.E...... R....... 0,0-1080,1920}
    「省略大部分代码,这部分代码的主要说明内容当前的 Activity 的 View 的层级关系」
        Looper (main, tid 1) {6faf70a}
          (Total messages: 0, polling=false, quitting=false)
    

    其实最想知道的内容已经知道了
    「 ACTIVITY com.android.settings/.applications.InstalledAppDetails」

    写道这里其实应该结束了,但是你没有奇怪的地方吗?为毛「android.settings.APPLICATION_DETAILS_SETTINGS」这样写也可以?
    哈哈,其实查看官方可以看到如下说法:

    官方网站截图.png
    再查看 android 的源码,看到了如下解释:
     public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS =
                "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS";
    

    哈哈,好像没有啥需要奇怪的了~

    写到这里,其实真的应该结束了,不过却突然对 「adb shell dumpsys」命令有了兴趣,其实这篇文章也只是对 「adb shell dumpsys」命令有了一个引子的作用,下篇文章继续~~~

    参考文章:
    使用adb shell dumpsys检测Android的Activity任务栈

    相关文章

      网友评论

        本文标题:Android Developer 的正确姿势之获得手机当前界

        本文链接:https://www.haomeiwen.com/subject/vxkesxtx.html