安卓应用开发知识:
- 四大组件:Activity 、ContentProvider、BroadcastReceiver、Service
- Handler消息机制
- 点击事件传递
- Fragment
- 动画:帧动画、补间动画、属性动画
- View绘制及xml
四大组件:Activity 、ContentProvider、BroadcastReceiver、Service
Activity
activity之间通信方式使用Intent
ContentProvider
获取本地图片、视频和文件等资源的方式,底层是有binder机制实现的,类似于AIDL
- 对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在DB,XML、Preferences或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改
- 提供一种跨进程数据共享的方式
BroadcastReceiver
广播通信数据也需要使用Intent进行包装并指定相应的action
- 应用可以使用它对特定的事件进行过滤,可以是外部事件(如当电话呼入时,或者数据网络可用时),也可以使内部自定义事件,对该事件进行接收并做出响应。广播接收器没有用户界面;
- 广播接收者的注册有两种方法,分别是程序动态注册(在运行时的代码中使用Context.registerReceive()进行注册)和AndroidManifest文件中进行静态注册;
- 动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
Service
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行
- startService只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
- bindService方法启动Service,其他组件可以通过回调获取Service的代理对象和Service交互,而这两方也进行了绑定,当启动方销毁时,Service也会自动进行unBind操作,当发现所有绑定都进行了unBind时才会销毁Service。
Handler消息机制
Message、Looper、MassageQueue、Handler
- Looper :负责关联线程以及消息的分发在该线程下从 MessageQueue 获取 Message,分发给 Handler ;
- MessageQueue :是个队列,负责消息的存储与管理,负责管理由 Handler 发送过来的 Message ;
- Handler : 负责发送并处理消息,面向开发者,提供 API,并隐藏背后实现的细节。
点击事件传递
Fragment
Fragment是轻量化Activity,生命周期和Activiry绑定,只有依附于activity才能运行,但是创建不用通framework层所以创建较为快速。
动画:帧动画、补间动画、属性动画
帧动画(Drawable Animation)
- 1、在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片;
- 2、使用AnimationDrawable类播放第一步定义好的Drawable中的图片,形成动画效果;
补间动画(View Animation)
- view动画也称为补间动画,因为我们只需要拿到一个view,设定它开始和结束的位置,中间的view会自动由系统补齐,而不需要帧动画每一幅图都是提前准备好的。
- view动画是Android一开始就提供的比较原始的动画,主要支持四种效果:平移、缩放、旋转、透明度变化(渐变) 四种基本效果,我们可以再这四种基础效果的基础上,选择其中的几种进行组合。
动画Animation 组合动画设置类AnimationSet
属性动画(Property Animation)
属性动画可以看作是增强版的补间动画,与补间动画的不同之处体现在:
补间动画只能定义两个关键帧在透明、旋转、位移和倾斜这四个属性的变换,但是属性动画可以定义任何属性的变化。
补间动画只能对 UI 组件执行动画,但属性动画可以对任何对象执行动画。
与补间动画类似的是,属性动画也需要定义几个方面的属性:
动画持续时间,默认为 300ms,可以通过 android:duration 属性指定。
动画插值方式,通过 android:interploator 指定。
动画重复次数,通过 android:repeatCount 指定。
重复行为,通过 android:repeatMode 指定。
动画集,在属性资源文件中通过 <set …/> 来组合。
帧刷新率,指定多长时间播放一帧。默认为 10 ms。
属性动画 API
Animator: 提供创建属性动画的基类,基本不会直接使用这个类。
ValueAnimator:属性动画用到的主要的时间引擎,负责计算各个帧的属性值,基本上其他属性动画都会直接或间接继承它;
ObjectAnimator: ValueAnimator 的子类,对指定对象的属性执行动画。
AnimatorSet:Animator 的子类,用于组合多个 Animator。
除了这些 API,属性动画还提供了一个 Evaluator ,用来控制属性动画如何计算属性值。
IntEvaluator:计算 int 类型属性值的计算器。
FloatEvaluator: 用于计算 float 类型属性值的计算器。
ArgbEvaluator: 用于计算十六进制形式表示的颜色值的计算器。
TypeEvaluator: 可以自定义计算器。
使用 ValueAnimator 创建动画的步骤:
调用 ValueAnimator 的 ofInt()、ofFloat() 或者 ofObject() 静态方法创建 ValueAnimator 实例。*
调用 ValueAnimator 的 setXxx() 等方法设置持续时间,插值方式、重复次数等。
调用 ValueAnimator 的 start() 方法启动动画。
为 ValueAnimator 注册 AnimatorUpdateListener 监听器,在该监听器中可以监听 ValueAnimator 计算出来的值改变,并将这些值应用到指定对象上。
View绘制及xml
view的绘制流程
- view的绘制流程从ViewRoot的performTraversals方法开始,经过measure、layout、draw三个过程后将一个view绘制出来。
measure:用来测量view的宽高
layout:用来确定在父容器中的位置
draw:负责将view绘制在屏幕上 - performTraversals方法会依次调用performMeasure、performLayout、performDraw三个方法。在这三个方法中分别完成顶级view的measure、layout和draw流程。以performMeasure为例,其中会调用measure方法,在measure方法中又调用onMeasure方法,onMeasure方法则会对所有的子view进行measure,这样就完成依次measure过程。接着子元素会重复父容器的measure过程,如此反复完成整个view树的遍历
xml
布局:
LinearLayout
RelativeLayout
FrameLayout
GridLayout
TableLayout
AbsoluteLayout
ConstraintLayout
其他标签 TextView、ImageView、Button、EditText、ListView、RecycleView
安卓开发环境搭建和注意事项:
安卓开发工具:Android Studio
安卓开发语言:java/xml/kotlin
- 框架需用gradle 4.4才运行
- gradle4.4适配相应的java版本 推荐1.8.0_311
open ~/.zshrc(.bash_profile) 配置的环境变量 sdk ndk及gradle
#Setting PATH for Android ADB Tools
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/yinguoliang/Library/Android/sdk/platform-tools"
export PATH=${PATH}:~/Library/Android/sdk/platform-tools
export PATH=${PATH}:~/Library/Android/sdk/ndk-bundle
NDK_HOME=/Users/yinguoliang/Library/Android/sdk/ndk/android-ndk-r18b
export NDK_HOME
#android sdk
export ANDROID_HOME="/Users/yinguoliang/Library/Android/sdk"
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
#android gradle
export GRADLE_HOME=/Users/yinguoliang/Documents/gradle/gradle-4.4
export PATH=$PATH:${GRADLE_HOME}/bin
setopt no_nomatch