1. Activity
的启动模式(Launch Modes)
Android 提供了几种不同的启动模式,用于定义 Activity
的启动行为。这些模式通过 AndroidManifest.xml
文件中的 android:launchMode
属性或 Intent
标志进行配置。
1.1 标准模式(standard)
这是默认的启动模式。每次启动 Activity
都会创建一个新的实例,无论该 Activity
是否已经存在于栈中。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="standard">
</activity>
1.2 单顶模式(singleTop)
如果当前任务的栈顶已经有该 Activity
实例,则重用该实例,并调用其 onNewIntent
方法,否则创建新的实例。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleTop">
</activity>
使用 Intent
标志也可以实现相同效果:
java
代码解读
复制代码
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
1.3 单任务模式(singleTask)
在栈中只保留一个 Activity
实例。如果实例存在,则将其置于栈顶,并调用其 onNewIntent
方法,否则创建新的实例。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleTask">
</activity>
1.4 单实例模式(singleInstance)
创建一个单独的任务栈来管理该 Activity
,并且在该任务栈中只存在这一个 Activity
实例。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleInstance">
</activity>
2. 深入理解 Intent 和 Intent Filters
2.1 Intent
Intent
是 Android 中用于在不同组件(如 Activity
、Service
和 BroadcastReceiver
)之间传递数据和请求操作的消息对象。主要分为两种类型:
- 显式
Intent
:明确指定目标组件的Intent
。 - 隐式
Intent
:不指定目标组件,通过Intent Filter
进行匹配。
显式 Intent
示例:
java
代码解读
复制代码
Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);
隐式 Intent
示例:
java
代码解读
复制代码
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);
2.2 Intent Filter
Intent Filter
用于在 AndroidManifest.xml
中声明 Activity
、Service
或 BroadcastReceiver
能够响应的 Intent
类型。
xml
代码解读
复制代码
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.example.com"/>
</intent-filter>
</activity>
3. Activity 的进程和线程模型
3.1 进程
默认情况下,每个应用程序在独立的 Linux 进程中运行。应用程序中的所有组件(Activity
、Service
、BroadcastReceiver
和 ContentProvider
)都在同一个进程中运行。
可以在 AndroidManifest.xml
中通过 android:process
属性为某些组件指定不同的进程:
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:process=":remote"/>
3.2 线程
Android 的主线程(也称为 UI 线程)用于处理 UI 更新和用户交互。因此,不能在主线程中执行耗时的操作,以避免阻塞 UI 响应。可以使用 AsyncTask
、HandlerThread
或 Executor
框架在后台线程中执行耗时操作。
使用 AsyncTask
进行后台操作:
java
代码解读
复制代码
private class DownloadTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
// Perform background task
}
protected void onProgressUpdate(Integer... progress) {
// Update UI progress
}
protected void onPostExecute(Long result) {
// Update UI with result
}
}
4. Activity 与 Service 的交互
Service
是在后台运行的组件,用于执行长时间运行的操作。Activity
可以通过 startService
和 bindService
与 Service
交互。
4.1 启动服务
startService
用于启动服务:
java
代码解读
复制代码
Intent intent = new Intent(this, MyService.class);
startService(intent);
4.2 绑定服务
bindService
用于绑定服务,并获取 IBinder
以进行通信:
java
代码解读
复制代码
Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
ServiceConnection
用于管理 Service
的连接和断开:
java
代码解读
复制代码
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.LocalBinder binder = (MyService.LocalBinder) service;
myService = binder.getService();
isBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBound = false;
}
};
总结
Android Activity
的设计涉及多个方面,包括生命周期管理、启动模式、视图管理、进程和线程模型、以及与其他组件(如 Fragment
和 Service
)的交互。理解 Activity
的设计原理和内部实现,有助于开发者构建高效、稳定和响应迅速的应用程序。通过深入分析和理解这些关键概念,开发者可以在实际项目中灵活应用这些知识,提升应用程序的用户体验和性能。
作者:我说HelloWorld
链接:https://juejin.cn/post/7382511904684523546
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。