目录
一、Activity
Activity主要负责与用户进行交互,并向用户呈现应用状态。可以简单理解:一个界面就是一个Activity。
- 生命周期
Android 应用的多个 Activity 组成 Activity 栈,当前活动的Activity位于栈顶。当用户浏览、退出和返回应用时,应用中的实例会在其生命周期的不同状态间转换。
为了在 Activity 生命周期的各个阶段之间导航转换, Activity 类以下回调集:
- onCreate():系统首次创建 Activity 时触发。执行基本的应用启动逻辑, 在 Activity 的整个生命周期内仅发生一次。
- onStart():显示界面,此时还不可以进行用户的交互
- onResume():可以与用户进行交互
- onPause(): Activity 不再位于前台,在用户处于多窗口模式时仍然可见,在内存不够时会被 kill 掉
- onStop():Activity 不再对用户可见
- onDestroy():在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
- onRestart():activity从停止状态重新启动时调用,其后调用onResume( )
下图显示了Activity的生命周期以及相关回调方法:

图片 1 Activity生命周期
- 简单使用
1. Activity 的启动和关闭
// 启动
startActivity(Intent i) // 启动其他Activity
startActivityForResult(Intent i, int requestCode) // 以指定的请求码启动其他Activity,且程序会获取新Activity返回结果
// 关闭
finish() // 结束当前Activity
finishActivity(int requestCode) // 结束以startActivityForResult方法启动的Activity
// 举个例子:
// 点击MainActivity中的btn按钮,从当前MainActivity跳转到SecondActivity
btn.setOnClickListener(view -> {
Intent i = new Intent(MainActivity.this, SecondActivity.class);
startActivity(i);
});
2. Activity 之间的数据传递
// 采用 bundle 作为 Intent 的数据携带包传递数据
// Intent 方法
putExtra(Bundle data)
Bundle getExtra()
putExtra(String name, XxxValue)
getXxxEstra(String name)
// Bundle 方法
putXxx(String key, Xxx value)
getXxx(String key)
二、Service
Service一直在后台运行,没有用户界面,可用于执行长期运行的操作。
- 启动/关闭
1. 启动式:通过startService()启动,会一直运行,直到任务完成或调用stopService()。
startService(Intent service)
stopService(Intent service)
2. 绑定式:通过bindService()启动,允许多个组件(比如Activity)绑定到同一个Service。当所有组件解绑后,Service会被销毁。
bindService(Intent service, ServiceConnection conn, int flags)
unbindService(Intent service)
- 生命周期
已启动的服务当其他组件调用 startService() 时,系统会创建该服务。然后,该服务会无限期运行,并且必须通过调用 stopSelf() 自行停止。其他组件也可以通过调用 stopService() 来停止服务。服务停止后,系统会将其销毁。
绑定服务当其他组件(客户端)调用 bindService() 时,系统会创建该服务。然后,客户端通过IBinder接口与服务进行通信。客户端可以通过调用 unbindService() 来关闭连接。多个客户端可以绑定到同一服务,当所有客户端解除绑定时,系统会销毁该服务。服务无需自行停止。

图片 2 Service生命周期。左侧显示了使用 startService() 创建服务时的生命周期,右侧显示了使用 bindService() 创建服务时的生命周期。
三、BroadcastReceiver
BroadcastReceiver本质上是一个全局监听器,用于监听系统或者应用发出的全局广播消息,可以实现系统中不同组件之间的通信。
- 工作流程
(1)注册广播接收器
静态注册:由PackageManagerService解析AndroidManifest.xml并注册。
动态注册:通过Context.registerReceiver()注册到ActivityManagerService。
(2)发送广播
通过Context.sendBroadcast()发送广播,ActivityManagerService负责分发。
(3)分发广播
BroadcastQueue从队列中取出广播,并调用广播接收器的onReceive()方法处理。
(4)处理广播
广播接收器的onReceive()方法运行在主线程中,不能执行耗时操作。
- 广播分类
(1)Normal Broadcast 普通广播:完全异步,可以在同一时刻被所有接收者接受,消息传递效率高;
(2)Ordered Broadcast 有序广播:接收者根据预先声明的优先级依次接收(优先级声明在<intent-filter.../>元素的android:priority属性中,数值越大优先级越高),接收者可以终止Broadcast Intent的传播,也可以将数据传给下一个接收者。
四、ContentProvider
ContentProvider是不同应用程序之间进行数据交换的标准API,以某种Uri的形式对外提供数据,允许其他应用访问或修改数据,其他应用使用ContentResolver根据Uri去访问操作指定数据。
Uri
content://org.crazy.providers.dictprovider/words
content:// 默认协议
org.crazy.providers.dictprovider 指定provider
word 资源
Uri 是 ContentProvider 和 ContentResolver 进行数据交换的标识,三者关系如下图所示。

图片 3 ContentProvider、 ContentResolver 和 Uri 之间的关系
参考文档:
273






