Android中Activity

一、AndroidManifest中的<activity>标签

<activity>标签在AndroidManifest.xml文件中用于定义和配置应用中的每一个Activity。Activity是Android应用的基本构建块之一,主要负责展示用户界面,并处理用户与之的交互。每个在应用中显示给用户的界面都应被注册为一个Activity。

1.1 注册和声明活动

基本注册

AndroidManifest.xml 文件中,每个活动都必须在 <application> 标签内声明。例如:

xml 复制代码
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".SettingsActivity" />
</application>

在这个例子中,MainActivity 被声明为主活动,并且会在启动器(Launcher)中显示图标。SettingsActivity 被简单地声明,但不会在启动器中显示图标。

1.2 可以配置的属性

以下是 <activity> 标签中可以配置的常见属性及其作用:

基本属性

1.2.1 android:name
  • 描述: 这是活动类的名称,可以是完整的类名或者相对于应用包的相对名称。如果使用相对名称,需要在前面加上点(.)。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" />
  • 作用: 指定与该活动相关联的Java类。

1.2.2 android:label
  • 描述: 为活动提供一个标签,通常显示在活动的标题栏中。可以是一个字符串资源或直接的字符串。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:label="@string/app_name" />
  • 作用: 提供用户可读的活动名称。

1.2.3 android:icon
  • 描述: 为活动提供一个图标,可以是一个资源引用。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:icon="@drawable/ic_launcher" />
  • 作用: 在某些界面,如最近任务列表中显示活动的图标。

1.2.4 android:theme
  • 描述: 为活动指定一个主题,可以是一个资源引用。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:theme="@style/AppTheme" />
  • 作用: 定义活动的外观和风格。

1.2.5 android:exported
  • 描述 : 指示活动是否可以被其他应用启动。如果未指定,默认值取决于 <intent-filter> 的存在与否。如果有 <intent-filter>,默认为 true,否则为 false

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:exported="true" />
  • 作用: 控制活动的可见性和安全性。

1.3 生命周期和行为属性

1.3.1 android:launchMode
  • 描述: 指定活动的启动模式,影响活动在任务栈中的加载方式。

  • 参数:

    • standard: 默认模式,每次启动都会创建一个新的活动实例。
    • singleTop: 如果栈顶已经是该活动的实例,则复用该实例,不再创建新的实例。
    • singleTask: 只允许一个实例存在,如果已存在,则将该实例移到前台,并清除其上面的所有活动。
    • singleInstance: 活动独占一个任务栈,且系统不会创建新的任务栈。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:launchMode="singleTop" />
  • 作用: 控制活动的实例化和复用行为。

1.3.2 android:clearTaskOnLaunch
  • 描述: 当用户重新启动任务时,是否清除任务栈中的所有活动。

  • 参数:

    • true: 清除任务栈中的所有活动,只保留根活动。
    • false: 保留任务栈中的所有活动。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:clearTaskOnLaunch="true" />
  • 作用: 决定活动在任务重新启动时的行为。

1.3.3 android:excludeFromRecents
  • 描述: 是否将活动从最近任务列表中排除。

  • 参数:

    • true: 不显示在最近任务列表中。
    • false: 显示在最近任务列表中。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:excludeFromRecents="true" />
  • 作用: 控制活动是否显示在最近任务列表中。

1.3.4 android:finishOnTaskLaunch
  • 描述: 当任务重新启动时,是否结束该活动。

  • 参数:

    • true: 任务重新启动时结束该活动。
    • false: 保持活动不被结束。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:finishOnTaskLaunch="true" />
  • 作用: 决定活动在任务重新启动时的行为。

13.5 android:allowTaskReparenting
  • 描述: 是否允许活动从一个任务重新归属到另一个任务。

  • 参数:

    • true: 允许重新归属。
    • false: 不允许重新归属。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:allowTaskReparenting="true" />
  • 作用: 控制活动在不同任务之间的移动。

1.4 用户界面和配置属性

1.4.1 android:configChanges
  • 描述: 指定活动可以处理的配置变化,避免系统在配置变化时重新创建活动。

  • 参数:

    • orientation: 屏幕方向变化。
    • keyboardHidden: 键盘可用性变化。
    • screenSize: 屏幕尺寸变化。
    • locale: 语言区域变化。
    • 等等。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:configChanges="orientation|screenSize" />
  • 作用: 控制活动在配置变化时的行为。

1.4.2 android:screenOrientation
  • 描述: 指定活动的屏幕方向。

  • 参数:

    • unspecified: 系统决定方向。
    • behind: 使用父活动的方向。
    • landscape: 横向。
    • portrait: 纵向。
    • sensor: 根据传感器决定方向。
    • user: 用户选择的方向。
    • 等等。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:screenOrientation="portrait" />
  • 作用: 控制活动的屏幕方向。

1.4.3 android:windowSoftInputMode
  • 描述: 指定软键盘如何调整活动的布局。

  • 参数:

    • adjustResize: 活动布局会调整大小以使软键盘上方的内容可见。
    • adjustPan: 活动布局会平移,使当前焦点不被软键盘遮挡。
    • stateVisible: 启动时软键盘显示。
    • stateHidden: 启动时软键盘隐藏。
    • 等等。
  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize" />
  • 作用: 控制软键盘显示时活动布局的调整方式。

1.5 权限和用户选择属性

1.5.1 android:permission
  • 描述: 指定启动该活动所需的权限。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:permission="com.example.permission.MY_PERMISSION" />
  • 作用: 控制活动的访问权限。

1.5.2 android:taskAffinity
  • 描述: 指定活动的任务亲和性,控制活动在任务栈中的归属。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity" android:taskAffinity="com.example.myapp.task" />
  • 作用: 控制活动在不同任务栈中的归属。

1.6 意图过滤器(Intent Filters)

1.6.1 <action>
  • 描述: 指定活动可以响应的意图动作。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  • 作用: 声明活动可以响应的意图动作。

1.6.2 <category>
  • 描述: 指定活动的类别。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  • 作用: 声明活动的类别,例如是否是启动器活动。

1.6.3 <data>
  • 描述: 指定活动可以处理的数据类型。

  • 示例:

    xml 复制代码
    <activity android:name=".MainActivity">
        <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>

二、资源文件res中的页面UI

2.1 res文件的结构

res文件目主要以各种资源文件为主,Android对资源文件的管理比较严格主要分为以下几类

  • layout 目录:存放应用界面的XML布局文件。每个布局文件定义一个或多个用户界面的结构。这些文件通常包括文本框、按钮、图片等UI组件的定义。例如activity_main.xml

  • mipmap 目录:用于存储应用的主图标(Launcher Icons)。根据设备屏幕密度不同(如ldpi, mdpi, hdpi等),mipmap目录下通常会有多级子目录,每个子目录对应不同分辨率的图标,以确保应用在不同设备上显示的图标都有良好的清晰度。

  • drawable 目录:用于存储图像资源,包括.png、.jpg、.gif等格式的图片文件。和mipmap类似,drawable目录下也有基于不同屏幕密度的子目录,例如drawable-xxhdpi。此外,这里还可以存放形状、颜色选择器等XML定义的图形资源。

  • values 目录:用于存储各种非图形的资源,如字符串(strings.xml)、颜色(colors.xml)、尺寸(dimens.xml)、样式(styles.xml)、主题(themes.xml)、数组等。这些资源文件通过名称来引用,方便管理和共享。

  • anim 目录:存放动画资源文件,可以是XML定义的View动画(如fade_in.xml)或是属性动画(如scale.xml)。

  • animator 目录:与anim类似,但是专用于属性动画,特别是用于对象属性的动画(比如object_animator.xml)。

  • color 目录:从Android 7.0 (API level 24) 开始支持,用于存放颜色状态列表资源文件,如按钮不同状态(如点击、正常)的颜色。

  • raw 目录:可以存放原始资源文件,如音频或视频文件等,不会被进一步处理。

  • menu 目录:用于存储菜单资源,如选项菜单、上下文菜单等,这些是由XML文件定义的。

  • xml 目录:用于存放其他XML格式的资源文件,如映射文件、搜索配置文件等。

2.2 如何引用资源

在代码或XML文件中引用资源时,使用@+id/@string/@drawable/等前缀来指定资源类型。例如,引用一个字符串资源可以写成@string/app_name,引用一个图像资源可以写成@drawable/icon

2.3 国际化与多分辨率支持

为了支持不同的语言和地区,以及针对不同屏幕大小和密度的设备,可以在res目录下创建特定语言或屏幕密度的子目录。例如:

  • values-fr 用于存放法语的字符串资源。
  • layout-land 用于存放横屏布局的资源文件。
  • drawable-xhdpi 用于存放针对高分辨率屏幕的图形资源。

2.4 Android页面布局

在Android开发中,页面布局是构建用户界面的核心部分。不同的布局方式会影响到应用在不同设备上的显示效果和用户体验。随着Android版本的更新,官方推荐的布局方式也有所变化。

2.4.1 常见的布局方式
  1. 线性布局(LinearLayout)

    • 作用:线性布局是最常用的布局之一,它按照水平或垂直方向排列子视图。
    • 特点:简单易用,适合简单的排列需求,但嵌套过多会影响性能。
    • 使用场景:常用于垂直排列的表单或水平排列的按钮组。
  2. 相对布局(RelativeLayout)

    • 作用:相对布局允许子视图相对于父视图或其他子视图进行定位。
    • 特点:灵活性高,适合复杂的UI设计,但理解和维护起来相对复杂。
    • 使用场景:适用于需要在特定位置放置元素的复杂界面。
  3. 表格布局(TableLayout)

    • 作用:表格布局将子视图排列成行和列的形式,类似于HTML中的表格。
    • 特点:结构清晰,适合需要行列对齐的界面。
    • 使用场景:适用于表格式数据展示,如日历或时间表。
  4. 帧布局(FrameLayout)

    • 作用:帧布局是最简单的布局,所有子视图默认放在左上角,覆盖显示。
    • 特点:适合单个子视图或简单覆盖布局。
    • 使用场景:常用于显示单个内容,如悬浮窗口或画布。
  5. 绝对布局(AbsoluteLayout)

    • 作用:绝对布局允许精确指定每个子视图的位置。
    • 特点:灵活但不易维护,不推荐使用。
    • 使用场景:较少使用,不推荐。
  6. 网格布局(GridLayout)

    • 作用:网格布局将子视图排列成网格形式,类似于表格布局,但支持更复杂的布局需求。
    • 特点:适合需要复杂网格排列的界面。
    • 使用场景:适用于需要网格化排列的UI设计。
2.4.2 约束布局(ConstraintLayout)

介绍

  • 作用:约束布局是一种灵活且功能强大的布局方式,允许通过约束关系来定义视图的位置和大小。
  • 特点:适用于复杂UI设计,支持扁平化布局,减少嵌套,提升性能。
  • 使用场景:适合需要灵活定位和适应不同屏幕尺寸的界面设计。

优点

  • 扁平化布局:通过减少布局嵌套,提升渲染性能。
  • 灵活性:可以通过约束关系精确控制视图的位置和大小。
  • 动态调整:支持响应式设计,能够根据屏幕尺寸和方向动态调整布局。

使用方法

  • 创建约束:在设计视图时,通过设置视图之间的约束关系来确定其位置。
  • Guideline辅助线:可以添加Guideline辅助线帮助布局。
  • 链式布局:可以通过创建链式关系来控制一组视图的对齐和分布。
2.4.3 布局选择与优化
  • 优先使用约束布局:约束布局是目前官方推荐的布局方式,适合复杂且需要动态调整的界面。
  • 减少嵌套:避免使用过多的嵌套布局,减少布局树深度,提升渲染性能。
  • 使用百分比布局:在需要适配不同屏幕尺寸时,可以使用百分比布局或ConstraintLayout的百分比特性。
  • 自适应布局 :通过使用不同的布局文件或资源目录(如layout-large),可以为不同的屏幕尺寸和分辨率提供最佳的显示效果。

三、开发时对Activity的获取与操作

3.1 Activity的生命周期

什么是生命周期?

生命周期是指一个对象从创建到销毁的整个过程。在 Android 中,Activity 的生命周期指的是 Activity 从创建到销毁的一系列状态变化。这些状态变化通过一系列生命周期回调方法来管理。

以下是从官方文档中提取的 Activity 生命周期回调方法及其描述:

  • onCreate(Bundle savedInstanceState)

    • 调用时机:当 Activity 第一次被创建时调用。
    • 用途:初始化 Activity,设置布局,绑定数据等。
    • 注意事项 :在这个方法中,你应该完成所有必要的初始化任务,例如设置布局 setContentView(),初始化视图和数据。
  • onStart()

    • 调用时机:在 Activity 变得可见但尚未与用户交互时调用。
    • 用途 :恢复在 onStop() 中保存的状态,启动动画等。
    • 注意事项 :这个方法通常用于恢复在 onStop() 中保存的临时状态。
  • onResume()

    • 调用时机:在 Activity 开始与用户交互时调用。
    • 用途 :恢复在 onPause() 中保存的状态,开始更新数据等。
    • 注意事项:这是 Activity 处于前台并且活跃时的状态,可以在这个方法中开始更新数据、注册广播接收器等。
  • onPause()

    • 调用时机:在 Activity 被暂停时调用,例如用户按下 Home 键、启动新的 Activity 或显示对话框。
    • 用途:保存当前状态,释放资源。
    • 注意事项:这是一个很重要的方法,应该在这个方法中保存临时状态,释放可能会导致内存泄漏的资源。
  • onStop()

    • 调用时机:在 Activity 完全不可见时调用,例如被新的 Activity 完全覆盖。
    • 用途:释放更多的资源,停止长时间运行的进程。
    • 注意事项:在这个方法中可以释放更多资源,如取消网络请求、注销广播接收器等。
  • onRestart()

    • 调用时机:在 Activity 从停止状态重新变为启动状态时调用。
    • 用途:重新加载数据,恢复状态。
    • 注意事项 :这个方法在 onStart() 之前调用,可以用于重新加载数据或恢复状态。
  • onDestroy()

    • 调用时机:在 Activity 被销毁时调用,例如用户按下 Back 键。
    • 用途:释放所有资源,终止进程。
    • 注意事项:这是一个最后的机会来释放资源,停止所有正在运行的线程和关闭数据库等。
  • onSaveInstanceState(Bundle outState)

    • 调用时机:在 Activity 被销毁之前调用,用于保存临时状态。
    • 用途:保存临时状态,例如用户的输入数据。
    • 注意事项 :这个方法不是每次 onDestroy() 都会调用,例如当系统内存不足时,系统可能会直接销毁 Activity 而不调用这个方法。

3.2 Activity 生命周期方法总结

  1. onCreate(Bundle savedInstanceState):初始化 Activity,设置布局和数据。
  2. onStart() :恢复在 onStop() 中保存的状态,启动动画等。
  3. onResume() :恢复在 onPause() 中保存的状态,开始更新数据等。
  4. onPause():保存当前状态,释放资源。
  5. onStop():释放更多的资源,停止长时间运行的进程。
  6. onRestart():重新加载数据,恢复状态。
  7. onDestroy():释放所有资源,终止进程。
  8. onSaveInstanceState(Bundle outState):保存临时状态,例如用户的输入数据。

事实上不难看出,生命周期便是对应 Activity 的不同状态的不同回调方法,所有的回调方法都是来自于继承 android.app.Activity 的继承。

如果利用 IDEA 的快速重写功能,可以看见还有很多方法能被我们重写:

  • 处理权限请求结果

    • onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
      • 当你使用 requestPermissions() 方法请求权限时,系统会调用这个方法来传递请求结果。
      • 你需要在这个方法中检查权限是否被授予,并相应地更新应用的行为。
  • 处理配置更改

    • onConfigurationChanged(Configuration newConfig)
      • 当设备的配置发生变化时(如屏幕方向改变、语言改变等),如果在 Manifest 中声明了处理特定配置更改,这个方法会被调用。
      • 通过重写这个方法,你可以处理配置更改,而无需重新创建 Activity。
  • 处理意图操作

    • onHandleIntent(Intent intent)
      • 这个方法在某些特定的 Activity 中使用,例如在 IntentService 中,用于处理传入的 Intent。
      • 在标准的 Activity 中,通常不需要重写这个方法。
  • 处理菜单项选择

    • onOptionsItemSelected(MenuItem item)
      • 当用户选择动作栏中的菜单项时,这个方法会被调用。
      • 通过重写这个方法,你可以处理不同的菜单项选择事件。
  • 处理前后台切换

    • onUserInteraction()
      • 当用户与 Activity 进行交互时(如触摸屏幕、按下按钮等),这个方法会被调用。
      • 可以用于检测用户是否仍在使用应用。
  • 处理窗口焦点变化

    • onWindowFocusChanged(boolean hasFocus)
      • 当 Activity 获得或失去窗口焦点时,这个方法会被调用。
      • 可以用于执行一些与焦点相关的操作,例如调整视图布局。
  • 处理 Activity 结果

    • onActivityResult(int requestCode, int resultCode, Intent data)
      • 当你启动另一个 Activity 并期望得到返回结果时,这个方法会被调用。
      • 通过重写这个方法,你可以处理返回的数据。
  • 处理低内存情况

    • onLowMemory()
      • 当系统内存偏低时,这个方法会被调用。
      • 可以用于释放一些非必要的资源,以帮助系统避免杀死你的应用。

3.3 如何获取Activity

在Android开发中,获取Activity实例的需求非常常见。无论是进行界面操作、调用Activity的方法,还是处理用户交互,都需要有Activity的实例。以下是几种常用的方法来获取Activity实例:

3.3.1 在Activity内部直接获取

在Activity类的内部,可以直接使用this关键字来获取当前Activity的实例。

java 复制代码
public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        Activity currentActivity = this;
    }
}

3.3.2 在Fragment中获取Activity

如果你在Fragment中需要获取宿主Activity的实例,可以使用getActivity()方法。

java 复制代码
public class MyFragment extends Fragment {
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        Activity hostActivity = getActivity();
    }
}

3.3.3 通过Context获取Activity

在某些情况下,你可能只拥有一个Context对象,但需要将其转换为Activity实例。可以通过检查Context的类型是否为Activity,然后进行类型转换。

java 复制代码
if (context instanceof Activity) {
    Activity activity = (Activity) context;
}

3.3.4 使用Application类管理Activity

为了在整个应用中方便地访问当前Activity,可以在Application类中维护一个当前Activity的引用。

首先,创建一个自定义的Application类:

java 复制代码
public class MyApp extends Application {
    private static Activity currentActivity;

    public static Activity getCurrentActivity() {
        return currentActivity;
    }

    public static void setCurrentActivity(Activity activity) {
        currentActivity = activity;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

然后,在每个Activity的生命周期方法中设置当前Activity:

java 复制代码
public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        
        MyApp.setCurrentActivity(this);
    }

    @Override
    protected void onDestroy() {
        if (MyApp.getCurrentActivity() == this) {
            MyApp.setCurrentActivity(null);
        }
        super.onDestroy();
    }
}

3.3.5 使用ActivityLifecycleCallbacks

Android提供了ActivityLifecycleCallbacks接口,可以用来监听所有Activity的生命周期事件,从而跟踪当前的Activity。

在自定义的Application类中注册这个回调:

java 复制代码
public class MyApp extends Application {
    private Activity currentActivity;

    public Activity getCurrentActivity() {
        return currentActivity;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                setCurrentActivity(activity);
            }

            @Override
            public void onActivityStarted(Activity activity) {
                setCurrentActivity(activity);
            }

            @Override
            public void onActivityResumed(Activity activity) {
                setCurrentActivity(activity);
            }

            @Override
            public void onActivityPaused(Activity activity) {}

            @Override
            public void onActivityStopped(Activity activity) {}

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

            @Override
            public void onActivityDestroyed(Activity activity) {}
        });
    }

    private void setCurrentActivity(Activity activity) {
        currentActivity = activity;
    }
}

3.3.6 通过Intent传递Activity实例

在某些情况下,你可能需要通过Intent在不同的组件之间传递Activity实例。然而,由于Activity是Context的子类,直接序列化传递可能会导致问题。因此,推荐的方式是传递一个RequestCode,或者通过绑定服务等方式来实现更安全的通信。

注意事项

  • 内存泄漏:在使用全局变量或静态引用Activity实例时,要特别小心,避免造成内存泄漏。确保在Activity销毁时,移除对它的引用。

  • 空指针异常:在获取Activity实例时,要确保Activity已经创建并且没有被销毁,否则可能会导致空指针异常。

  • 上下文的正确使用:在某些情况下,可能只需要Context对象,而不需要完整的Activity实例。尽量使用最具体的上下文,以减少潜在的问题。

通过以上方法,你可以根据具体的需求和场景,灵活地获取和管理Activity实例。

四、Activity的跳转和数据传输

在 Android 中,Activity 之间的跳转和数据传递是一个常见的需求。通常,这些操作是通过 Intent 来完成的。Intent 可以携带数据,并传递给目标 Activity,也可以从目标 Activity 返回数据。以下是几种常见的方法和示例代码,用于实现 Activity 之间的跳转和数据传递。

4.1 从一个 Activity 跳转到另一个 Activity

java 复制代码
// 在第一个 Activity 中跳转到第二个 Activity
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

4.2 携带数据传递到另一个 Activity

java 复制代码
// 在第一个 Activity 中
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("key_name", "John Doe");  // 传递字符串数据
intent.putExtra("key_age", 25);  // 传递整型数据
startActivity(intent);

在目标 Activity 中通过 getIntent() 获取数据:

java 复制代码
// 在第二个 Activity 中获取数据
Intent intent = getIntent();
String name = intent.getStringExtra("key_name");
int age = intent.getIntExtra("key_age", 0);  // 默认值为 0

4.3 从一个 Activity 返回数据到另一个 Activity

如果你需要从目标 Activity 返回数据到原 Activity,可以使用 setResult()startActivityForResult()

原 Activity (发送数据)
java 复制代码
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
目标 Activity (接收并返回数据)
java 复制代码
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Returned Data");
setResult(RESULT_OK, resultIntent);
finish();  // 返回原 Activity
原 Activity (接收返回数据)
java 复制代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String result = data.getStringExtra("result_key");
        // 处理返回的数据
    }
}

4.5 启动 Activity 并返回数据(Jetpack 推荐)

使用 ActivityResultContracts 是 Jetpack 推荐的新 API,取代了 startActivityForResult()

在原 Activity 中使用 ActivityResultContracts
java 复制代码
ActivityResultLauncher<Intent> startActivityForResult = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(), result -> {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            String resultData = data.getStringExtra("result_key");
            // 处理返回的数据
        }
    });

// 发起跳转
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult.launch(intent);

原文来源

以上内容主要参考了以下文章:

原文链接:Android 中,Activity & Fragment:如何进行界面跳转、数据传递等 --- 少说多做343

相关推荐
Yang-Never2 小时前
Kotlin->Kotlin协程的取消机制
android·java·开发语言·kotlin·android studio·idea
嶂蘅5 小时前
【调研】Android app动态更新launcher_icon
android·前端·程序员
woodWu5 小时前
Android 稳定性(二):治理思路篇
android
阿豪元代码5 小时前
彻底掌握 Android14 Vsync 原理
android
parade岁月5 小时前
uniapp Android 原生插件开发-Module扩展为例-从开发到测试到部署到uniapp项目
android·uni-app
Sinyu10125 小时前
Flutter 动画实战:绘制波浪动效详解
android·前端·flutter
sunly_5 小时前
Flutter:文章详情页,渲染富文本
android·javascript·flutter
那年星空5 小时前
Flutter 3.x 版本升级实战:让老项目焕发新生
android·flutter·架构
两水先木示8 小时前
【Unity3D】导出Android项目以及Java混淆
android·java混淆