一、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 常见的布局方式
-
线性布局(LinearLayout):
- 作用:线性布局是最常用的布局之一,它按照水平或垂直方向排列子视图。
- 特点:简单易用,适合简单的排列需求,但嵌套过多会影响性能。
- 使用场景:常用于垂直排列的表单或水平排列的按钮组。
-
相对布局(RelativeLayout):
- 作用:相对布局允许子视图相对于父视图或其他子视图进行定位。
- 特点:灵活性高,适合复杂的UI设计,但理解和维护起来相对复杂。
- 使用场景:适用于需要在特定位置放置元素的复杂界面。
-
表格布局(TableLayout):
- 作用:表格布局将子视图排列成行和列的形式,类似于HTML中的表格。
- 特点:结构清晰,适合需要行列对齐的界面。
- 使用场景:适用于表格式数据展示,如日历或时间表。
-
帧布局(FrameLayout):
- 作用:帧布局是最简单的布局,所有子视图默认放在左上角,覆盖显示。
- 特点:适合单个子视图或简单覆盖布局。
- 使用场景:常用于显示单个内容,如悬浮窗口或画布。
-
绝对布局(AbsoluteLayout):
- 作用:绝对布局允许精确指定每个子视图的位置。
- 特点:灵活但不易维护,不推荐使用。
- 使用场景:较少使用,不推荐。
-
网格布局(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 生命周期方法总结
onCreate(Bundle savedInstanceState)
:初始化 Activity,设置布局和数据。onStart()
:恢复在onStop()
中保存的状态,启动动画等。onResume()
:恢复在onPause()
中保存的状态,开始更新数据等。onPause()
:保存当前状态,释放资源。onStop()
:释放更多的资源,停止长时间运行的进程。onRestart()
:重新加载数据,恢复状态。onDestroy()
:释放所有资源,终止进程。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 中,通常不需要重写这个方法。
- 这个方法在某些特定的 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