深入分析 Android Activity (二)

文章目录

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

深入分析 Android Activity (二)

1. Activity 的启动模式(Launch Modes)

Android 提供了几种不同的启动模式,用于定义 Activity 的启动行为。这些模式通过 AndroidManifest.xml 文件中的 android:launchMode 属性或 Intent 标志进行配置。

1.1 标准模式(standard)

这是默认的启动模式。每次启动 Activity 都会创建一个新的实例,无论该 Activity 是否已经存在于栈中。

<activity android:name=".MyActivity"android:launchMode="standard">
</activity>
1.2 单顶模式(singleTop)

如果当前任务的栈顶已经有该 Activity 实例,则重用该实例,并调用其 onNewIntent 方法,否则创建新的实例。

<activity android:name=".MyActivity"android:launchMode="singleTop">
</activity>

使用 Intent 标志也可以实现相同效果:

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
1.3 单任务模式(singleTask)

在栈中只保留一个 Activity 实例。如果实例存在,则将其置于栈顶,并调用其 onNewIntent 方法,否则创建新的实例。

<activity android:name=".MyActivity"android:launchMode="singleTask">
</activity>
1.4 单实例模式(singleInstance)

创建一个单独的任务栈来管理该 Activity,并且在该任务栈中只存在这一个 Activity 实例。

<activity android:name=".MyActivity"android:launchMode="singleInstance">
</activity>

2. 深入理解 Intent 和 Intent Filters

2.1 Intent

Intent 是 Android 中用于在不同组件(如 ActivityServiceBroadcastReceiver)之间传递数据和请求操作的消息对象。主要分为两种类型:

  • 显式 Intent:明确指定目标组件的 Intent
  • 隐式 Intent:不指定目标组件,通过 Intent Filter 进行匹配。

显式 Intent 示例:

Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);

隐式 Intent 示例:

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 类型。

<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 属性为某些组件指定不同的进程:

<activity android:name=".MyActivity"android:process=":remote"/>
3.2 线程

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

使用 AsyncTask 进行后台操作:

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 用于启动服务:

Intent intent = new Intent(this, MyService.class);
startService(intent);
4.2 绑定服务

bindService 用于绑定服务,并获取 IBinder 以进行通信:

Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

ServiceConnection 用于管理 Service 的连接和断开:

private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MyService.LocalBinder binder = (MyService.LocalBinder) service;myService = binder.getService();isBound = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {isBound = false;}
};

总结

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用边缘计算网关的工业设备数据采集方案探讨-天拓四方

随着工业4.0时代的到来&#xff0c;工业设备数据采集成为了实现智能制造、提升生产效率的关键环节。传统的数据采集方案往往依赖于中心化的数据处理方式&#xff0c;但这种方式在面对海量数据、实时性要求高的工业场景时&#xff0c;往往显得力不从心。因此&#xff0c;利用边缘…

二叉树的链式结构(二叉树)与顺序结构(堆)---数据结构

一、树的概念与结构 1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。我们常把它叫做树&#xff0c;是因为它看起来像一棵倒挂的树&#xff0c;它的根是朝上的&#xff0c;而叶是朝下的。 下面…

每日复盘-20240528

今日重点关注&#xff1a; 20240528 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------301361--------- 众智科技 二日涨…

联邦和反射器实验

拓扑图 一.实验要求 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告 AS3存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告 AS1还有一个环回地址为10.1.1.0/24&#xff…

[C][动态内存分配][柔性数组]详细讲解

目录 1.动态内存函数的介绍1.malloc2.free2.calloc4.realloc 2.常见的动态内存错误3.C/C程序的内存开辟4.柔性数组1.是什么&#xff1f;2.柔性数组的特点3.柔性数组的使用4.柔性数组的优势 1.动态内存函数的介绍 1.malloc 函数原型&#xff1a;void* malloc(size_t size)功能…

【PB案例学习笔记】-11动画显示窗口

写在前面 这是PB案例学习笔记系列文章的第11篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

颈源性头痛症状及表

颈源性头痛一般表现为&#xff0c;就是说从枕后一直颞侧&#xff0c;到太阳穴附近&#xff0c;这个是枕小的一个疼痛&#xff0c;还有一部分人从枕后&#xff0c;沿着一个弧线&#xff08;如下图&#xff09;的轨迹到了前额&#xff0c;到我们前额&#xff0c;这样一个疼痛&…

ADIL简单测试实例

参考资料&#xff1a;https://blog.csdn.net/geyichongchujianghu/article/details/130045373这个连接是Java的代码&#xff0c;我根据它的链接写了一个kotlin版本的。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android平台上用于进程间通信&…

AI办公自动化:kimi批量新建文件夹

工作任务&#xff1a;批量新建多个文件夹&#xff0c;每个文件夹中的年份不一样 在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写关于录制电脑上的键盘和鼠标操作的Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&…

FFmpeg编解码的那些事(1)

看了网上很多ffmpeg的编解码的文章和代码&#xff0c;发现有很多文章和代码都过时了&#xff0c;主要还是ffmpeg有很多接口都已经发生变化了。 这里简单说一下&#xff0c;什么是编码和解码。 1.视频编码 对于视频来说&#xff0c;可以理解为多张&#xff08;rgb或者yuv&…

Python散点图矩阵代码模版

本文分享Python seaborn实现散点图矩阵代码模版&#xff0c;节选自&#x1f449;嫌Matplotlib繁琐&#xff1f;试试Seaborn&#xff01; 散点图矩阵&#xff08;scatterplot matrix&#xff09;展示原始数据中所有变量两两之间关系&#xff0c;可以规避单一统计指标的偏差&…

Neural Filters:照片恢复

Ps菜单&#xff1a;滤镜/Neural Filters/恢复/照片恢复 Neural Filters/RESTORATION/Photo Restoration 照片恢复 Photo Restoration借助 AI 强大功能快速恢复旧照片&#xff0c;提高对比度、增强细节、消除划痕。将此滤镜与着色相结合以进一步增强效果。 “照片恢复”滤镜利用…

Scikit-Learn随机森林

Scikit-Learn随机森林 1、随机森林1.1、集成学习1.2、Bagging方法1.3、随机森林算法1.4、随机森林的优缺点2、Scikit-Learn随机森林回归2.1、Scikit-Learn随机森林回归API2.2、随机森林回归实践(加州房价预测)1、随机森林 随机森林是一种由决策树构成的集成算法,它在大多情况…

mac安装的VMware虚拟机进行桥接模式配置

1、先进行网络适配器选择&#xff0c;选择桥接模式 2、点击网络适配器 设置... 3、选择WiFi&#xff08;我使用的是WiFi&#xff0c;所以选择这个&#xff09;&#xff0c;注意看右边的信息&#xff1a;IP和子网掩码&#xff0c;后续配置虚拟机的ifcfg-ens文件会用到 4、编辑if…

【论文阅读笔记】The Google File System

1 简介 Google File System (GFS) 是一个可扩展的分布式文件系统&#xff0c;专为快速增长的Google数据处理需求而设计。这篇论文发表于2003年&#xff0c;此前已在Google内部大规模应用。 GFS不仅追求性能、可伸缩性、可靠性和可用性等传统分布式文件系统的设计目标&#xf…

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找&#xff08;模板题&#xff09;看到复杂度logN&#xff0c;得想到二分 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0…

企业微信hook接口协议,ipad协议http,语音转文字

语音转文字 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信msgid是int要转文字的语音消息id 请求示例 {"uuid":"a4ea6a39-4b3a-4098-a250-2a07bef57355","msgid":1063645 } 返回示例 {"data&…

电源模块测试系统怎么测试输入电压范围?

在现代电子设备中&#xff0c;电源模块的性能直接影响着整个系统的稳定性和效率。其中&#xff0c;电源输入电压范围是指电源能够接受的输入电压的最小值和最大值&#xff0c;它是确保电源正常工作的重要参数。为了提高测试效率和精度&#xff0c;自动化的测试方法逐渐取代了传…

【Game】Rumble Heroes

文章目录 1 英雄2 守护兽3 符文4 祝福5 阵容推荐6 Boss7 兑换码 1 英雄 &#xff08;1&#xff09;力量 神话英雄 圣骑士-乌瑟尔 传说英雄 双刀-宫本武藏死亡骑士-阿萨斯冰霜骑士-亚瑟疾风焰刃-缘壹熊猫武僧-阿宝 史诗英雄 大剑-克劳德狂战士-奎托斯魔山-克里刚猎人-奈辛瓦里 稀…

宝塔部署Java+Vue前后端分离项目

1. 服务器 服务器选择Linux的CentOS7的版本 2. 宝塔Linux面板 2.1 百度搜索宝塔 2.2 进去之后点击立即免费安装 2.3 选择Linux在线安装&#xff0c;输入服务器信息进行安装(也可以选择其他方式) 安装完成之后会弹一个宝塔的应用面板&#xff0c;并附带有登录名称和密码&…