深入分析 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 的设计原理和内部实现,有助于开发者构建高效、稳定和响应迅速的应用程序。通过深入分析和理解这些关键概念,开发者可以在实际项目中灵活应用这些知识,提升应用程序的用户体验和性能。

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

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿9 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法11 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter12 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快13 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl13 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江14 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-14 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记