Android常用组件(第二节课)|青训营笔记

86 阅读5分钟

今天是我参加「第四届青训营」笔记创作活动的第4天。今天上了第二次课,课后对笔记进行整理发布。

认知方法:what、why、how

什么是程序

开发者视角:

  • what:代码+资源

  • why:改变世界

  • how:知识+经验

用户视角

  • what:界面、互动、记忆

  • why:工具、视频、游戏

  • how:应用商店、搜索引擎、官网下载、三方引流

基础组件

开发中常用的组件

界面组件

1.Activity

WHAT:界面容器

WHY:前台交互、程序入口、布局容器

HOW:

基本用法:

注册 -> 布局 -> 绑定

声明在程序清单,写明intent-filter。声明布局文件。与Activity进行绑定。

生命周期:

IMG_0667.jpeg

 onCreate():创建时回调,一般在此处创建视图和绑定数据
 onStart():已启动,即将进入前台
 onResume():与用户开始交互,位于Activity栈顶
 onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
 onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
 onRestart():重启已停止的Activity,下一个回调是onStart()
 onDestory():销毁Activity,释放该Activity的所有资源
 onSaveInstanceState():在非正常关闭是回调,用于保存数据,不支持持久化数据
 onRestoreInstanceState()/onCreate():用于恢复数据
 

配置改变场景:

 1.销毁:Resumed - onSaveInstanceState() - onPause() - onStop() - onDestory()
 2.重建:onCreate() - onStart() - onRestoreInstanceState() - onResume()
 

配置改变不重建Activity:AndroidManifest中配置Activity节点的configChange属性

 local:语言改变
 fontScale:字体大小改变
 orientation:旋转屏幕
 keybordHidden:键盘显示隐藏

配置改变(已配置):onConfigurationChanged()


Activity的启动模式(standard)

  standard:默认模式,允许重复
  singleTop:栈顶复用,不允许连续重复
  singleTask:栈内复用,不允许同个栈内同步
  singleInstance:全局复用,整个系统不允许重复,单独开辟一个栈,只有这个Activity

举例:

 需求-图片浏览器:

 1.实现一个图片浏览APP(Activity + Fragment),相册页面 + 大图页面 + 调用相机(Intent)

 2.旋转屏幕场景(Activity生命周期)

 3.内置升级能力(Service使用)

 4.单一首页(SingleTask)

 5.相关图片(SingleTop)

 6.扫描所有图片(ContentProvider)

 7.提供图片选择能力给系统(Intent)

思考:图库APP真的需要每个页面都是Activity吗?

2.Fragment

WHAT & WHY:解决碎片化问题,速度快,。

基本用法:

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

生命周期:

onAttach():Fragment和Activity建立关联时调用
onCreateView():当Fragment创建视图时调用
onActivityCreated():Activity的onCreate()方法已返回时调用
onDestoryView():当Fragment中的视图被移除时调用
onDetach():Fragment和Activity取消关联时调用

1.启动:onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume() - Resumed
2.退出:Resumed - onPause() - onStop() - onDestoryView() - onDestory() - onDetach()

3.部分遮挡:Resumed - onPause() - Paused
4.部分遮挡恢复:Paused - onResume() - Resumed

5.完全遮挡:Resumed - onPausel() - onStop() - onDestroyView()
6.完全遮挡恢复:onCreateView() - onActivityCreated() - onStart() - onResume() - Resumed

注:Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预(不常用)

与Activity交互:

  • 组件获取:

    1.Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx)
    2.Avtivity获取Fragment中的组件:getFragmentManager.findFragmentById(R.id.fragment_xxx)
    
  • 数据传递:

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

服务组件

Service

WHAT & WHY:服务组件

基本用法:

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

生命周期:

IMG_0671.jpeg

常用:
1.onStart()
2.onBind()
3.onCreate()
4.onDestory()

与Activity通信:

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

广播组件

Broadcast

静态广播:

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

动态广播:

注册: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

WHAT & WHY:数据通信

生产者:

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

消费者:

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

Intent

WHAT & WHY:描述需求,请求系统处理

1.Content.startActivity(Intent)
2.Content.startService(Intent)
3.Content.startBroadcast(Intent)

基本用法:

1.显式Intent
  setComponent/setClass指定具体类
2.隐式Intent
  Action(动作)
  Data(数据)
  Category(类别)
  Type(数据类型)
  Component(组件)
  Extra(扩展信息)
  Flag(标志位)

系统能力:

电话:Intent(ntent.ACTION_DIAL, Uri.parse ("tel:10010"))
短信:Intent(ntent.ACTION_SENDTO, Uri.parse ("smsto:10010"))
网页:Intent(lntent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))
邮件:Intent(Intent.ACTIoN_SENDTO, Uri.parse("'mailto:someone@domain.com”))
地圈:lritent(lntent.ACTION_VIEW, Uri.parse("geo:39.9,116.3"))
拍照:Intent(MediaStore.ACTION IMAGE_CAPTURE)
设置:Intent(android.provider.Settings.ACTION_SETTINGS)
市场:Intent(lntent.ACTiON_VIEW, Uri.parse("market:lldetails?id=" + packageName))

使用:startActivity(intent)

通信组件

用于进程通信等方面

Handler

WHAT & WHY:多线程与主线程间通信

基本用法:

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

核心原理:

IMG_0675.jpeg

Binder

WHAT & WHY:进程间通信

为什么不用共享内存?Linux的进程隔离:

IMG_0676.jpeg

常用IPC方案对比:

IMG_0679.jpeg

基本用法:

服务端
1.定义一个AIDL文件
2.实现描述的接口,编写service
3.如果有实体类,需要提供实体类(jar包形式)

客户端
1.拿到AIDL文件
2.绑定服务,获得接口对象

核心原理:

IMG_0680.jpeg

IMG_0681.jpeg

IMG_0682.jpeg