Android客户端概览和组件介绍 | 青训营笔记

120 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第1天。今天的笔记内容包括课程第一节-Android系统及客户端概览和第二节-客户端基础知识必备。

Android客户端概览

两句鸡汤:

  • 在某个领域达到前20%,那么职业生涯会延长;在某两个领域达到前20%,那么职业的天花板会很高。
  • 人们为了逃避真正的思考,是可以做任何事情的。因此向上的任何一步都会很艰难,不要怕艰难。

image.png

这个图片可以说展示了工程师的进阶之路

git的使用

image.png 本地设置
git config --global user.name "your name"
git config --global user.email "your email"

git clone

分支创建 git branch
分支切换 git checkout

git add
git commit -m "commit info"
git push

Android组件

基础组件

开发中常用的组件。

1.1 界面组件 Activity & Fragment

Activity:界面容器。承担的作用是前台交互、程序入口、布局容器。

一个需求:图片浏览器
1. 实现一个图片浏览APP(Activity+Fragment)
相册页面+大图页面+调用相机(Intent)
2. 旋转屏幕场景(Activity生命周期)
3. 内置升级能力(Service使用)
4. 单一首页(SingleTask)
5. 相关图片(SingleTop)
6. 扫描所有图片(ContentProvider)
7. 提供图片选择能力给系统(Intent)

image.png

Activity的基本用法

  • 注册,布局,绑定
  • 声明在程序清单:AndroidManifest.xml里面的标签中写入activity的类名等信息
  • 布局:activity_main.xml文件中定义布局方式
  • 绑定:写该Activity类的具体内容,继承Activity并实现onCreate方法

GridView + Adaptor:相册列表页以及相册图片页
Viewpager(可以左右滑动) + Adaptor:大图浏览

Activity生命周期

image.png

123启动,456是退出的步骤。
其中Paused是部分遮挡状态(onPause()),只需要onResume()恢复
而Stopped是全部遮挡(onPause(),onSaveInstanceState(),onStop()),需要从start开始恢复(onRestart(),onStart(),onResume())

配置改变场景
配置改变时,通常需要Activity的销毁和重建。也就是系统调用到onDestroy,然后再onCreate。
若想配置改变onFigurationChanged()不重建Activity:AndroidManifest中配置Activity节点的configChange属性。
local:语言改变 fontScale:字体大小 orientation:旋转屏幕 keybordHidden:键盘显示隐藏

后台回收 销毁时不会有时机处理。存储数据应该在生命周期中paused或者stopped的时候。重建时系统才能恢复数据onCreate()-onStart()-onRestoreInstanceState()-onResume()。

接电话Crash问题?页面被回收导致本地变量被置空,空指针报错。
问题解决:1 添加判空逻辑 
2 在页面回收生命周期中存储数据,页面重建时进行恢复:
在onSaveInstanceState()中写入需要保存的数据,onRestoreInstanceState()进行数据恢复。

加入首页按钮后,点击会在当前页面上新建首页,而不是退出所有页面回到首页?

解决方案:页面是有一个栈的,而Activity有四种启动模式launchmode。将首页launchmode设置为singleTask。
standard:默认模式,允许重复。
singleTop:栈顶复用,不允许连续重复。
singleTask:栈内复用,不允许同个栈内重复。(可以解决一个首页的问题)
singleInstance:全局复用,整个(安卓)系统不允许重复。(不常用,用途:银行登录界面,电话通讯录)

图库APP每个页面都是Activity?

不。是Fragment。

Fragment是轻量级页面容器,速度更快,并实现界面组件分离,解决屏幕尺寸碎片化问题。

Fragment的用法

用法:
1. 创建Fragment布局文件
2. 创建Fragment子类,加载布局文件
3. Activity加载Fragment
静态加载:布局中绑定 动态加载:FragmentManager加载

Fragment的生命周期

image.png 注:Fragment生命周期可通过FragmentTransaction.SetMaxLifecycle()手动干预

Fragment与Activity交互
组件获取
Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx)
Activity获取Fragment中的组件:FragmentManager.findFragmentById(R.id.fragment_xxx)
数据传递
Activity->Fragent:setArguments(Bundle bundle)
Fragment->Activity: a)通过对象直接传递(方法调用、接口调用)b)通过viewmodel/handler/broadcast/eventbus等通信

1.2 服务组件 Service

Service:后台任务

Service基本用法

1. 注册:在AndroidManifest中使用<service.../>标签
2. 创建:建立相应的Service实现类
3. 加载:startService()/bindService()

Service生命周期

onStart(),onBind(),onCreate(),onDestroy()

image.png

Service与Activity通信

1.定义Binder子类,实现getService()方法,返回Service对象
2.实现Service类onBind()方法,返回上述Binder对象
3.实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取Service实例
4.Activity中调用bindService(),传递3中ServiceConnection对象,将流程跑起来
5.Activity也可以通过调用Service实例中的方法直接通信

1.3 广播组件 Broadcast

网络,电池,等系统事件,由系统通知到应用程序。
分为静态广播和动态广播。

Broadcast基本用法

静态广播
1. 注册:在AndroidManifest中使用<receiver.../><intent-filter.../>标签
2. 创建:建立相应的BroadcastReceiver实现类
3. 接收:在步骤2onReceive()中接收广播
4. 发送:Context.sendBroadcast()

动态广播
注册:Context.registerReceiver()

常用系统广播,配合权限 实现

image.png

1.4 数据组件 ContentProvider

生产者,消费者模式

生产者
1.注册:AndroidManifest中使用<provider.../>
属性:authorities / exported / readPermission / writePermission
2.创建:建立相应的ContentProvider实现类
方法:onCreate / getType / insert / delete/ update / query

消费者
1.声明:AndroidManifest中声明权限
2.使用:context.getContentResolver()
方法:insert / delete / update / query

扫描系统现有图片 image.png

1.5 Intent

启动组件用的对象,意图组件
例子:Context.startActivity(Intent)
Context.startService(Intent)
Context.sendBroadcast(Intent)

image.png

Intent基本用法

image.png

Intent系统能力 电话,短信,网页,邮件,地图,拍照,设置,市场

image.png 使用:startActivity(intent)

通信组件

线程或进程之间通信的组件。

Handler

image.png 处理主线程之间通信。核心原理:消息队列。 主线程:sendMessage(Message) 接收线程:handleMessage(Message)

Binder

处理进程间通信。只需一次内存交换
服务端定义AIDL文件,实现接口,编写service,如果有实体类就提供jar包
客户端拿到AIDL文件,绑定service,获得接口持有对象
原理:匿名共享内存,Binder驱动

image.png

image.png