一、四大基础组件
* 界面组件:Activity & Fragment
* 服务组件:Service
* 广播组件:Broadcast
* 数据组件:ContentProvider & ContentResolver
- Activity
- what:界面的容器
- why:前台交互,程序入口,布局容器
- How:注册(程序清单中注册) -> 布局 -> 绑定
crash:程序挂掉了
Fragment:
是什么?
页面容器,与用户进行交互
为了解决什么问题:解决页面碎片化问题;
页面碎片化问题:由于Android设备屏幕尺寸的多样性,同一个App在不同尺寸的设备上显示会出现布局破碎的问题
为什么?
用Fragment的原因:
1)不同页面用 Fragment 承载达到速度快的效果
Activity 启动、调度,切换是要跟系统Service打交道,走Binder,步骤多,耗时
2)实现组件的分离:一个界面具有很多个组件,需要将组件进行分离
怎么用?与 Activity 类似
Fragment 生命周期
Service:服务
场景:播放音乐,界面退出后,仍需要继续播放音乐,即没有界面的任务就是 Service 组件,
如何使用:
1)注册:AndroidMainfest
中使用 <service../>
标签;目的是声明给系统,因为需要与系统进行交互;
2)创建:建立相应的 Service 实现类;
3)加载:startService()
/ bindService()
;两种启动模式的区别
bindService:场景:在音乐app中进行播放和操作,需要进行 Service 与 Activity 进行交互,需要与 Activity 进行绑定;
startService:场景:下载,启动后无需进行与其交互
生命周期:
onStart():服务启动;
onBind():与界面容器进行绑定;
onCreate():初始化;
onDestory():销毁;
Service 与 Activity 进行通信:
Activity 是与用户直接进行交互的容器,
在 Android 应用中的一个 Activity 中调用 bindService() 方法并传递 erviceConnection 对象时,是为了与一个后台运行的Service进行通信。这种通信方式常用于在应用的不同组件之间传递数据、执行操作或获取后台任务的结果。
步骤:
1)定义Binder子类,并实现getService()方法,返回Service对象;
2)实例化Service类onBind()方法,返回上述Binder对象;
3)实例化ServiceConnection对象,实现onServiceConnected() 方法,从中获取到 Service 实例;
4)Activity 调用 bindService 方法,并传递 ServiceConnection 对象,
5)在上一步拿到对象之后,就可以在 Activity 中进行调用了;既可以通过调用 Service 实例中的方法进行直接通信;通信即拿到对象就可以直接调用了;
Broadcast:广播
系统事件通知给 app
静态广播
动态广播
Intent :表达了一个意图,对系统来说,就是要告诉系统干什么事情(需求),
意图发给系统,系统处理;
意图,涉及到 Intent 的匹配,谁来处理 Intent,
- 显式 Intent:指定这个意图处理的类对象;
- 隐式 Intent
- Action(动作)
- Data(数据)
- Category(类别)
- Type(数据类型)
- Component(组件)
- Extra(扩展信息):启动页面后附加的一些数据
- Flag(标志位):指定启动的标志
二、通信组件
进程,线程
多进程,多线程
在 Android 中多进程与多线程是如何进行通信的
1、线程间通信
-
Handler
-
字面意思:处理者;
-
处理什么:处理线程间通信;有明确的场景就是处理主线程间通信
-
在 Android 中,对界面进行更新/改变界面属性一定是在主线程中进行操作的(在子线程进行界面操作会报异常,导致 app 崩溃),主线程资源比较宝贵,主线程需要响应用户的操作;
-
耗时任务要放到子线程中,子线程操作完更新界面通知主线程,通过 Handler 来通知主线程;
-
-
Handler 基本用法
-
创建:新建 Handler,实现 handleMessage(Message)
handleMessage()
:处理消息;Message
:消息;给主线程发送的一些事件/通知;包含线程间通信的描述和数据;
-
发送:在子线程中创建 Handle 类的实例,并通过它发送 Message 到主线程,子线程调用 sendMessage(Message) 发送Message;
-
在主线程中创建同一个Handler实例,绑定到主线程的Looper;
-
处理:当发送的 Message 到达主线程时,会回调 Handler 的handleMessage();
-
-
Handler 核心原理
- 消息队列;
- Looper:反复循环不停地处理队列中的 Message,每次从队头取出一个 Message,
2、进程间通信
- Binder
- 常用场景:APP 启动