深入分析 Android Activity (六)
文章目录
- 深入分析 Android Activity (六)
- 1. Activity 的权限管理
- 1.1 在 Manifest 文件中声明权限
- 1.2 运行时请求权限
- 1.3 处理权限请求结果
- 1.4 处理权限的最佳实践
- 2. Activity 的数据传递
- 2.1 使用 Intent 传递数据
- 2.2 使用 Bundle 传递复杂数据
- 3. Activity 的动画和过渡效果
- 3.1 使用内置动画资源
- 3.2 使用自定义动画
- 4. Activity 的导航和返回栈管理
- 4.1 使用 Intent 启动 Activity
- 4.2 使用任务和返回栈
- 4.3 使用导航组件
- 总结
深入分析 Android Activity (六)
1. Activity 的权限管理
Android 应用需要请求权限才能访问某些敏感数据或硬件功能。理解和正确处理权限请求是确保应用安全性和用户隐私的关键。
1.1 在 Manifest 文件中声明权限
首先,在 AndroidManifest.xml
文件中声明所需权限。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp"><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><application... ><activity android:name=".MainActivity">...</activity></application>
</manifest>
1.2 运行时请求权限
从 Android 6.0 (API level 23) 开始,需要在运行时请求权限。
private void requestPermissions() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);}
}
1.3 处理权限请求结果
重写 onRequestPermissionsResult
方法处理用户的响应。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CAMERA_PERMISSION) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// Permission grantedopenCamera();} else {// Permission deniedToast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();}}
}
1.4 处理权限的最佳实践
- 提供明确的权限请求理由。
- 处理用户拒绝权限的情况,提供替代方案。
- 避免滥用权限,仅请求必需的权限。
2. Activity 的数据传递
在 Android 应用中,Activity
之间的数据传递是常见的需求。可以使用 Intent
和 Bundle
进行数据传递。
2.1 使用 Intent 传递数据
在启动新 Activity
时,可以通过 Intent
传递数据。
// Starting a new Activity with data
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
在目标 Activity
中接收数据:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Intent intent = getIntent();String value = intent.getStringExtra("key");// Use the received data
}
2.2 使用 Bundle 传递复杂数据
Bundle
可以传递更复杂的数据结构。
// Putting data into Bundle
Bundle bundle = new Bundle();
bundle.putString("key", "value");
bundle.putInt("number", 123);// Starting a new Activity with Bundle
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
在目标 Activity
中接收 Bundle
数据:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Bundle bundle = getIntent().getExtras();if (bundle != null) {String value = bundle.getString("key");int number = bundle.getInt("number");// Use the received data}
}
3. Activity 的动画和过渡效果
通过动画和过渡效果,可以提升应用的用户体验,使界面切换更加流畅和吸引人。
3.1 使用内置动画资源
Android 提供了一些内置的动画资源,可以直接使用。
// Applying a transition animation when starting a new Activity
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
3.2 使用自定义动画
可以自定义动画资源,并在 XML 文件中定义。
<!-- res/anim/slide_in_right.xml -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="100%"android:toXDelta="0%"android:duration="300" /><!-- res/anim/slide_out_left.xml -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="0%"android:toXDelta="-100%"android:duration="300" />
在代码中使用自定义动画:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
4. Activity 的导航和返回栈管理
Android 提供了多种方法来管理 Activity
的导航和返回栈。
4.1 使用 Intent 启动 Activity
通过 Intent
启动新 Activity
是最常见的方法。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
4.2 使用任务和返回栈
通过 Intent
标志,可以控制 Activity
在返回栈中的行为。
// Starting a new Activity in a new task
Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);// Clearing the top of the stack and starting the Activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
4.3 使用导航组件
Android Jetpack 提供了导航组件,可以简化复杂的导航和返回栈管理。
<!-- Navigation graph in res/navigation/nav_graph.xml -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"app:startDestination="@id/firstFragment"><fragmentandroid:id="@+id/firstFragment"android:name="com.example.FirstFragment"tools:layout="@layout/fragment_first"><actionandroid:id="@+id/action_firstFragment_to_secondFragment"app:destination="@id/secondFragment" /></fragment><fragmentandroid:id="@+id/secondFragment"android:name="com.example.SecondFragment"tools:layout="@layout/fragment_second" />
</navigation>
在代码中使用导航组件:
// Navigating to the second fragment
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
navController.navigate(R.id.action_firstFragment_to_secondFragment);
总结
通过对 Android Activity
的深入理解和灵活应用,可以实现丰富的用户体验和高效的应用程序。理解其生命周期、权限管理、数据传递、动画效果、导航和返回栈管理等方面的知识,有助于开发出性能优异且用户友好的应用程序。不断学习和实践这些知识,可以提升应用程序的质量和用户满意度。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |
相关文章:

深入分析 Android Activity (六)
文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…...

火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求
在航空工业的协同研发领域,航空AR工业装配系统公司凭借前沿的AR增强现实技术,正引领一场革新。通过将虚拟信息无缝融入实际环境中,我们为工程师、设计师和技术专家提供了前所未有的共享和审查三维模型的能力,极大地提升了研发效率…...

LeetCode 279 —— 完全平方数
阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此图利用动态规划进行求解,首先,我们求出小于 n n n 的所有完全平方数,存放在数组 squareNums 中。 定义 dp[n] 为和为 n n n 的完全平方数的最小数量,那么有状态…...
PHP发票真假API、医疗电子票据查验、发票识别接口开发示例
“营”“增”两种税是主流的流转税种,是两个独立而不能交叉的税种。也就是说交增值税的话就不交营业税,而交了营业税就不需要交增值税。而且,两者在征收的对象、征税范围、计税的依据、税目、税率以及征收管理等都有所不同,增值税…...
Python库之`lxml`的高级用法深度解析
Python库之lxml的高级用法深度解析 简介 lxml是一个功能强大的第三方库,它提供了对XML和HTML文档的高效处理能力。除了基本的解析和创建功能外,lxml还包含了一些高级用法,这些用法可以帮助开发者在处理复杂文档时更加得心应手。 高级解析技…...
参数的本质:详解 JavaScript 函数的参数
文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 JavaScript 的部分,瑶琴会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。 上篇文章…...

悲痛都会过去,唯有当下值得珍惜
在生活的长河中,我们都会经历各种各样的悲痛与挫折,无论是来自原生家庭的困扰,婚姻中的曲折,还是小时候的创伤、男女关系中的纠葛、校园时期的霸凌。然而,当我们回首过去,曾经以为无法逾越的痛苦࿰…...

第三方软件测试机构进行代码审计需要哪些专业的知识?
代码审计 进行代码审计需要专业的知识,包括编程语言、操作系统、数据库、网络知识以及安全知识等。 1.编程语言知识是进行代码审计的基础,因为你需要理解代码的语法和结构。对于不同的应用程序,你需要了解其所使用的编程语言的特点和语法规…...

Modal.method() 不显示头部的问题
ant-design中的Modal组件有两种用法: 第一种是用标签:<a-modal></a-modal> 第二种是用Api:Modal.info、Modal.warning、Modal.confirm...... 一开始项目中这两种用法是混用的,后面UI改造,需要统一样式&…...
Java中的内部类及其用途
一、技术难点 在Java中,内部类是一个定义在另一个类内部的类。这种嵌套的结构带来了一些技术上的难点和挑战: 访问控制:内部类可以直接访问外部类的所有成员(包括私有成员),但外部类不能直接访问内部类的…...

堆(建堆算法,堆排序)
目录 一.什么是堆? 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明: 2.向上调整 3.向下调整 4.源码: 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆? 1.堆 堆就…...

Linux内核重置root密码
Ubuntu 首先重新启动Ubuntu系统,然后快速按下shift键,以调出grub启动菜单在这里我们选择第二个(Ubuntu高级选项),选中后按下Enter键 选择最高的Linux内核版本所对应的recovery mode模式,按e键编辑启动项 在…...

LaTex安装及配置(Windows)
LaTex安装及配置(Windows) 安装环境安装texlive下载texlive安装 编辑器安装texstudio下载texstudio安装 环境配置 使用第一个LaTex文档新建文件编程查看results 安装 环境安装 texlive下载 镜像清华源下载地址:https://mirrors.tuna.tsing…...

这才是满分毕业答辩PPT!
这才是满分毕业答辩PPT! 2024年 毕业答辩论文指南 创新 正式 高效 正值毕业季,是不是很多同学,非常头疼如何进行论文答辩? 要想导师满意,顺利毕业,那么手里必须有份优秀的答辩PPT。这将是你的秘密武器&…...

【字典树(前缀树) 字符串】2416. 字符串的前缀分数和
本文涉及知识点 字典树(前缀树) 字符串 LeetCode 2416. 字符串的前缀分数和 给你一个长度为 n 的数组 words ,该数组由 非空 字符串组成。 定义字符串 word 的 分数 等于以 word 作为 前缀 的 words[i] 的数目。 例如,如果 words [“a”,…...

X-CSV-Reader:一个使用Rust实现CSV命令行读取器
🎈效果演示 ⚡️快速上手 依赖导入: cargo add csv读取实现: use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…...
集成ECharts到若依框架:原理与使用方法详解
ECharts 是一个强大的开源数据可视化库,基于 JavaScript,能够创建丰富多彩的图表和交互数据展示。结合若依框架(RuoYi),我们可以非常方便地将 ECharts 集成到系统中,实现数据的可视化展示。本文将详细介绍 …...

【机器学习】——线性模型
💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux…...
最全的Redis常用命令
Redis是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)…...

sourcetree推送到git上面
官网:Sourcetree | Free Git GUI for Mac and Windows 下载到1次提交 下载后打开 点击跳过 下一步 名字邮箱 点击clone 把自己要上传的代码粘贴到里面去 返回点击远程->点击暂存所有 加载完毕后,输入提交内容提交 提交完成了 2次提交 把文件夹内的…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...