客户端基础知识(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
-
由于Android系统在不同屏幕大小的设备上都能使用,造成碎片化的页面,因此Android提供了一个解决方案—Fragment
-
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通信
-
定义Binder子类,并实现getService()方法,返回Service对象
-
实现Service类onBind()方法,返回上述Binder对象
-
实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
-
Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
-
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.绑定服务,获得接口持有对象
核心原理: