《Android 群英传》 阅读笔记 第七章~第九章

来源:互联网 发布:购物秒杀软件 编辑:程序博客网 时间:2024/04/30 14:14
第7章 Android 动画机制与使用技巧 

7.1Android View动画框架 
1、Animation框架定义了透明度、旋转、缩放和位移几种常见的动画,而且控制的是整个View。
实现原理 
1、每次绘制视图时,View所在的ViewGroup中的drawChild函数,获取该View的Animation的Transformation值
2、然后调用canvas。concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。
3、如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画。
视图动画的缺陷在于不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方。

7.2 属性动画分析 
Animator 框架中使用最多的就是AnimatorSet和ObjectAnimator配合。
使用ObjectAnimator进行更精细化控制,只控制一个对象的一个属性值,
而使用多个ObjectAnimator组合到AnimatorSet形成一个动画。
而且ObjectAnimator能够自动驱动,可以调用setFrameDelay(long frameDelay)设置动画帧之间的间隙时间,调整帧率,减少动画过程中频繁绘制界面,而在不影响动画效果的前提下减少CPU资源消耗。

7.2.1 ObjectAnimator 
ObjectAnimator 是属性动画框架中最重要的实行类,
创建一个ObjectAnimator只需通过他的静态工厂类直接返回一个ObjectAnimator对象。
参数包括一个对象和对象的属性名字,但这个属性比较有get和set函数。
内部通过Java反射机制来调用set函数修改对象的属性值。同样,也可以调用setInterpolator来设置相应的差值器。
在使用ObjectAnimator的时候,有一点非常重要,那就是要操纵的属性必须具有get、set方法,不然objectAnimator就无法起效。下面是一些常用可以直接用的属性值。
1、translationX和translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标偏移的位置。
2、rotation、rotationX和rotationY:这三个属性控制View对象围绕支点进行2D和3D旋转
3、scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放 
4、pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。
5、x和y,这是两个简单使用的属性,它描述了View对象在它的容器中的最终位置,
6、alpha:它表示View对象的alpha透明度,默认度是1不透明,0是完全透明。

7.2.2 PropertyValuesHolder
在属性动画中,如果针对同一个对象的多个属性,要同时作多种动画,可以使用PropertyValuesHolder来实现。
比如举例的平移动画,如果需要在平移过程中,同时改变X、Y轴的缩放。

7.2.3 ValueAnimator
ObjectAnimator也是继承自ValueAnimator。
ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。

7.3 Android 布局动画 
所谓布局动画,是指作用在ViewGroup上,给ViewGroup增加View时添加一个动画效果。

7.4 Interpolators(插值器)
插值器是动画中的一个非常重要的概念,通过插值器,可以定义动画变化效率,其作用主要是控制目标变量的变化值进行对应的变化。
同样的一个动画变换起始值,在不同的插值器作用下,每个单位时间内所达到的变化值也是不一样的。

使用Camera类来实现一个自定义的3D动画效果。
这里的Camera并不是指手机中的相机,而是android.graphics.Camera的Camera类,它封装了openGl的3D动画,从而可以非常方便地创建3D动画。
把Camera想象成一个真实的摄像机,当物体固定在某处,只要移动摄像机就能拍摄到具有立体感的图像。
使用Camera类实现动画效果非常简单,无非就是三个坐标轴的旋转角度,最后两行代码,可以改变旋转时的默认旋转中心。


7.6 Android 5.X SVG 矢量动画机制 
Google在Android5.X中增加了对SVG矢量图形的支持。
什么是SVG?
1、可伸缩矢量图形
2、定义用于网络的基于矢量的图形
3、使用XML格式定义图形
4、图像在方法或改变尺寸的情况下其图形质量不会有所损失 
5、万维网联盟的标准
6、与诸如DOM和XSL之类的W3C标准是一个整体。

Bitmap(位图)通过在每个像素点上存储色彩信息来表达图像,而SVG是一个绘图标准。
与Bitmap相比,SVG最大的有点就是放大不会失真。
而且Bitmap需要为不同的分辨率设计多套图标,而矢量则不需要。

7.6.1 <path>标签
使用<path>标签创建SVG,就像用指令的方法来控制一只画笔,例如移动画笔到某一坐标位置,画一条线,画一条曲线。
M=moveto(M X,Y):将画笔移动到指定的坐标位置,但未发生绘制 
L   =lineto(L X ,Y):画直线到指定的坐标位置
H   =horizontal lineto(H X):A画 水平线到指定的X坐标位置
V   =vertical lineto(V Y ):画垂直线到指定的Y坐标位置 
C   =cureto(C X1,Y1,Y2,ENDX,ENDY):三次贝塞曲线 
S    =smooth  curvetor(S X2, Y2 ,ENDX ,END Y):三次贝塞曲线 

7.6.4 Android中使用SVG
1、VectorDrawable
2、AnimatedVetorDrawable
其中VetorDrawable 让你可以创建基于XML的SVG图形,并结合AnimatedVectorDrawable来实现动画效果

7.6.4.1 VectorDrawable
在XML中创建一个静态的SVG图形。
path是SVG树形结构中的最小单位,而通过Group可以将不同的path进行组合。

 
7.7.3 下拉展开动画
当点击一个View的时候,显示下面隐藏的一个View,要实现这个功能,需要将View的visibility属性由gone设置为visible即可,但是这个过程是瞬间完成的。



























第8章 Activity 与Activity调用栈分析 

8.1.1 系统采用Activity栈的方式来管理Activity
8.1.2 Activity形态  

1、Active/Running 
这时,Activity处于Activity栈的最顶层,可见,并与用户交互。

2、Paused
当Activity失去焦点时,被一个新的非全屏的Activity,或者一个透明的Activity放置在栈顶时,Activity就转化为Paused,它只是失去了与用户交互的能力,所有的状态信息、成员变量都保持着,只有在系统内存极低的情况下,才会被系统回收。

3、Stopped
如果一个Activity被另一个Activity完全覆盖,此时它不在可见,但仍然保持了所有状态信息和成员变量。

4、Killed
当Activity被系统回收掉或者Activity从来没有创建过,Activity就处于Killed状态。

8.1.3 Activity的生命周期 
1、Resumed。Activity处于Activity栈顶,处理用户的交互。
2、Paused。当Activity的一部分挡住的时候进入这个状态,这个状态Activity不会接受用户输入。
3、stopped 当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。

8.1.3.1 Activity启动与销毁过程 
onCreate(),创建基本的UI元素
onPause()与onStop():清除Activity的资源,避免浪费。
onDestory():因为引用会在Activity销毁的时候销毁,而线程不会,所以清楚开启的线程。

8.1.3.2 Activity的暂停与恢复过程
onPause():释放系统资源,如,Camera,sensor,receivers
onResume():需要重新初始化在onPause()中释放的资源

8.1.3.3 Activity的停止过程
栈顶的Activity部分不可见时,实际上后续会有两种可能,从部分不可见到可见,也就是恢复过程;从部分不可见到完全不可见,也就是停止过程。
系统在Activity不可见的时候,总会调用onPause()方法。
每当Activity由不可见到可见时,都会调用onStart()方法。

8.1.3.4 Activity的重新创建过程 
如果你的系统长时间处于onStopped形态,且此时系统需要更多内存或内存极为紧张时,系统会回收你的Activity。此时系统为了补偿,会将Activity状态通过onSaveInstanceState()方法保存到Bundle对象中。
如果用户使用finish()方法结束了Activity,则不会调用。

8.2Android 任务栈简介
当一个app启动时,如果当前环境中不存在该app的任务栈,那么系统就会创建一个任务栈。此后,当这个app启动的Activity豆浆这个任务栈中被管理,这个栈也被成为Task,即表示若个Activity的集合,他们组合在一起形成一个Task。
一个Task中的Activity可以来自不同的app,同一个app的Activity也可能不在一个Task中。

8.3 Android Mainfest启动模式 

8.3.1 standard 

8.3.2 singletop
如果指定启动Activity为singletop模式,那么在启动时,系统会判断当前栈顶Activity是不是要启动的Activity,如果是,则不创建新的Activity而直接引用这个Activity,如果不是则创建新的Activity。
这种模式通常适用于收到消息后显示的界面,例如QQ接收到消息后,弹出Activity。

当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法

当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法


8.3.3 singleTask
singletask是检测整个Activity栈中是否存在当前需要启动的Activity。如果存在,则将该Activity置于栈顶,并将该Activity以上的Activity销毁。这里是指同一个app中启动这个singletask的Activity,如果其他程序以singleTask模式启动这个Activity,那么它将创建一个新的任务栈。

如果启动的模式为singleTaskde 的Activity已经在后台一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台。

使用这个模式创建的Activity不是在新的任务栈中被打开,就是将已打开的Activity切换到前台。
通常用来退出整个应用:将主Activity设为singleTask模式,然后在要退出的Activity中转到主Activity,从而将主Activity之上的Activity都清除。然后重写主activity的OnNewIntent()方法,在方法中加上一句finish(),将最后一个activity结束。

8.3.4 singleInstance
声明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在一个activity。

关于singleTop和singleInstance这两种模式,有一点需要说明。如果在一个singletop或者singleinstance的Activity中通过startActivityforresule()方法启动另一个activity,那么系统将直接返回Activity_Result_cancled而不会再去等待返回。
Android开发者认为,不同task之间,默认不能传递数据,如果一定要传递,只能通过intent来帮定数据。

8.4 Intent Flag 启动模式 
1、Intent.Flag_ACTIVITY_NEW_TASK
使用一个新的task来启动一个Activity。但启动每个activity都在一个新的task中。
2、Flag_activity_singletop
使用singletop模式来启动一个activity
3、Flag_activity_clear_top
使用singletask模式来启动一个activity
4、flag_activity_no_history
使用这种模式启动activity,当该activity启动其他activity后,该activity就消失了,不会保留在activity栈中。

第9章 Android 系统信息与安全机制 

9.1Android 系统信息获取 
通常可以从以下两个方面 1、android.os.build 2、SystemProperty

9.1.1android.os.Build 
1、build.board//主板  2、build.brand //android系统定制商 
3、build.supported_abis cpu指令集 

9.1.2 SystemProperty

9.2 Android Apk应用信息获取之PackageManager
PM(PackageManager)主宰着应用的包管理 
AM(ActivityManager)主宰着应用的活动管理

9.2.1 PackManager 
graphic
最里面的框代表了整个Activity的信息,系统提供了Activityinfo类进行封装。
最外面的框代表着整个mianfest文件中节点的信息,系统提供了PackageInfo来进行封装。
Android提供了PackageManager来负责管理所有已安装的app。

1、Applicationinfo
它封装了<application><application />>。其中FLAG_SYSTEM为系统应用。FLAG_EXTERNAL_STORAGE表示为安装在SDCard上的应用等。
2、PackageInfo
它封装了mianfest文件的相关节点信息。
3、ResolverInfo
它封装了包含<intent>信息的上一级信息。所以它可以返回Activityinfo,Serviceinfo等包含<intent>的信息,它经常用来帮助我们找到那些包含特定intent条件的信息,如带分享功能,播放功能的应用。

9.3 Android Apk应用信息获取之ActivityManager
1、ActivityManager.MemoryInfo
availMem——系统可用内存   totalMem——总内存  
threshold——低内存的阀值    lowMemory——是否处于低内存 

2、Debug.MemoryInfo
ActivityManager.MemoryInfo通常用于获取全局的内存使用信息,而Debug.MemoryInfo用于统计进程下的内存信息。

3、RunningAppProcessInfo
运行进程的信息。

4、RunningServiceInfo
运行的服务信息 

9.4 解析Package.xml获取系统信息。
在系统初始化的时候,PackageManager的底层实现类PackageManagerService回去扫描系统中的一些特定的目录,并解析其中的APK文件。
同时,Android把它获得应用信息,保存在xml文件中,做成一个应用的花名册。当系统中的ApK安装、删除,升级时,它也会被更新,就是位于/data/system/package.xml文件。

1、permission标签 
permission标签定了目前系统中的所有权限,并分为两类,系统定义的(package属性为Android)和Apk定义的(package属性为Apk的包名)

2、package标签 
name:apk包名 。 
codePath:Apk安装路径。主要有/system/app和 /data/app两种。
/system/app存放系统级别的Apk和厂商定制的Apk
/data/app存放用户安装的第三方Apk

3、<perms> 标签 
对应Apk的AndroidMainfest文件中的<uses-permission>标签,记录Apk的权限信息。

9.5 Android安全机制 

9.5.1. 第一道防线1
代码安全机制——代码混淆proguard 
proguard在代码层面上对Android应用程序app的第一重保护。

9.5.1.2第二道防线 
应用接入权限控制——AndroidMainfest文件权限声明、权限检查机制 
不足 
1、被授予的权限无法停止 
2、在应用声明app使用权限时,用户无法针对部分权限进行限制 
3、权限声明机制与用户的安全理念相关。

Android通过以下顺序来检查操作者的权限 
1、判断permission名称,如果为空,则直接返回PERMISSION_DENIED。
2、判断UID。如果为0,则为root权限,不做权限控制;如果为System Server的Uid则为系统服务,不做权限控制;如果uid与参数中的请求uid不同,则返回Permission_denied。
3、通过调用PackageManagerService.checkUidPermission()判断该Uid是否具有相应的权限。

9.5.1.3 第三道防线
应用签名机制——数字证书 

9.5.1.4 第四道防线 
Linux内核安全机制——Uid、访问权限控制
Linux文件系统的权限控制是由user、group、other与读、写、执行的不同组合来实现。通常情况下,只有system、root用户才有权限访问到系统文件。

9.5.1.5
Android虚拟沙箱机制——沙箱隔离 

9.5.3 Android Apk反编译 

9.5.3.1 apktool
对test.apk执行反编译命令 
1、格式非常简单,指定d参数,并写入要反编译的Apk目录。
2、重新打包的命令与解码的命令相似,只是需要将d改为b,并选择前面解码生成的文件夹。执行该命令后,在文件夹下就会生成两个新的文件夹。

9.5.3.2  Dex2jar、jd-gui
1、先回到开始用解压缩文件解压的apk后那个文件夹,文件夹有一个非常重要的文件,dex文件。
2、将dex文件复制到dex2jar-0.0.9.15,执行分析
graphic

graphic

3、获取到jar文件之后,就轮到jd-gui上场了。打开jd-gui,并选择file-open file,并选择刚刚生成的class-dex2jar.jar。就可以看到相关源代码了。

9.5.4 Android Apk加密 


0 0