【cf 辅助源码】【产品推广app源码】【linux编译谷歌源码】dumpsys 源码

1.Activity的基础知识(下)
2.你真的懂VirtualDisplay虚拟屏幕的Mirror模式吗?
3.如何获取app 的包名和activity 名

dumpsys 源码

Activity的基础知识(下)

       ä¸Šç¯‡æ€»ç»“了Activity的一些知识,现在继续对Activity的知识进行梳理,包括Activity直接传递数据,Activity的生命周期,Activity的启动模式等.

        1.intent传递数据:

        使用startActivity方法,intent的putExtra()方法,以键值对的形式传递数据,该方法有很多重载方法,可以根据传递数据的不同类型选择合适的方法.除了有putExtra()方法外,还有putExtras()方法,传递的参数是Bundle.

        如果传递的是对象,这个对象要实现序列化,也就是实现Parcelable或者Serializable接口.

        如果希望被启动的页面返回数据,需要使用startActivityForResult()方法,这个方法中需要设置访问号,用来区分不同的访问者.并且在启动页重写onActivityResult方法用来接收返回的数据,

        2.两种情况下的Activity的生命周期.

        正常情况下的生命周期,正常情况是指用户的正常操作下的Activity的生命周期.后面会分析异常情况下的生命周期.

        onCreate: Activity第一次创建时候的回调,主要是在这个方法进行初始化工作,比如初始化控件和事件绑定工作.

        onStart:Activity从不可见状态变成可见状态.

        onResume:Activity变成前台,可以和用户交互.

        onPause:Activity可见但是不能和用户交互.

        onStop:Activity从可见变得不可见,成为后台Activity.

        onDestroy:Activity销毁时调用.

        onRestart:Activity从后台变成前台Activity.

        在启动Activity和两个Activity之间跳转时,可以知道Activity的生命周期变化过程,有两个说明:(1)在两个Activity跳转时,第一个Activty的onPause,onStop方法和第二个Activity的生命周期方法调用时机.

        第一个Activity先执行onPause方法,第二个Activity才能创建.这也就意味着在onPause方法中不能执行太耗时的操作,否则会影响第二个Activity的创建.在源码(ActivityStack)中有这样的注释:

        (2)onStart和onResume,onPause和onStop这两对方法的实质不同处:onStart和onStop这两个方法是从Activity的可见性来区分的,onResume和onPause是从Activity是否处于前台,是否可以和用户交互来区分的,注意在onPause调用时Activity还是可见的,调用时机比如弹出dialog时,下面的Activity是可见的.这个时候调用的是onPause方法.

        异常情况下Activity的生命周期:异常情况下是指资源相关配置发生变化或后台Activity被系统回收时Activity的生命周期.后台Activity被系统回收的情况比较难复现,在资源相关配置发生变化时和后台Activity被回收时的生命周期执行过程是一样的,比较容易复现的就是横竖屏切换时的生命周期执行过程.在 AndroidManifest的Activity组件下配置android:screenOrientation标签,当设置可以横竖方向随着方向感应器来调节时,在切换时会出现先销毁Activity再创建的过程.

        过程:

        在这种情况下有可能会有数据的丢失,系统提供用来保存数据和还原数据的方法:onSaveInstanceState和onRestoreInstanceState.用方法参数Bundle可以保存和还原数据.

        可以根据需要设置android:screenOrientation标签,设定activity的方向,如果activity的方向是需要横竖屏切换,但是不容许销毁Activity,可以设置如下标签,当这些情况(常用的)发生变化是不会重新走Activity的生命周期方法,只会调用onConfigurationChanged,可以根据情况在这个方法里更新操作.

        切换时的log输出

        3.Activity的四种启动模式

        标准:是Activity的默认启动模式,对于AndroidManifest的Activity节点下的android:launchMode="standard"标签.

        特定:每次启动都会重新创建新的Activity.

        singleTop:对应的AndroidManifes的Activity节点下的android:launchMode="singleTop"标签

        特点:当此模式的Activity处于栈顶时,不会重新创建新的Activity,会调用onNewIntent方法,如果更新Activity的intent,需要调用 setIntent()方法,具体的生命周期过程

        singleTask:在activity栈中已经有需要再启动的activity时,会先清除位于需要启动activity之上的activity,例如:启动顺序mainActivity-activityA -activityB-activityA,其中activityA是singleTask的启动模式:

        singleInstance:在一个栈中单独存在的activity.

        关于activity栈:是指用来管理activity一种"先进先出"的队列结构,查看activity对应栈的方法:Activity的getTaskId()方法,同一个栈的id值是相同的.adb shell dumpsys activity在终端查看栈结构,比如还是上面的activity启动顺序,不同是ActivityA这是设置成singleInstance,这是的栈结构:有两个TaskRecord,其中ActivityB和MainActivity位于同一个栈中.

        4.Activity开发中使用技巧:

        <1>定义一个父Activity,在创建新的Activity时继承这个activity即可,将一些activity的公共设置可以设置在父activity中,比如获取每个Activity的名字,设置activity的窗体属性,同一管理activity的生命周期等,

        <2>在启动的activity中定义静态方法,启动条件会显而易见:

        <3>管理activityç±»,用来一键退出app.在父类Activity的创建和销毁时用来添加和移除Activity,在需要一键退出的地方调用静态finishAllActivity方法.

你真的懂VirtualDisplay虚拟屏幕的Mirror模式吗?

       理解VirtualDisplay的Mirror模式关键在于其如何根据屏幕内容的有无自动切换显示模式。当主屏幕无内容时,它会启用镜像模式,将主屏幕内容复制到虚拟屏幕上;而当虚拟屏幕有自定义内容时,它会独立显示,cf 辅助源码不会镜像主屏幕。产品推广app源码

       原理研究步骤:

       1. 要观察VirtualDisplay的显示行为,首先通过`dumpsys SurfaceFlinger`查看Display的层级数据和图层索引,确定layer能否在Display上显示。

       2. 比较镜像模式和独立显示时,layerStack的差异,发现层栈在有内容和无内容时会发生变化。

       3. 通过堆栈追踪,linux编译谷歌源码发现当Task在虚拟屏幕中移动时,会触发layerStack的修改,这与SurfaceControl相关。

       核心源码分析:

       - VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR设置下,公众号算命源码会检查DisplayContent的mApplySurfaceChangesTransaction,判断是否有内容。

       - 当内容变化时,会调用setDisplayLayerStack来调整层栈,文件搜索工具源码确保正确的Display显示。

       - 层栈匹配由SurfaceFlinger控制,决定显示哪个Display。

       进一步资料:

       - 深入研究可参考:[链接](mp.weixin.qq.com/s/LbVL...),以及其他课程资料:[链接](mp.weixin.qq.com/s/Qv8z...)。

       - 视频教程可在B站观看:[链接](bilibili.com/video/BV1w...)。

       通过以上分析,VirtualDisplay的Mirror模式依赖于内容的存在与否来决定是否镜像主屏幕,以及如何调整层栈以确保正确的显示。

如何获取app 的包名和activity 名

       æˆ‘们在进行手机自动化测试时经常要知道app 的包名和Activiy 名称,好多同仁刚学习时不知从哪去找,其实有好多种方法可以获取这些值

       ä»¥ä¸‹æ˜¯é’ˆå¯¹æ— æºç çš„情形,更适合于初学同仁

       æ–¹æ³•ä¸€ 用重签名工具,这个在Robotium 中用得比较多

       å¦å¤–一种方式用命令方获取

       Aapt dumpbadging xxxx.apk

       ç¬¬ä¸€ä¸ªæ¡†ä¸ºåŒ…名

       ç¬¬äºŒä¸ªæ¡†ä¸ºä¸»Activity名

       å¦‚果取包名与Activity在命令行中不方例还可以用以下方式获取

       Aapt dumpbadging xxxx.apk >c:\apk.txt

       ä¹‹åŽæ‰“å¼€c:\apk.txt

       ç¬¬ä¸‰ç§æ–¹å¼ï¼Œå¦‚果你装了Appium 可以这么操作下

       è¿›å…¥è®¾ç½®é¡µï¼Œé€‰æ‹©APK 路径,下面就会显示包名和Activity名称

       ç¬¬å››ç§ç”¨hierarchyviewer 查看

       Aapt 命令

       AAPT dump xmltree XXX.APK AndroidManifest.xm. >c.txt

       ä¹‹åŽåŽ»C.TXT 查看

       ç¬¬6种

       Adbshell dumpsys activity activities >d:\log.txt

       ä¹‹åŽåŽ»log.txt 搜package 和Activity

       ç¬¬ä¸ƒç§

       Adb logcag >d:\3.txt

       ä¹‹åŽæ‰“开手机上的应用

       æ‰“开之后立即在电脑上按ctrl+c

       ä¹‹åŽåŽ»3.txt 找PACKAGE和Activity

更多内容请点击【综合】专栏

精彩资讯