深入分析 Android Activity (二)

文章目录

      • [深入分析 Android Activity (二)](#深入分析 Android Activity (二))
      • [1. `Activity` 的启动模式(Launch Modes)](#1. Activity 的启动模式(Launch Modes))
        • [1.1 标准模式(standard)](#1.1 标准模式(standard))
        • [1.2 单顶模式(singleTop)](#1.2 单顶模式(singleTop))
        • [1.3 单任务模式(singleTask)](#1.3 单任务模式(singleTask))
        • [1.4 单实例模式(singleInstance)](#1.4 单实例模式(singleInstance))
      • [2. 深入理解 Intent 和 Intent Filters](#2. 深入理解 Intent 和 Intent Filters)
        • [2.1 Intent](#2.1 Intent)
        • [2.2 Intent Filter](#2.2 Intent Filter)
      • [3. Activity 的进程和线程模型](#3. Activity 的进程和线程模型)
        • [3.1 进程](#3.1 进程)
        • [3.2 线程](#3.2 线程)
      • [4. Activity 与 Service 的交互](#4. Activity 与 Service 的交互)
        • [4.1 启动服务](#4.1 启动服务)
        • [4.2 绑定服务](#4.2 绑定服务)
      • 总结

深入分析 Android Activity (二)

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 中用于在不同组件(如 ActivityServiceBroadcastReceiver)之间传递数据和请求操作的消息对象。主要分为两种类型:

  • 显式 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 中声明 ActivityServiceBroadcastReceiver 能够响应的 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 进程中运行。应用程序中的所有组件(ActivityServiceBroadcastReceiverContentProvider)都在同一个进程中运行。

可以在 AndroidManifest.xml 中通过 android:process 属性为某些组件指定不同的进程:

xml 复制代码
<activity android:name=".MyActivity"
    android:process=":remote"/>
3.2 线程

Android 的主线程(也称为 UI 线程)用于处理 UI 更新和用户交互。因此,不能在主线程中执行耗时的操作,以避免阻塞 UI 响应。可以使用 AsyncTaskHandlerThreadExecutor 框架在后台线程中执行耗时操作。

使用 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 可以通过 startServicebindServiceService 交互。

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 的设计涉及多个方面,包括生命周期管理、启动模式、视图管理、进程和线程模型、以及与其他组件(如 FragmentService)的交互。理解 Activity 的设计原理和内部实现,有助于开发者构建高效、稳定和响应迅速的应用程序。通过深入分析和理解这些关键概念,开发者可以在实际项目中灵活应用这些知识,提升应用程序的用户体验和性能。

|----------------------------------|
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关推荐
小趴菜82274 小时前
安卓接入Kwai广告源
android·kotlin
2501_916013744 小时前
iOS 混淆与 App Store 审核兼容性 避免被拒的策略与实战流程(iOS 混淆、ipa 加固、上架合规)
android·ios·小程序·https·uni-app·iphone·webview
程序员江同学5 小时前
Kotlin 技术月报 | 2025 年 9 月
android·kotlin
码农的小菜园6 小时前
探究ContentProvider(一)
android
时光少年7 小时前
Compose AnnotatedString实现Html样式解析
android·前端
hnlgzb8 小时前
安卓中,kotlin如何写app界面?
android·开发语言·kotlin
jzlhll1239 小时前
deepseek kotlin flow快生产者和慢消费者解决策略
android·kotlin
火柴就是我9 小时前
Android 事件分发之动态的决定某个View来处理事件
android
一直向钱9 小时前
FileProvider 配置必须针对 Android 7.0+(API 24+)做兼容
android
zh_xuan9 小时前
Android 消息循环机制
android