深入分析 Android Activity (六)

文章目录

    • [深入分析 Android Activity (六)](#深入分析 Android Activity (六))
    • [1. Activity 的权限管理](#1. Activity 的权限管理)
      • [1.1 在 Manifest 文件中声明权限](#1.1 在 Manifest 文件中声明权限)
      • [1.2 运行时请求权限](#1.2 运行时请求权限)
      • [1.3 处理权限请求结果](#1.3 处理权限请求结果)
      • [1.4 处理权限的最佳实践](#1.4 处理权限的最佳实践)
    • [2. Activity 的数据传递](#2. Activity 的数据传递)
      • [2.1 使用 Intent 传递数据](#2.1 使用 Intent 传递数据)
      • [2.2 使用 Bundle 传递复杂数据](#2.2 使用 Bundle 传递复杂数据)
    • [3. Activity 的动画和过渡效果](#3. Activity 的动画和过渡效果)
      • [3.1 使用内置动画资源](#3.1 使用内置动画资源)
      • [3.2 使用自定义动画](#3.2 使用自定义动画)
    • [4. Activity 的导航和返回栈管理](#4. Activity 的导航和返回栈管理)
      • [4.1 使用 Intent 启动 Activity](#4.1 使用 Intent 启动 Activity)
      • [4.2 使用任务和返回栈](#4.2 使用任务和返回栈)
      • [4.3 使用导航组件](#4.3 使用导航组件)
    • 总结

深入分析 Android Activity (六)

1. Activity 的权限管理

Android 应用需要请求权限才能访问某些敏感数据或硬件功能。理解和正确处理权限请求是确保应用安全性和用户隐私的关键。

1.1 在 Manifest 文件中声明权限

首先,在 AndroidManifest.xml 文件中声明所需权限。

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) 开始,需要在运行时请求权限。

java 复制代码
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 方法处理用户的响应。

java 复制代码
@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 granted
            openCamera();
        } else {
            // Permission denied
            Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

1.4 处理权限的最佳实践

  • 提供明确的权限请求理由。
  • 处理用户拒绝权限的情况,提供替代方案。
  • 避免滥用权限,仅请求必需的权限。

2. Activity 的数据传递

在 Android 应用中,Activity 之间的数据传递是常见的需求。可以使用 IntentBundle 进行数据传递。

2.1 使用 Intent 传递数据

在启动新 Activity 时,可以通过 Intent 传递数据。

java 复制代码
// Starting a new Activity with data
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("key", "value");
startActivity(intent);

在目标 Activity 中接收数据:

java 复制代码
@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 可以传递更复杂的数据结构。

java 复制代码
// 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 数据:

java 复制代码
@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 提供了一些内置的动画资源,可以直接使用。

java 复制代码
// 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 文件中定义。

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" />

在代码中使用自定义动画:

java 复制代码
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 是最常见的方法。

java 复制代码
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

4.2 使用任务和返回栈

通过 Intent 标志,可以控制 Activity 在返回栈中的行为。

java 复制代码
// 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 提供了导航组件,可以简化复杂的导航和返回栈管理。

xml 复制代码
<!-- 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">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.FirstFragment"
        tools:layout="@layout/fragment_first">
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.SecondFragment"
        tools:layout="@layout/fragment_second" />
</navigation>

在代码中使用导航组件:

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

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

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