这是我参与「第四届青训营 」笔记创作活动的的第2天。
01 基础组件
1.1 界面组件
activity
activity是界面容器,分为前台交互、程序入口、布局容器三个阶段,在manifast文件里注册,在xml文件里布局,在mainactivity里绑定。
activity的生命周期分为:
- onCreate():创建时回调,一般在此处创建视图和绑定数据
- onStart():已启动,即将进入前台
- onResume():与用户开始交互,位于Activity栈顶
- onPause(): Actvity失去焦点或已暂停,Activity界面部分可见, 下一个生命周期是onResume()或onStop()
- onStop(): Activity不再可见, 下一个回调是onRestar()或onDestory()
- onRestart():重启已停止的Activity, 下一个回调是onStart()
- onDestory():销毁Actvity, 释放该Activity的所有资源
- onSavelnstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
- onRestorelnstanceState() / onCreate():用于恢复数据
例子:
- 打开页面时,onCreate(),onStart(),onResume()。关闭页面时,onPause(),onStop(),onDestroy()。
- 部分遮挡时,onPause()。遮挡恢复,onResume()。
- 页面全遮挡,onStop()。遮挡恢复,onRestart(),onStart(),onResume()。
fragment
activity切换是要走IPC的,用fragment速度更快,解决了碎片化的问题。
基本用法: 1、创建Fragment布局文件 2、创建Fragment子类,加载布局文件 3、Activity加载Fragment 3.1静态加载:布局中绑定 3.2动态加载: FragmentManager加载
生命周期:
- onAttach() Fragment和Activity建立关联时调用
- onCreateView()当Fragment创建视图时调用
- onActivityCreated() Activity的onCreate()方法已返回时调用
- onDestroyView()当Fragment中的视图被移除时调用
- onDetach() Fragment和Activity 取消关联时调用
1.2 服务组件service
用法: 1、注册: AndroidManifest中使用<servic...>标签 2、创建:建立相应的Service实现类 3、加载: startService()/bindService()
生命周期
1.3 广播组件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
intent
给系统说要做什么,一个activity通过intent可以onCreat()另一个activity。
基本用法: 1、显式Intent setComponent/setClass指定具体类 2、隐式Intent Action (动作) Data (数据) Category (类别) Type(数据类型) Component (组件) Extra (扩展信息) Flag (标志位)
02 通信组件
2.1 handler
原理:
用于处理主线程间的消息。
2.2 binder
用于处理进程间的消息。
Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和socket等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。
基本用法: 服务端 1.定义一个AIDL文件 2.实现描述的接口,编写service 3.如果有实体类,需要提供实体类(jar包形式) 客户端 1.拿到AIDL文件 2.绑定服务,获得接口持有对象