常用组件|青训营笔记

200 阅读6分钟

这是我参与[第四届青训营]笔记创作的第 10 天

基础组件

Android四大组件:
Activity(用于表现功能)
Service(后台运行服务,不提供界面呈现)
BroadcastReceiver(接收广播)
ContentProvider(存储和读取数据)
常用UI组件:
文本组件,图片组件,按钮组件,输入框组件,复选框组件
高级UI组件:
滑动组件,列表组件,下拉刷新组件

界面组件(Activity & Fragment)

Activity

Activity是界面容器;用于前台交互,程序入口,布局容器;,走IPC(?)与系统的Service打交道(?),进行统一的调度。

Activity生命周期

onCreate()
onStart()
onPause()
onStop()
onRestart()
onDestory()
onSaveinstanceState()

配置改变场景 1.销毁:Resumed-onSavelnstanceState()-onPause()-onStop()-onDestroy() 2.重建:onCteate()-onStart()-onRestorelnstanceState()-onResume() 配置改变不重建Activity:AndroidManifest配置Activity节点的configChange属性 local:语言改变 fontScale:字体大小改变 orientation:旋转屏幕 keybordHidden:键盘显示隐藏 配置改变:onConfigurationChanged() 结束时有时候会走不到onDestroy(),不兼容安卓4.0用onStop(),兼容用onPause()。onRestorelnstanceState()进行数据恢复,onSavelnstanceState()中写入需要保存的数据。 Fragment里被回收A or F,被重建有自己的指令,不会走设计的,就会出现空指针。可以通过添加判空逻辑来避免或者在页面回收生命周期中存储数据,页面重建时进行恢复,onSavelnstanceState(),onRestorelnstanceState()。

启动退出场景:启动: onCreate()-- onStart()--onResume() 退出:onPause()--onStop()--onDestory()
部分遮挡:遮挡: onPause() 恢复:onResume()
完全遮挡:遮挡: onPause()--onSavelnstanceState()-- onStop() 恢复:onStart()--onResume()
配置变更:未配置:销毁:onSavelnstanceState()--onPause()--onStop()--onDestory() 重建:onCreate()-- onStart()--onSavelnstanceState()--onResume() 已配置:onConfigurationChanged()
后台回收:销毁:不会有时机处理 重建:onCreate()-- onStart()--onRestorelnstanceState()--onResume()

Activity的启动模式

standard:默认模式,允许重复
singleTop:不允许连续的重复
singleTask:不允许同个栈内重复
singleInstance:整个系统内不允许重复(银行登录界面,通讯录)
首页的launchmode改为singleTask,可以解决多个首页的问题。

Fragment

Fragment是界面容器,也可以和用户进行交互,用于解决碎片化,不同的页面用它承载可以达到速度快,进行组件或界面的分离。

Fragment用法

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

Fragment生命周期

onAttach()Fragment和Activity建立关联是是用
onCreateView()(完成界面数据绑定)当Fragment创建视图时使用
onActivityCreated() (只有静态的时候才使用)Activity的onCreate()方法已返回时使用
onDestoryView()(里可以做些资源回收,打点)当Fragment中的试图被移除时调用
onDetach()Fragment和Activity取消关联时调用
在onAttach()之后取到的Activity才不会为空,会有空指针的问题。

启动:onAttach()--onCreate()--onCreateView()--onActivityCreated()--onStart()--onResume()--Resumed
退出:Resumed()--onPause()--onStop()--onDestoryView()--onDestory()--onDetach()
部分覆盖:Resumed--onPause()--Paused
部分覆盖恢复:Paused--onPause()--onStop()--onDestoryView()
完全覆盖:Resumed--onPause()--onStop()--onDestoryView()
完全覆盖恢复:onCreateView()--onActivityCreated()--onStart()--onResume()--Resumed
Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预。

Fragment与Activity交互

setArguments():启动的时候常用,给Fragment传初始化的数据。 数据传递中直接传递是用getActivity()实现一个接口,通过接口调用方式传递,也可以拿到getActivity()直接调用该方法

组件获取

1,Fragment获取Activity中的组件:getActivity().findViewByld(R.id.xxx)
2,Activity获取Fragment中的组件:getFragmentManager.findFragmentByld(R.id.fragment_xxx)

数据传递

1,Activity传数据给Fragment:setArgumentss(Bundle bundle)
2,Fragment传递数据给Activity:
a 通过对象直接传递(方法调用/接口调用)
b 通过viewmodel/handler/broadcast/eventbus等通信

服务组件(Service)

Service基本用法

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

Service生命周期

onStart()服务要启动了
onBind()和界面容器进行绑定
onCreate()进行初始化
onDestory()要被销毁

Service和Activity通信

1,定义Binder子类,并实现getService()方法,返回Service对象
2,实现Service类onBind()方法,返回Binder对象
3,实例化ServiceConnection对象,实现onServiceConnected()方法
4(*),Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
5,Activity既可以通过调用Service实例中的方法进行直接通信
可以倒着看,Activity拿到Service对象,Activity中bindService传 ServiceConnection对象

广播组件(Brodcast)

Brodcast基本用法

静态广播

1注册:AndroidManifest中使用<receiver.../><intent-filter.../>(系统会主动唤醒)
2 创建:建立相应的BroadcastReceiver实现类
3 接收:在步骤2类onReceive()中接收广播
4 发送:Context.sendBroadcast()
receive 接收广播

动态广播

注册:Context.registerReceiver()

有生命周期的限制

常用系统广播(要有权限)

Intent.ACTION_CONNECTIVITY_CHANGE 网络发生变化
Intent.ACTION_BATTERY_CHANGED电量发生变化
Intent.ACTION_SCREEN_ON开屏
Intent.ACTION_SCREEN_OFF关屏
Intent.ACTION_PACKAGE_INSTALL安装应用程序
Intent.ACTION_BOOT_COMPLETED启动完成
Intent.ACTION_PACKAGE_ADDED安装程序
Intent.ACTION_PACKAGE_REPLACED程序更新
Intent.ACTION_PACKAGE_REMOVED卸载程序

数据组件(ContentProvider & ContentResolver)

ContentProvider 做数据通信

基本用法

生产者消费者模式

生产者
1,注册:AndroidManifest中使用<provider.../>
属性:authorities/exported/readPermission/writePermission
2, 创建:建立相应的ContentProvider实现类
方法:onCreate/getType/insert/delete/update/query
消费者
1,声明:AndroidManifesst中声明权限
2,使用:context.getContentResolver()
方法:insert/delete/update/query

意图组件

Intent

是意图,数据的获取;控件的启动要通过intent对象,intent是对系统要做什么事。
Context.startActivity(intent)
Context.startService(intent)
Context.startBroadcas(intent)

Intent基本用法

1,显式intent
setComponent/setClass 指定具体类
2,隐式intent
Action(动作)//系统会匹配,进行筛选
Data(数据)//系统会匹配,进行筛选
Category(类别)//系统会匹配,进行筛选
Type(数据类型)//系统会匹配,进行筛选
Component(组件)//系统会匹配,进行筛选
Extra(拓展信息)//启动页面时附加的数据
Flag(标志位)//启动的标志

Intent系统能力

电话:Intent(Intent.ACTION_DIAL,Uri.parse("tel:10010"))
短信:Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:10010"))
网页:Intent(Intent.ACTION_VIEW,Uri.parse("www.baidu.com"))\ 邮件:Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:s@123.com"))
地图:Intent(Intent.ACTION_VIEW,Uri.parse("geo:39.9,116.3"))
拍照:Intent(MediaStore.ACTION_IMAGE_CAPTURE)
设置:Intent(android.provider.Settings.ACTION_SETTINGS)
市场:Intent(Intent.ACTION_VIEW,Uri.parse("market://details?id="+packageName))
geo经纬度
通过startActivity(intent)来实现。

通信组件

Handler(多线程)

处理主线程之间的通信。对界面进行更新,改变属性要在主线程中操作。主线程要响应用户操作。

基本用法

1,创建,handleMessage(处理消息)新建Handler,实现handleMessage(Message)
2,构建Message:what/setData()
3,发送:子线程调用Handler.sendMessage(Message)发送Message
4,处理:在Handler的handlerMessage(Message msg)主线程更新UI\

Binder(进程间)

进程绑定,日常开发过程中的绑定,系统各个服务之间的通信也要通过binder。 没有共享内存,可以在内核中

Binder基本用法

服务端
1,定义一个AIDL文件
2,实现描述的接口,编写service
3,如果的实体类,需要提供实体类(jar包形式)
客户端
1,拿到AIDL文件
2,绑定服务,获得接口持有对象\

Binder核心原理

通过Binder驱动来的。
问题: 安卓里跨进程的交互基本都用Binder,这里AMS和Zygote为什么通过Socket通信? 答:1,先后时序问题,2,多线程问题,3,效率问题,4,安全问题,5,Binder拷贝问题 基础组件是开发中经常用的组件,通信组件是用来做进程通信,线程通信的。