客户端基础知识(Android常用组件) | 青训营笔记

229 阅读4分钟

客户端基础知识(Android常用组件)

这是我参与「第四届青训营 」笔记创作活动的的第2天

概要

  • Android基础组件(Activity、Fragment、Service、Broadcast、ContentProvider、Intent)
  • Android通信组件(Handler、Binder)

基础组件

界面组件(Activity&Fragment)

Activity

Activity就是一个界面容器,用来实现与用户的前台交互,同时它也是程序的入口,以及布局的容器。

基本使用:

  • 在App清单文件中申明
  • 在layout中创建对应的布局文件
  • 在Activity实现类中绑定

Activity生命周期

  • onCreate():创建时回调,一般在此处创建视图和绑定数据

  • onStart():已启动,即将进入前台

  • onResume():与用户开始交互,位于Activity栈顶

  • onPause():Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()

  • onStop():Activity不再可见,下一个回调是onRestart()onDestory()

  • onRestart():重启已停止的Activity,下一个回调是onStart()

  • onDestory():销毁Actvity,释放该Activity的所有资源

  • onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据

  • onRestoreInstanceState()/onCreate():用于恢复数据

Activity启动模式

standard:默认模式,允许重复

singleTop:栈顶复用,不允许连续重复

singleTask:栈内复用,不允许同个栈内重复

singleInstance:整个系统不允许重复

Fragment

  1. 由于Android系统在不同屏幕大小的设备上都能使用,造成碎片化的页面,因此Android提供了一个解决方案—Fragment

  2. Fragment速度比Activity快

基本使用:

  • 创建Fragment布局文件
  • 创建Fragment子类,加载布局文件
  • Activity加载Fragment(静态加载:布局中绑定;动态加载:Activity中绑定)

Fragment生命周期

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

Fragment与Activity交互

组件获取:getActivity() / FragmentManager.findFragmentById()

数据传递:setArguments() / 方法调用 / 异步方式(boardcast...)

服务组件(Service)

Service

在后台要运行一些逻辑时使用(比如在后台继续播放音乐等)

基本用法:

  • 注册:AndroidManifest中使用<service.../>标签
  • 创建:创建相应实现类
  • 加载:startService() / bindService()

Service生命周期

  • onStart: 服务即将启动
  • onBind:与Activity绑定
  • onCreate:初始化
  • onDestory:即将销毁

Service与Activty通信

  1. 定义Binder子类,并实现getService()方法,返回Service对象

  2. 实现Service类onBind()方法,返回上述Binder对象

  3. 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例

  4. Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来

  5. Activity既可以通过调用Service实例中的方法进行直接通信

广播组件(Broadcast)

Broadcast

当系统有些要全局通告的事件时(比如开关机、网络变化、电量变化等),会发送对应的广播

基本用法:

  • 静态广播
    • 1 注册:AndroidManifest中使用<receiver.../><intent-filter.../>
    • 2 创建:建立相应的BroadcastReceiver实现类
    • 3 接收:在步骤2类onReceive()中接收广播
    • 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&Intent)

ContentProvider

提供数据通信功能,一般是拿系统的数据(比如电话、联系人、相册等)

基本用法:

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

Intent

表达意图(比如调用系统打电话的服务等)

  • Context.startActivity(Intent)
  • Context.startService(Intent)
  • Context.sendBroadcast(Intent)

基本用法:

  • 显式Intent
    • setComponent/setClass指定具体类
  • 隐式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("https://www.baidu.com"))

邮件:Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:someone@domain.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))

使用方法:startActivity(intent)

通信组件

Handler

耗时的操作需要放在子线程,放在主线程会造成界面无响应(5s就会弹无响应对话框),通过Handler进行线程间通信

基本用法:

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

核心原理:本质上就是一个消息队列

Binder

Binder用于进程间通信,由于Linux的进程隔离,不同的进程之间不能共享内存,只能通过系统调用进入内核空间进行通信

基本用法:

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

核心原理: