文章目录
Activity
1.简介
- 在android 中,Activity 相当于一个页面。
- 可以在Activity中添加Button、CheckBox 等控件,一个android 程序有多个Activity组成。
- Activity之间通过Intent进行通信。
2.四种基本状态
-
运行(Running):当应用正在前台运行,用户可以与之交互时,应用处于运行状态。
-
暂停(Paused)
- 当应用被其他应用临时覆盖,但仍然在后台运行,保留其状态时,应用处于暂停状态。
- 在这种情况下,应用的部分或全部界面不可见。
- 仍然可见,但已经失去了焦点故不可与用户进行交互,在系统内存极端低下的时候会被强行终止掉。
-
停止(Stoped)
- 当应用完全被其他应用覆盖,并且没有活动线程运行时,应用处于停止状态。
- 但是,应用的数据仍然保存在内存中,以备下次启动时恢复。
- 当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
-
终止(Terminated)
- 当系统内存不足,需要清理一些不常用的应用以释放内存时,应用会被终止。
- 在这种情况下,应用的所有状态都将被清除,直到用户下次重新启动应用。
3.状态转换
A:被Dialog或透明Activity覆盖。 B:覆盖的Activity返回。
C:被重新激活。 D:被另一个Activity覆盖,变不可见。
E:发生异常或其他情况。 F:Activity实例重新启动。
H:系统内存严重不足,被回收。 G:内存严重不足,被回收。
- 可以手动启动一个Activity但不可以手动结束一个Activity。
- 当调用Activty.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”。
4.四种启动模式
-
Standard 模式
-
是android 的默认启动模式,在这种模式下,activity可以有多个实例。
-
每次创建新实例的时候,新实例便会堆放到任务栈顶。
-
当返回时,便会从栈顶按顺序将实例移除栈,直至栈为空则退回到桌面。
-
-
SingleTop 模式
-
栈顶模式,当一个singleTop模式的activity 已经位于栈顶时,再去启动它时,不在创建实例,如果不在栈顶,就会创建实例。
-
当点返回键的时候,便会从栈顶按顺序将实例移除栈,直至栈为空则退回到桌面。
-
-
SingleTask 模式
-
单任务模式,如果启动的activity 已经存在于 任务栈中,则会将activity移动到栈顶,并将上面的activity出栈,否则创建新的实例。
-
如果此时实例在栈顶,此时再创建一个新的并不会成功。
-
当点返回键的时候,便会从栈顶按顺序将实例移除栈,直至栈为空则退回到桌面。
-
-
SingleInstance 模式
-
单实例模式,一个activity 一个栈。
-
5.生命周期
-
启动阶段:
- onCreate():Activity创建时调用,在这里进行初始化操作,如设置布局、初始化数据等。
- onStart():Activity即将可见时调用,此时Activity已经在任务栈中。
- onResume():Activity成为焦点并可见时调用,此时可以与用户进行交互。
-
运行阶段:在这个阶段,Activity处于用户可见和交 互状态,可以进行各种操作。
-
暂停阶段:
- onPause():当一个新的Activity启动,导致当前Activity即将不可见时调用。可以在此保存需要暂停状态时的数据。
-
停止阶段:
- onStop():当Activity完全不可见时调用,可以保存一些需要持久化的数据。
- onRestart():在Activity从停止状态再次启动时调用。
-
销毁阶段:onDestroy():Activity即将被销毁时调用,可以在这里进行一些清理工作,如释放资源、执行一些结束操作。
Service
1.简介
- 是应用程序中的一种后台组件,可以在没有用户界面的情况下执行长时间运行的任务。
- 主要是用于执行后台任务,如播放音乐、在后台线程中进行数据同步等。
2.启动方式
- Started Service —— 直接启动
- 被开启的service通过其他组件调用startService()被创建。
- 这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。
- 当service被停止时,系统会销毁它。
- Bounded Service —— 绑定启动
- 通过调用Context的bindService()方法来启动Service。
- 这种方式启动的Service会被绑定到一个客户端(通常是Activity或其他Service),客户端可以通过IBinder接口与Service进行通信。
- 当客户端解绑时,Service也会停止。
3.生命周期
-
onCreate()
- 首次创建服务时,系统将调用此方法来执行一次性设置程序。
- 如果服务已在运行,则不会调用此方法。
-
onStartCommand()
- 当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。
- 一旦执行此方法,服务即会启动并可在后台无限期运行,通过调用 stopSelf() 或 stopService() 来停止服务。
-
onBind()
- 当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。
- 通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。
-
onDestory
- 当服务不再使用且将被销毁时,系统将调用此方法。
- 服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。
BroadcastReceiver
1.简介
- 用于接收系统发出的广播消息。
- 当设备上发生某些特定事件时,如电话状态改变、电池电量低、短信到达等,系统会发送一个广播。
- 应用程序可以注册一个 BroadcastReceiver 来监听这些广播,并在接收到广播时执行相应的操作。
- Android 广播分为两个角色:广播发送者、广播接收者。
2.主要特点
- 被动接收:BroadcastReceiver 是在广播发送时被动接收的,它不会主动查询或请求信息。
- 无状态:BroadcastReceiver 本身没有用户界面,它只是接收广播消息并执行相应的逻辑。
- 权限控制:应用程序必须声明接收器的权限,以便能够接收特定的广播。
- 生命周期短暂:BroadcastReceiver 在接收到广播后通常会立即执行操作,执行完毕后就会销毁。
3.实现原理
- 使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。
- 模型中存在三个角色:消息订阅者(广播接收者),消息发布者(广播发布者)、消息中心(AMS)。
- 广播接收者通过 Binder机制在AMS注册。
- 广播发送者通过 Binder 机制向AMS发送广播。
- AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者。
- AMS将广播发送到合适的广播接收者相应的消息循环队列中,广播接收者通过消息循环拿到此广播,并回调 onReceive()。
4.注册方式
-
静态注册
- 在AndroidManifest.xml文件中声明BroadcastReceiver。
- 这种方式不需要在代码中进行注册和解注册,而是在应用程序安装时由系统自动完成注册。
- 静态注册的BroadcastReceiver会在应用程序启动时自动加载到系统中,并且可以在应用程序未运行时接收广播。
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.xxx"/> </intent-filter> </receiver>
-
动态注册
- 动态注册是在代码中(通常是Activity或Service中)注册BroadcastReceiver。
- 这种方式需要在适当的时候手动调用registerReceiver()方法来注册,以及调用unregisterReceiver()方法来解注册。
- 动态注册的BroadcastReceiver只有在注册时才存在于系统中,当Activity或Service被销毁时,它也会自动解注册。
// 在Activity中动态注册BroadcastReceiver IntentFilter filter = new IntentFilter(); filter.addAction("com.example.xxx"); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter); // 当不需要接收器时解注册 unregisterReceiver(receiver);
-
注意:动态广播最好在Activity的onResume()注册、onPause()注销。
5.生命周期
- 广播的生命周期从调用开始到onReceiver执行完毕结束。
- 一般广播的生命周期都极短,需要在10s内处理完onReceiver中的所有工作,所以,一般不进行耗时长的工作。
- 如果有耗时长的工作,应当通过Intent传递给Service进行处理。
Content Provider
1.简介
- 用于允许应用程序之间共享数据(跨进程通信)。
- 作为应用程序之间唯一的共享数据的途径,Content Provider为存储和读取数据提供了统一的接口。
- Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。
2.数据共享方式
- 创建自己的Content Provider(即继承ContentProvider的子类)
- 将自己的数据添加到已有的Content Provider中去。
3.关键特点
- 封装数据:它将数据封装起来,只暴露一个接口给其他应用访问。
- 跨应用共享:允许不同应用之间的数据共享,而无需了解对方的数据存储方式。
- 数据安全:通过权限机制,控制其他应用对数据的访问权限。
据的接口。
2.数据共享方式
- 创建自己的Content Provider(即继承ContentProvider的子类)
- 将自己的数据添加到已有的Content Provider中去。
3.关键特点
- 封装数据:它将数据封装起来,只暴露一个接口给其他应用访问。
- 跨应用共享:允许不同应用之间的数据共享,而无需了解对方的数据存储方式。
- 数据安全:通过权限机制,控制其他应用对数据的访问权限。
- 易于扩展:可以通过简单的接口实现数据的增、删、改、查操作。