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

相关推荐
似霰2 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95274 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO5 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师5 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师5 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫5 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白6 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度
dpxiaolong7 小时前
RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
android·windows
tangweiguo030519878 小时前
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
android
老狼孩111228 小时前
2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
android·机器人·自动化·lua·脚本开发·懒人精灵·免root开发