2023年Android开发者路线-第1部分
2023年Android开发者路线-第2部分
2023年Android开发者路线-第3部分
2023年Android开发者路线-第4部分
2023Android开发者路线-第2部分
在上一篇文章中,我们讨论了 Android 架构的重要元素,包括主要的 Android 语言、操作系统、Android 平台和 App Manifest。
在第2部分中,我们将介绍 Android 路线图的接下来的三个部分:
- 应用组件
- 意图
- 应用入口点
应用组件
在 Android 开发中,应用程序组件就像允许系统和用户与您的应用程序交互的入口点。每个组件都有一个独特的功能和生命周期,决定了它是如何创建和销毁的。
让我们讨论每个组件:
Activity
Activity 是一个独立且可重用的组件,它通过提供与 UI 相关的资源与用户进行交互。所有 Android 应用程序必须至少有一个 Activity 才能进入应用程序并与用户交互。
Activity Lifecycle
所有活动都有自己的生命周期,这是管理活动和资源的重要概念。Activity类提供一组核心回调方法,用于告知活动生命周期状态已更改。
回调方法将按照下图中所示的生命周期顺序调用:
您可以声明活动的行为方式并使用生命周期回调方法有效地管理您的资源。在本节中,我们将讨论以下六个核心回调方法:
onCreate()
:当系统创建您的活动时调用此回调。大多数在 Activity 的生命周期中应该只发生一次的初始化逻辑应该放在此处(例如创建视图或绑定数据)。onStart()
:当活动对用户可见时调用方法后调用此回调。如果您在多个 Activity 或应用程序之间切换,这可能会发生不止一次。onResume()
:这意味着活动已准备好进入前台并与用户交互。onPause()
:这意味着活动不再在前台,并且可能仍然部分可见(例如,如果用户处于多窗口模式)。在大多数情况下,它表明用户正在离开活动,活动将进入下一个状态。onStop()
:当活动不再对用户可见时调用此回调。如果您在多个 Activity 或应用程序之间切换,这可能会发生不止一次。onDestroy()
:在销毁活动之前调用此回调。当活动结束或系统由于配置更改而暂时销毁活动时,系统将调用此回调。当您需要释放或关闭所有剩余资源并允许垃圾收集器收回所有分配的内存时,可以使用此回调。
垃圾回收:https://en.wikipedia.org/wiki/Garbage-first_collector
有关更多详细信息,请查看活动生命周期。
生命周期:https://developer.android.com/guide/components/activities/activity-lifecycle
创建Activity
要创建活动,您必须创建一个类作为Activity类的子类。在现代 Android 开发中,Jetpack库提供高级 Activity 类,例如AppCompatActivity、FragmentActivity和ComponentActivity,以支持与Themes、Fragments等的兼容性。您可以使用以下代码创建基本活动:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
要让您的应用使用 Activity,您必须在App Manifest中声明它们,如以下示例所示:
<manifest ... >
<application ... >
<activity android:name=".MainActivity" />
...
</application ... >
...
</manifest >
Service
服务是一个入口点,旨在为远程进程执行功能并在后台运行长时间运行的操作,例如音乐播放器或 Youtube 视频播放器。
Service生命周期
服务有自己专用的生命周期,并提供两种类型告诉系统如何启动和管理服务:
startService
:另一个组件可以通过调用startService()
来运行服务。该服务将在后台运行,另一个组件也可以通过调用stopService()
来停止该服务。bindService
:另一个组件或客户端可以通过调用bindService()
来运行服务。该bindService()
函数提供了一个IBinder接口,它允许客户端与服务进行一致的通信。该服务将在后台运行。另一个组件或客户端也可以通过调用unbindService
取消连接。
如下图所示,服务的生命周期取决于它的创建方式:
根据Android 文档,上图“将bindService()
创建的服务与startService()
创建的服务分开”,但无论服务如何启动,它们都可能允许客户端绑定到它们。
创建Service
要创建服务,您必须创建一个类作为Service类的子类,如下例所示:
class MyService : Service() {
private var binder: IBinder? = null
override fun onCreate() {
// The service is being created
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(
intent,
flags,
startId
) // indicates how to behave if the service is killed
}
override fun onBind(intent: Intent?): IBinder? {
// A client is binding to the service with bindService()
return binder
}
override fun onDestroy() {
// The service is no longer used and is being destroyed
}
}
接下来,为了让您的应用能够使用该服务,您必须在App Manifest中声明它:
<manifest ... >
<application ... >
<service android:name=".MyService" />
...
</application ... >
...
</manifest >
Android组件之Service:https://developer.android.com/reference/android/app/Service
BroadcastReceiver
Broadcast receiver 是一个可注册的侦听器,它侦听来自 Android 系统和其他 Android 应用程序的广播消息。根据Android 文档,广播用于跨应用程序和正常用户流之外发送消息,例如系统启动或设备开始充电时。
与活动和服务不同,广播接收器没有专门的生命周期。相反,它将监听所有分配的事件消息,直到取消注册。
创建BroadcastReceiver
要创建广播接收器,您必须创建一个类作为广播接收器类的子类,如下例所示:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// do something
}
}
接下来,为了让您的应用能够使用该服务,您必须在App Manifest中声明它:
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
ContentProvider
内容提供者管理如何访问您的应用程序的数据以及如何与其他应用程序共享数据。根据Android 文档,内容提供程序使您的应用程序能够共享任何类型的持久数据,无论是存储在文件系统、SQLite数据库、Jetpack Room还是网络上。
内容提供商通过要求特定权限来保护数据。如果请求应用程序没有所需的权限,则它无法查询内容提供者的数据。
ContentProvider: https://developer.android.com/reference/android/content/ContentProvider
Intent
Intent是对稍后将要执行的动作的抽象描述。例如,它允许您触发应用程序组件的入口点或向广播接收器发送消息。
Intent的用例
- 启动Activity:您可以通过将意图传递给
startActivity()
方法来启动新活动。意图定义活动的行为并提供应该在新活动中使用的必要数据。 - 启动Service:您可以通过将意图传递给
startService()
方法来运行新服务。意图定义服务的行为并提供应该在新服务中使用的必要数据。 - 将消息传递给BroadcastReceiver:您可以通过将意图传递给
sendBroadcast()
或sendOrderedBroadcast()
方法来将消息传递给广播接收器。您可以将意图作为广播消息从其他应用程序组件传递到您的应用程序或其他应用程序。
Intent类型
有两种类型的意图:
- 显式Intent:显式意图包括指定的信息,它们指向一个应用程序的包名或完全限定的组件类名。例如,您可以使用包含显式目标类或包信息的意图来启动Activity/Service或向Broadcast Receiver发送消息。
- 隐式Intent:隐式意图不包括指定的目标信息,而是声明要执行的一般操作。例如,如果您想在图库中向用户显示图像或在Web浏览器中打开URL,可以使用隐式意图请求Android系统执行操作。然后,Android系统会搜索所有安装的应用程序以查找意图过滤器,并将适当的组件与启动隐式意图进行比较。如果Android系统找到了一个适当的组件,它将显示可用的组件列表,但如果找不到,您无法执行隐式意图。
关于Intent的更多内容:https://developer.android.com/guide/components/intents-filters
App Entry Points
Android 中有两个基本的应用程序入口点——活动和应用程序快捷方式。
Activity的状态变化:https://developer.android.com/guide/components/activities/state-changes
任务栈及回退栈:https://developer.android.com/guide/components/activities/tasks-and-back-stack
parcelables及bundles:https://developer.android.com/guide/components/activities/parcelables-and-bundles
应用程序快捷方式
应用程序快捷方式允许您在应用程序中启动特定操作。您可以通过长按应用程序图标来显示快捷方式,也可以通过单击列表中的项目来启动任务,如下图所示:
快捷方式分为三种类型:
- 静态快捷方式:静态快捷方式提供指向应用内一致操作的链接并执行静态任务,这些任务不依赖于用户上下文。例如:显示最近的消息、撰写帖子或搜索关键字。
- 动态快捷方式:动态快捷方式提供指向特定操作的链接,这些操作基于应用内的用户上下文。例如:向特定人员发送消息或导航至特定位置。
- 固定快捷方式:固定快捷方式(Android 8.0 及更高版本支持)允许您将快捷方式固定到受支持的启动器上。您可以通过单击主屏幕上固定的快捷方式来运行特定任务。
我们讨论了三种类型的快捷方式。在下一节中,您将介绍如何创建静态快捷方式。
创建静态快捷方式
要创建静态快捷方式,首先创建一个新的资源文件res/xml/shortcuts.xml
:
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="message"
android:enabled="true"
android:icon="@drawable/ic_message"
android:shortcutShortLabel="@string/short_label"
android:shortcutLongLabel="@string/long_label"
android:shortcutDisabledMessage="@string/message_shortcut_disabled">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.ComposeActivity" />
<categories android:name="android.shortcut.conversation" />
<capability-binding android:key="actions.intent.CREATE_MESSAGE" />
</shortcut>
</shortcuts>
接下来,为了让您的应用能够显示快捷方式,您必须在应用清单中声明它,如下例所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.getstream.example">
<application ... >
<activity android:name="Main">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
</application>
</manifest>
结论
本节介绍了 App 组件、生命周期和 App 入口点的重要部分,以便您更好地了解 Android 组件及其生命周期的工作原理。