开始写这篇文章时,我也是啥也不懂,啥也不会,因此文章中一定会有许多不足甚至错误!欢迎大家批评指正!
另外,此文章参考了许多文档、教程等,都在引用出贴出了链接,但如果侵犯了作者著作权,请联系我,我会在第一时间删除。
四大组件
- 活动
Activity
- 服务
Service
- 广播接收器
BroadcastReceiver
- 内容提供程序
ContentProvider
Activity
Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。例如,电子邮件应用可能有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验,但每个 Activity 都独立于其他 Activity 而存在。因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用 允许)。例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。Activity 有助于完成系统和应用程序之间的以下重要交互:
- 追踪用户当前关心的内容(屏幕上显示的内容),以确保系统继续运行托管 Activity 的进程。
- 了解先前使用的进程包含用户可能返回的内容(已停止的 Activity),从而更优先保留这些进程。
- 帮助应用处理终止其进程的情况,以便用户可以返回已恢复其先前状态的 Activity。
- 提供一种途径,让应用实现彼此之间的用户流,并让系统协调这些用户流。(此处最经典的示例是共享。)
简介
也就是说,Activity
是一个单独显示出来的、在前台运行的页面。一个应用程序可以有1个或多个活动,而没有任何限制。每个为应用程序所定义的活动都需要在AndroidManifest.xml
中声明。例如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="host.skyone.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HelloWorld">
<activity
android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
应用的主要活动需要在清单中声明,且意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别。
为了更好的展现Activity
的生命周期,引用一张来自菜鸟教程的图片:
如图所示,在Activity
的生命周期中,有几个重要的回调函数:
回调 | 描述 |
---|---|
onCreate() | 在Activity 第一次创建时调用 |
onStart() | 在Activity 为用户可见时被调用 |
onResume() | 在应用程序与用户开始可交互的时候调用 |
onPause() | 在当前Activity 将要被暂停,其他Activity 将要被恢复时调用 |
onStop() | 当活动不在可见时调用 |
onDestroy() | 当活动被系统销毁之前调用 |
onRestart() | 当活动被停止以后重新打开时调用 |
例如,
用户打开你的应用程序,onCreate()
被调用,代表Activity
正式启动
然后界面渲染完成,并调用onStart()
函数
你的程序可以开始和用户交互之前,调用onResume()
函数
这时,用户进入了QQ查看消息,你的程序变被暂停,调用onPause()
函数,注意被暂停的活动无法接受用户输入,不能执行任何代码。
好,用户回复了几条信息,并返回你的程序,你的程序又即将可以和用户交互,在这之前,调用onResume()
函数
但是如果用户返回QQ并不是回复消息,而是看了个超高清视频呢?由于用户手机内存不足,而用户要求执行的程序优先级比较高,于是很抱歉,你的程序的被kill
当用户看完视频,返回你的程序,发现OH~NO,你的程序被kill了,只能从onCreate()
开始重新创建程序
当然,如果你的程序被挂起太长时间,比如用户打开哔哩哔哩刷了一个小时的视频,那么同样的,你的程序由于挂起时间过长,也被系统停止了,但和进程被kill不同,如果用户依然需要使用你的程序,那么只需要回到你的程序,而你的程序也只需要调用onRestart()
如果程序执行完了用户的任务,即将正常退出,则在退出之前,调用onDestroy()
来进行收尾工作