深入分析 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 之间的数据传递是常见的需求。可以使用 IntentBundle 进行数据传递。

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 的深入理解和灵活应用,可以实现丰富的用户体验和高效的应用程序。理解其生命周期、权限管理、数据传递、动画效果、导航和返回栈管理等方面的知识,有助于开发出性能优异且用户友好的应用程序。不断学习和实践这些知识,可以提升应用程序的质量和用户满意度。

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

在这里插入图片描述

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

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

相关文章

Python 机器学习 基础 之 数据表示与特征工程 【分箱、离散化、线性模型与树 / 交互特征与多项式特征】的简单说明

Python 机器学习 基础 之 数据表示与特征工程 【分箱、离散化、线性模型与树 / 交互特征与多项式特征】的简单说明 目录 Python 机器学习 基础 之 数据表示与特征工程 【分箱、离散化、线性模型与树 / 交互特征与多项式特征】的简单说明 一、简单介绍 二、分箱、离散化、线性…

使用 Ollama框架 下载和使用 Llama3 AI大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日20点59分 &#x1f004;️文章质量&#xff1a;96分 目录 &#x1f4a5;Ollama介绍 主要特点 主要优点 应…

*Python中的None与null:深入解析与实用指南

Python中的None与null:深入解析与实用指南 在编程的世界里,None和null是两个经常出现的概念,它们代表了“无”或“空”的状态。然而,在Python和许多其他编程语言中,这两个术语有着不同的含义和用法。本文将深入解析Python中的None,并对比其与其他编程语言中的null,提供…

如何将Spring Security添加到一个新的Spring Boot应用程序

如何将Spring Security添加到一个新的Spring Boot应用程序 这篇文章是关于如何将Spring Security添加到一个新的Spring Boot应用程序的详细步骤及其效果的介绍。 起点 首先&#xff0c;我们有一个简单的Spring Boot应用程序&#xff0c;它仅依赖于Web组件&#xff0c;并包含…

【张量乘法】pytorch中的mul、dot、mm、matmul

张量的乘法是pytorch等神经网络开发框架中最常见、最基本的操作之一。 1&#xff0c;torch.mul 对应位置的元素相乘。mul即表示张量中对应位置元素的相乘&#xff0c;也是最容易理解的乘法。 import torch a torch.tensor([[1, 2], [3, 4]]) b torch.tensor([[5, 6], [7, …

如何在Spring中配置声明式事务?

在Spring中配置声明式事务&#xff0c;主要有两种方式&#xff1a;通过XML配置文件和使用注解。声明式事务让你能够将事务管理代码从业务逻辑代码中分离出来&#xff0c;通过声明的方式来管理事务&#xff0c;使得代码更加简洁&#xff0c;易于维护。下面我将分别展示这两种方式…

【应用层】域名系统DNS

目录 1、互联网的域名结构 2、域名服务器 域名系统 DNS (Domain Name System) 是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器名字转换为 IP 地址&#xff0c;域名系统其实就是名字系统。 互联网的域名系统 DNS 被设计成为一个联机分布式数据库系统&#xff0c…

Dockerfile构建Vue开发环境

# 指定基础镜像 FROM ubuntu:20.04# apt-get更换国内源解决 RUN sed -i s/archive.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list RUN sed -i s/security.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list ## 添加新的APT源 # RUN echo "deb http://se…

Facebook的心灵之镜:探寻数字社交的灵魂深处

在当今数字化时代&#xff0c;社交媒体已经成为了人们生活的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;更是承载了数以亿计的用户情感和交流。然而&#xff0c;Facebook不仅仅是一个简单的社交平台&#xff0c;它更像是一面心灵之镜&#xff0c;反映着数字社交…

2024年京东618购物节,“雷蛇 猎魂光蛛V2 模拟光轴“机械键盘的购买体验: 京东售后很优秀, 雷蛇Razer品控让人担忧

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

充电宝哪个牌子好用?充电宝品牌怎么选?充电宝最好的牌子排名

现在市面上的充电宝品牌琳琅满目&#xff0c;但并不是所有的充电宝都安全可靠。据央视的一个报道&#xff0c;市面上有35%充电宝质量是不过关的!充电宝买不对就非常容易出现爆炸的一个情况&#xff0c;所以大家对选充电宝不仅能保障设备的安全。那么&#xff0c;充电宝哪个牌子…

IP地址在广告行业中的重要地位

新时代&#xff0c;广告已经成为了企业推广产品的必要手段&#xff0c;而企业想要广告效果好&#xff0c;就要做到精准投放营销广告&#xff0c;将“花钱”的广告精准送到产品的受众用户面前&#xff0c;让收益大于花销&#xff0c;而归根究底就是广告转化率与回报率是否达到预…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录数组基础1部分的题目&#xff0c;主要题目包括&#xff1a; 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口&#xff0c;就是不断的调节子序列的起始位…

【全开源】课程预约小程序系统源码(FastAdmin+UniApp)

基于FastAdminUniApp开发的专属课程预约小程序&#xff0c;程序适用于SPA瑜伽、普拉提舍宾、培训机构等场所&#xff0c;通过多角色身份进行管理&#xff0c;让你的瑜伽馆/培训机构更加操作便捷。Uniapp小程序端包含会员入口、老师入口、员工入口。 ​打造便捷教育预约新体验 …

[BT]小迪安全2023学习笔记(第28天:Web攻防-SQL提交方式注入)

第28天 GET POST Cookie Http头 网站有可能会处理Http头的一些信息&#xff0c;比如UA头、Host地址等&#xff0c;如果网站将这些内容与SQL数据库的内容进行对比&#xff08;涉及数据库的操作&#xff09;&#xff0c;那么就跟普通GET参数值一样存 在漏洞&#xff08;因为…

流量控制的艺术:深入探索分布式限流策略与实践

前言 ​ 当资源成为瓶颈时&#xff0c;服务框架需要对消费者做限流&#xff0c;启动流控保护机制。流量控制有多种策略&#xff0c;比较常用的有&#xff1a;针对访问速率的静态流控、针对资源占用的动态流控、针对消费者并发连接数的连接控制和针对并行访问数的并发控制。 常…

结构体知识点

目录 1.结构的声明 结构体变量的创建和初始化 typedef 对匿名结构体类型重命名&#xff08;简化&#xff09; 举例子代码和分析 2. 结构体内存对⻬ 2.1 对⻬规则 1.结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣&#xff1a; struct Stu {ch…

FltSendMessage 超时时间相关问题

之前做基于minifilter的windows文件过滤驱动时&#xff0c;会碰到fltsendmessage超时问题&#xff0c;查阅资料后特此记录下 NTSTATUS FLTAPI FltSendMessage([in] PFLT_FILTER Filter,[in] PFLT_PORT *ClientPort,[in] PVOID …

HCIP的学习(22)

BGP优化 [r1-bgp]peer 12.0.0.2 default-route-advertise ---BGP下放缺省路由&#xff0c;无论本地的路由表中是否存在缺省路由&#xff0c;都会向对等体下发一条下一跳为本地的缺省路由&#xff0c;从而减少网络中路由数量&#xff0c;节省对等体的设备资源 BGP协议优先级 缺…

Keras深度学习框架第二十九讲:在自定义训练循环中应用KerasTuner超参数优化

1、简介 在KerasTuner中&#xff0c;HyperModel类提供了一种方便的方式来在可重用对象中定义搜索空间。你可以通过重写HyperModel.build()方法来定义和进行模型的超参数调优。为了对训练过程进行超参数调优&#xff08;例如&#xff0c;通过选择适当的批处理大小、训练轮数或数…