马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、AndroidManifest中的<activity>标签
<activity>标签在AndroidManifest.xml文件中用于界说和设置应用中的每一个Activity。Activity是Android应用的根本构建块之一,紧张负责展示用户界面,并处理处罚用户与之的交互。每个在应用中表现给用户的界面都应被注册为一个Activity。
1.1 注册和声明运动
根本注册
在 AndroidManifest.xml 文件中,每个运动都必须在 <application> 标签内声明。比方:
- <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
- 形貌: 这是运动类的名称,可以是完备的类名大概相对于应用包的相对名称。假如利用相对名称,须要在前面加上点(.)。
- 示例:
- <activity android:name=".MainActivity" />
复制代码 - 作用: 指定与该运动干系联的Java类。
1.2.2 android:label
- 形貌: 为运动提供一个标签,通常表现在运动的标题栏中。可以是一个字符串资源或直接的字符串。
- 示例:
- <activity android:name=".MainActivity" android:label="@string/app_name" />
复制代码 - 作用: 提供用户可读的运动名称。
1.2.3 android:icon
- 形貌: 为运动提供一个图标,可以是一个资源引用。
- 示例:
- <activity android:name=".MainActivity" android:icon="@drawable/ic_launcher" />
复制代码 - 作用: 在某些界面,如迩来任务列表中表现运动的图标。
1.2.4 android:theme
- 形貌: 为运动指定一个主题,可以是一个资源引用。
- 示例:
- <activity android:name=".MainActivity" android:theme="@style/AppTheme" />
复制代码 - 作用: 界说运动的外貌和风格。
1.2.5 android:exported
- 形貌: 指示运动是否可以被其他应用启动。假如未指定,默认值取决于 <intent-filter> 的存在与否。假如有 <intent-filter>,默以为 true,否则为 false。
- 示例:
- <activity android:name=".MainActivity" android:exported="true" />
复制代码 - 作用: 控制运动的可见性和安全性。
1.3 生命周期和举动属性
1.3.1 android:launchMode
- 形貌: 指定运动的启动模式,影响运动在任务栈中的加载方式。
- 参数:
- standard: 默认模式,每次启动都会创建一个新的运动实例。
- singleTop: 假如栈顶已经是该运动的实例,则复用该实例,不再创建新的实例。
- singleTask: 只允许一个实例存在,假如已存在,则将该实例移到前台,并打扫其上面的全部运动。
- singleInstance: 运动独占一个任务栈,且体系不会创建新的任务栈。
- 示例:
- <activity android:name=".MainActivity" android:launchMode="singleTop" />
复制代码 - 作用: 控制运动的实例化和复用举动。
1.3.2 android:clearTaskOnLaunch
- 形貌: 当用户重新启动任务时,是否打扫任务栈中的全部运动。
- 参数:
- true: 打扫任务栈中的全部运动,只保存根运动。
- false: 保存任务栈中的全部运动。
- 示例:
- <activity android:name=".MainActivity" android:clearTaskOnLaunch="true" />
复制代码 - 作用: 决定运动在任务重新启动时的举动。
1.3.3 android:excludeFromRecents
- 形貌: 是否将运动从迩来任务列表中清除。
- 参数:
- true: 不表现在迩来任务列表中。
- false: 表现在迩来任务列表中。
- 示例:
- <activity android:name=".MainActivity" android:excludeFromRecents="true" />
复制代码 - 作用: 控制运动是否表现在迩来任务列表中。
1.3.4 android:finishOnTaskLaunch
- 形貌: 当任务重新启动时,是否竣事该运动。
- 参数:
- true: 任务重新启动时竣事该运动。
- false: 保持运动不被竣事。
- 示例:
- <activity android:name=".MainActivity" android:finishOnTaskLaunch="true" />
复制代码 - 作用: 决定运动在任务重新启动时的举动。
13.5 android:allowTaskReparenting
- 形貌: 是否允许运动从一个任务重新归属到另一个任务。
- 参数:
- true: 允许重新归属。
- false: 不允许重新归属。
- 示例:
- <activity android:name=".MainActivity" android:allowTaskReparenting="true" />
复制代码 - 作用: 控制运动在差别任务之间的移动。
1.4 用户界面和设置属性
1.4.1 android:configChanges
- 形貌: 指定运动可以处理处罚的设置厘革,克制体系在设置厘革时重新创建运动。
- 参数:
- orientation: 屏幕方向厘革。
- keyboardHidden: 键盘可用性厘革。
- screenSize: 屏幕尺寸厘革。
- locale: 语言地域厘革。
- 等等。
- 示例:
- <activity android:name=".MainActivity" android:configChanges="orientation|screenSize" />
复制代码 - 作用: 控制运动在设置厘革时的举动。
1.4.2 android:screenOrientation
- 形貌: 指定运动的屏幕方向。
- 参数:
- unspecified: 体系决定方向。
- behind: 利用父运动的方向。
- landscape: 横向。
- portrait: 纵向。
- sensor: 根据传感器决定方向。
- user: 用户选择的方向。
- 等等。
- 示例:
- <activity android:name=".MainActivity" android:screenOrientation="portrait" />
复制代码 - 作用: 控制运动的屏幕方向。
1.4.3 android:windowSoftInputMode
- 形貌: 指定软键盘怎样调解运动的布局。
- 参数:
- adjustResize: 运动布局会调解巨细以使软键盘上方的内容可见。
- adjustPan: 运动布局会平移,使当前核心不被软键盘遮挡。
- stateVisible: 启动时软键盘表现。
- stateHidden: 启动时软键盘潜伏。
- 等等。
- 示例:
- <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize" />
复制代码 - 作用: 控制软键盘表现时运动布局的调解方式。
1.5 权限和用户选择属性
1.5.1 android:permission
- 形貌: 指定启动该运动所需的权限。
- 示例:
- <activity android:name=".MainActivity" android:permission="com.example.permission.MY_PERMISSION" />
复制代码 - 作用: 控制运动的访问权限。
1.5.2 android:taskAffinity
- 形貌: 指定运动的任务亲和性,控制运动在任务栈中的归属。
- 示例:
- <activity android:name=".MainActivity" android:taskAffinity="com.example.myapp.task" />
复制代码 - 作用: 控制运动在差别任务栈中的归属。
1.6 意图过滤器(Intent Filters)
1.6.1 <action>
- 形貌: 指定运动可以相应的意图动作。
- 示例:
- <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>
- 形貌: 指定运动的种别。
- 示例:
- <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>
- 形貌: 指定运动可以处理处罚的数据范例。
- 示例:
- <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 中,通常不须要重写这个方法。
- 处理处罚菜单项选择
- 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的实例。
- 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()方法。
- 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,然后举行范例转换。
- if (context instanceof Activity) {
- Activity activity = (Activity) context;
- }
复制代码 3.3.4 利用Application类管理Activity
为了在整个应用中方便地访问当前Activity,可以在Application类中维护一个当前Activity的引用。
起首,创建一个自界说的Application类:
- 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:
- 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类中注册这个回调:
- 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
- // 在第一个 Activity 中跳转到第二个 Activity
- Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
- startActivity(intent);
复制代码 4.2 携带数据通报到另一个 Activity
- // 在第一个 Activity 中
- Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
- intent.putExtra("key_name", "John Doe"); // 传递字符串数据
- intent.putExtra("key_age", 25); // 传递整型数据
- startActivity(intent);
复制代码 在目标 Activity 中通过 getIntent() 获取数据:
- // 在第二个 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 (发送数据)
- Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
- startActivityForResult(intent, REQUEST_CODE);
复制代码 目标 Activity (吸收并返回数据)
- Intent resultIntent = new Intent();
- resultIntent.putExtra("result_key", "Returned Data");
- setResult(RESULT_OK, resultIntent);
- finish(); // 返回原 Activity
复制代码 原 Activity (吸收返回数据)
- @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
- 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
|