Android中Activity

[复制链接]
发表于 2025-11-10 23:01:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、AndroidManifest中的<activity>标签

<activity>标签在AndroidManifest.xml文件中用于界说和设置应用中的每一个Activity。Activity是Android应用的根本构建块之一,紧张负责展示用户界面,并处理处罚用户与之的交互。每个在应用中表现给用户的界面都应被注册为一个Activity。
1.1 注册和声明运动

根本注册

在 AndroidManifest.xml 文件中,每个运动都必须在 <application> 标签内声明。比方:
  1. <application
  2.     android:icon="@mipmap/ic_launcher"
  3.     android:label="@string/app_name"
  4.     android:theme="@style/AppTheme">
  5.     <activity android:name=".MainActivity">
  6.         <intent-filter>
  7.             <action android:name="android.intent.action.MAIN" />
  8.             <category android:name="android.intent.category.LAUNCHER" />
  9.         </intent-filter>
  10.     </activity>
  11.     <activity android:name=".SettingsActivity" />
  12. </application>
复制代码
在这个例子中,MainActivity 被声明为主运动,而且会在启动器(Launcher)中表现图标。SettingsActivity 被简朴地声明,但不会在启动器中表现图标。
1.2 可以设置的属性

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

1.2.1 android:name



  • 形貌: 这是运动类的名称,可以是完备的类名大概相对于应用包的相对名称。假如利用相对名称,须要在前面加上点(.)。
  • 示例:
    1. <activity android:name=".MainActivity" />
    复制代码
  • 作用: 指定与该运动干系联的Java类。
1.2.2 android:label



  • 形貌: 为运动提供一个标签,通常表现在运动的标题栏中。可以是一个字符串资源或直接的字符串。
  • 示例:
    1. <activity android:name=".MainActivity" android:label="@string/app_name" />
    复制代码
  • 作用: 提供用户可读的运动名称。
1.2.3 android:icon



  • 形貌: 为运动提供一个图标,可以是一个资源引用。
  • 示例:
    1. <activity android:name=".MainActivity" android:icon="@drawable/ic_launcher" />
    复制代码
  • 作用: 在某些界面,如迩来任务列表中表现运动的图标。
1.2.4 android:theme



  • 形貌: 为运动指定一个主题,可以是一个资源引用。
  • 示例:
    1. <activity android:name=".MainActivity" android:theme="@style/AppTheme" />
    复制代码
  • 作用: 界说运动的外貌和风格。
1.2.5 android:exported



  • 形貌: 指示运动是否可以被其他应用启动。假如未指定,默认值取决于 <intent-filter> 的存在与否。假如有 <intent-filter>,默以为 true,否则为 false。
  • 示例:
    1. <activity android:name=".MainActivity" android:exported="true" />
    复制代码
  • 作用: 控制运动的可见性和安全性。
1.3 生命周期和举动属性

1.3.1 android:launchMode



  • 形貌: 指定运动的启动模式,影响运动在任务栈中的加载方式。
  • 参数:

    • standard: 默认模式,每次启动都会创建一个新的运动实例。
    • singleTop: 假如栈顶已经是该运动的实例,则复用该实例,不再创建新的实例。
    • singleTask: 只允许一个实例存在,假如已存在,则将该实例移到前台,并打扫其上面的全部运动。
    • singleInstance: 运动独占一个任务栈,且体系不会创建新的任务栈。

  • 示例:
    1. <activity android:name=".MainActivity" android:launchMode="singleTop" />
    复制代码
  • 作用: 控制运动的实例化和复用举动。
1.3.2 android:clearTaskOnLaunch



  • 形貌: 当用户重新启动任务时,是否打扫任务栈中的全部运动。
  • 参数:

    • true: 打扫任务栈中的全部运动,只保存根运动。
    • false: 保存任务栈中的全部运动。

  • 示例:
    1. <activity android:name=".MainActivity" android:clearTaskOnLaunch="true" />
    复制代码
  • 作用: 决定运动在任务重新启动时的举动。
1.3.3 android:excludeFromRecents



  • 形貌: 是否将运动从迩来任务列表中清除。
  • 参数:

    • true: 不表现在迩来任务列表中。
    • false: 表现在迩来任务列表中。

  • 示例:
    1. <activity android:name=".MainActivity" android:excludeFromRecents="true" />
    复制代码
  • 作用: 控制运动是否表现在迩来任务列表中。
1.3.4 android:finishOnTaskLaunch



  • 形貌: 当任务重新启动时,是否竣事该运动。
  • 参数:

    • true: 任务重新启动时竣事该运动。
    • false: 保持运动不被竣事。

  • 示例:
    1. <activity android:name=".MainActivity" android:finishOnTaskLaunch="true" />
    复制代码
  • 作用: 决定运动在任务重新启动时的举动。
13.5 android:allowTaskReparenting



  • 形貌: 是否允许运动从一个任务重新归属到另一个任务。
  • 参数:

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

  • 示例:
    1. <activity android:name=".MainActivity" android:allowTaskReparenting="true" />
    复制代码
  • 作用: 控制运动在差别任务之间的移动。
1.4 用户界面和设置属性

1.4.1 android:configChanges



  • 形貌: 指定运动可以处理处罚的设置厘革,克制体系在设置厘革时重新创建运动。
  • 参数:

    • orientation: 屏幕方向厘革。
    • keyboardHidden: 键盘可用性厘革。
    • screenSize: 屏幕尺寸厘革。
    • locale: 语言地域厘革。
    • 等等。

  • 示例:
    1. <activity android:name=".MainActivity" android:configChanges="orientation|screenSize" />
    复制代码
  • 作用: 控制运动在设置厘革时的举动。
1.4.2 android:screenOrientation



  • 形貌: 指定运动的屏幕方向。
  • 参数:

    • unspecified: 体系决定方向。
    • behind: 利用父运动的方向。
    • landscape: 横向。
    • portrait: 纵向。
    • sensor: 根据传感器决定方向。
    • user: 用户选择的方向。
    • 等等。

  • 示例:
    1. <activity android:name=".MainActivity" android:screenOrientation="portrait" />
    复制代码
  • 作用: 控制运动的屏幕方向。
1.4.3 android:windowSoftInputMode



  • 形貌: 指定软键盘怎样调解运动的布局。
  • 参数:

    • adjustResize: 运动布局会调解巨细以使软键盘上方的内容可见。
    • adjustPan: 运动布局会平移,使当前核心不被软键盘遮挡。
    • stateVisible: 启动时软键盘表现。
    • stateHidden: 启动时软键盘潜伏。
    • 等等。

  • 示例:
    1. <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize" />
    复制代码
  • 作用: 控制软键盘表现时运动布局的调解方式。
1.5 权限和用户选择属性

1.5.1 android:permission



  • 形貌: 指定启动该运动所需的权限。
  • 示例:
    1. <activity android:name=".MainActivity" android:permission="com.example.permission.MY_PERMISSION" />
    复制代码
  • 作用: 控制运动的访问权限。
1.5.2 android:taskAffinity



  • 形貌: 指定运动的任务亲和性,控制运动在任务栈中的归属。
  • 示例:
    1. <activity android:name=".MainActivity" android:taskAffinity="com.example.myapp.task" />
    复制代码
  • 作用: 控制运动在差别任务栈中的归属。
1.6 意图过滤器(Intent Filters)

1.6.1 <action>



  • 形貌: 指定运动可以相应的意图动作。
  • 示例:
    1. <activity android:name=".MainActivity">
    2.     <intent-filter>
    3.         <action android:name="android.intent.action.MAIN" />
    4.         <category android:name="android.intent.category.LAUNCHER" />
    5.     </intent-filter>
    6. </activity>
    复制代码
  • 作用: 声明运动可以相应的意图动作。
1.6.2 <category>



  • 形貌: 指定运动的种别。
  • 示例:
    1. <activity android:name=".MainActivity">
    2.     <intent-filter>
    3.         <action android:name="android.intent.action.MAIN" />
    4.         <category android:name="android.intent.category.LAUNCHER" />
    5.     </intent-filter>
    6. </activity>
    复制代码
  • 作用: 声明运动的种别,比方是否是启动器运动。
1.6.3 <data>



  • 形貌: 指定运动可以处理处罚的数据范例。
  • 示例:
    1. <activity android:name=".MainActivity">
    2.     <intent-filter>
    3.         <action android:name="android.intent.action.VIEW" />
    4.         <category android:name="android.intent.category.DEFAULT" />
    5.         <data android:scheme="http" android:host="www.example.com" />
    6.     </intent-filter>
    7. </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的实例。
  1. public class MyActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_my);
  6.         Activity currentActivity = this;
  7.     }
  8. }
复制代码
3.3.2 在Fragment中获取Activity

假如你在Fragment中须要获取宿主Activity的实例,可以利用getActivity()方法。
  1. public class MyFragment extends Fragment {
  2.     @Override
  3.     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  4.         super.onViewCreated(view, savedInstanceState);
  5.         
  6.         Activity hostActivity = getActivity();
  7.     }
  8. }
复制代码
3.3.3 通过Context获取Activity

在某些环境下,你大概只拥有一个Context对象,但须要将其转换为Activity实例。可以通过查抄Context的范例是否为Activity,然后举行范例转换。
  1. if (context instanceof Activity) {
  2.     Activity activity = (Activity) context;
  3. }
复制代码
3.3.4 利用Application类管理Activity

为了在整个应用中方便地访问当前Activity,可以在Application类中维护一个当前Activity的引用。
起首,创建一个自界说的Application类:
  1. public class MyApp extends Application {
  2.     private static Activity currentActivity;
  3.     public static Activity getCurrentActivity() {
  4.         return currentActivity;
  5.     }
  6.     public static void setCurrentActivity(Activity activity) {
  7.         currentActivity = activity;
  8.     }
  9.     @Override
  10.     public void onCreate() {
  11.         super.onCreate();
  12.     }
  13. }
复制代码
然后,在每个Activity的生命周期方法中设置当前Activity:
  1. public class MyActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_my);
  6.         
  7.         MyApp.setCurrentActivity(this);
  8.     }
  9.     @Override
  10.     protected void onDestroy() {
  11.         if (MyApp.getCurrentActivity() == this) {
  12.             MyApp.setCurrentActivity(null);
  13.         }
  14.         super.onDestroy();
  15.     }
  16. }
复制代码
3.3.5 利用ActivityLifecycleCallbacks

Android提供了ActivityLifecycleCallbacks接口,可以用来监听全部Activity的生命周期变乱,从而跟踪当前的Activity。
在自界说的Application类中注册这个回调:
  1. public class MyApp extends Application {
  2.     private Activity currentActivity;
  3.     public Activity getCurrentActivity() {
  4.         return currentActivity;
  5.     }
  6.     @Override
  7.     public void onCreate() {
  8.         super.onCreate();
  9.         
  10.         registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
  11.             @Override
  12.             public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
  13.                 setCurrentActivity(activity);
  14.             }
  15.             @Override
  16.             public void onActivityStarted(Activity activity) {
  17.                 setCurrentActivity(activity);
  18.             }
  19.             @Override
  20.             public void onActivityResumed(Activity activity) {
  21.                 setCurrentActivity(activity);
  22.             }
  23.             @Override
  24.             public void onActivityPaused(Activity activity) {}
  25.             @Override
  26.             public void onActivityStopped(Activity activity) {}
  27.             @Override
  28.             public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
  29.             @Override
  30.             public void onActivityDestroyed(Activity activity) {}
  31.         });
  32.     }
  33.     private void setCurrentActivity(Activity activity) {
  34.         currentActivity = activity;
  35.     }
  36. }
复制代码
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

  1. // 在第一个 Activity 中跳转到第二个 Activity
  2. Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
  3. startActivity(intent);
复制代码
4.2 携带数据通报到另一个 Activity

  1. // 在第一个 Activity 中
  2. Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
  3. intent.putExtra("key_name", "John Doe");  // 传递字符串数据
  4. intent.putExtra("key_age", 25);  // 传递整型数据
  5. startActivity(intent);
复制代码
在目标 Activity 中通过 getIntent() 获取数据:
  1. // 在第二个 Activity 中获取数据
  2. Intent intent = getIntent();
  3. String name = intent.getStringExtra("key_name");
  4. int age = intent.getIntExtra("key_age", 0);  // 默认值为 0
复制代码
4.3 从一个 Activity 返回数据到另一个 Activity

假如你须要从目标 Activity 返回数据到原 Activity,可以利用 setResult() 和 startActivityForResult():
原 Activity (发送数据)

  1. Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
  2. startActivityForResult(intent, REQUEST_CODE);
复制代码
目标 Activity (吸收并返回数据)

  1. Intent resultIntent = new Intent();
  2. resultIntent.putExtra("result_key", "Returned Data");
  3. setResult(RESULT_OK, resultIntent);
  4. finish();  // 返回原 Activity
复制代码
原 Activity (吸收返回数据)

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.     super.onActivityResult(requestCode, resultCode, data);
  4.     if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
  5.         String result = data.getStringExtra("result_key");
  6.         // 处理返回的数据
  7.     }
  8. }
复制代码
4.5 启动 Activity 并返回数据(Jetpack 保举)

利用 ActivityResultContracts 是 Jetpack 保举的新 API,取代了 startActivityForResult():
在原 Activity 中利用 ActivityResultContracts

  1. ActivityResultLauncher<Intent> startActivityForResult = registerForActivityResult(
  2.     new ActivityResultContracts.StartActivityForResult(), result -> {
  3.         if (result.getResultCode() == RESULT_OK) {
  4.             Intent data = result.getData();
  5.             String resultData = data.getStringExtra("result_key");
  6.             // 处理返回的数据
  7.         }
  8.     });
  9. // 发起跳转
  10. Intent intent = new Intent(this, SecondActivity.class);
  11. startActivityForResult.launch(intent);
复制代码
原文泉源

以上内容紧张参考了以下文章:
原文链接:Android 中,Activity & Fragment:怎样举行界面跳转、数据通报等 — 少说多做343
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表