当前位置: 首页 > news >正文

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

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

在这里插入图片描述

相关文章:

  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型
  • vscode写html不会自动补全
  • 东方博宜1703 - 小明买水果
  • 数据结构:希尔排序
  • 身份认证与口令攻击
  • excel怎么对非数字求和汇总?
  • AI边缘计算盒子在智慧交通的应用
  • USB主机模式——Android
  • python项目中的日志定义
  • Qt for android : libusb在android中使用
  • gitea的git库备份与恢复
  • nacos连接异常did not find the Leader node;
  • JAVA应用服务器如何快速定位CPU问题
  • 【vue】@、@/、../和./的区别
  • apollo版本更新简要概述
  • 【Amaple教程】5. 插件
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Python3爬取英雄联盟英雄皮肤大图
  • spring + angular 实现导出excel
  • tensorflow学习笔记3——MNIST应用篇
  • Webpack 4x 之路 ( 四 )
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 翻译--Thinking in React
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​水经微图Web1.5.0版即将上线
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.ajax()
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java)【深基9.例1】选举学生会
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (多级缓存)缓存同步
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (区间dp) (经典例题) 石子合并
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (源码分析)springsecurity认证授权
  • (转)可以带来幸福的一本书
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net程序帮助文档制作
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /etc/skel 目录作用