这是我参与「第四届青训营 」笔记创作活动的第1天。今天的笔记内容包括课程第一节-Android系统及客户端概览和第二节-客户端基础知识必备。
Android客户端概览
两句鸡汤:
- 在某个领域达到前20%,那么职业生涯会延长;在某两个领域达到前20%,那么职业的天花板会很高。
- 人们为了逃避真正的思考,是可以做任何事情的。因此向上的任何一步都会很艰难,不要怕艰难。
这个图片可以说展示了工程师的进阶之路
git的使用
本地设置
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)
Activity的基本用法
- 注册,布局,绑定
- 声明在程序清单:AndroidManifest.xml里面的标签中写入activity的类名等信息
- 布局:activity_main.xml文件中定义布局方式
- 绑定:写该Activity类的具体内容,继承Activity并实现onCreate方法
GridView + Adaptor:相册列表页以及相册图片页
Viewpager(可以左右滑动) + Adaptor:大图浏览
Activity生命周期
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的生命周期
注: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()
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. 接收:在步骤2类onReceive()中接收广播
4. 发送:Context.sendBroadcast()
动态广播
注册:Context.registerReceiver()
常用系统广播,配合权限 实现
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
扫描系统现有图片
1.5 Intent
启动组件用的对象,意图组件
例子:Context.startActivity(Intent)
Context.startService(Intent)
Context.sendBroadcast(Intent)
Intent基本用法
Intent系统能力 电话,短信,网页,邮件,地图,拍照,设置,市场
使用:startActivity(intent)
通信组件
线程或进程之间通信的组件。
Handler
处理主线程之间通信。核心原理:消息队列。
主线程:sendMessage(Message)
接收线程:handleMessage(Message)
Binder
处理进程间通信。只需一次内存交换
服务端定义AIDL文件,实现接口,编写service,如果有实体类就提供jar包
客户端拿到AIDL文件,绑定service,获得接口持有对象
原理:匿名共享内存,Binder驱动