Android | Activity

Android Activity

Activity 概念

Activity 是一种包含用户界面、主要用于与用户进行交互的Android应用组件。一个应用程序可以包含零个或多个 Activity

Activity 生命周期

在这里插入图片描述

Activity 类中定义了7个回调方法,覆盖了 Activity 生命周期的每一个环节。

  • onCreate() : 创建,这个方法在 Avtivity 第一次创建时被调用,在这个方法中完成像加载布局、绑定事件等 Activity 的初始化操作。
  • onStart() : 开始,这个方法在 Activity 由不可见变为可见时调用,此时Activity 尚未出现在前台,不能进行交互。
  • onResume() : 活动,这个方法在 Activity 准备好和用户进行交互的时候调用。此时的 Activity 一定位于返回栈的栈顶,并且处于运行状态.
  • onPause() : 暂停,这个方法在系统准备去启动或者恢复另一个 Activity 的时候调用。此时 Activity 仍然可见,但无法交互。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶 Activity 的使用。
  • onStop() : 停止,这个方法在 Activity 完全不可见的时候调用。它和 onPause() 方法的主要区别在于,如果启动的新 Activity 是一个对话框式的 Activity ,那么 onPause() 方法会得到执行,而 onStop() 方法并不会执行。
  • onDestroy() : 销毁,这个方法在 Activity 被销毁之前调用,之后 Activity 的状态将变为销毁状态。
  • onRestart() : 重启,这个方法在 Activity 由停止状态变为运行状态之前调用,也就是 Activity 被重新启动了。

除了 onRestart 之外的六个方法均是两两相对,按照这种形式可以将 Activity 划分为3种生存期。

  • 完整生存期 :ActivityonCreate() 方法和 onDestroy() 方法之间所经历的就是完整生存期。一般情况下,一个 Activity 会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法中完成释放内存的操作。
  • 可见生存期 :ActivityonStart() 方法和 onStop() 方法之间所经历的就是可见生存期。在可见生存期内,Activity 对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。
  • 前台生存期 :ActivityonResume() 方法和 onPause() 方法之间所经历的就是前台生存期。在前台生存期内,Activity 总是处于运行状态,此时的 Activity 是可以和用户进行交互的,我们平时看到和接触最多的就是这个状态下的 Activity

常见的生命周期变化有以下几种,其中Activity A是MainActivity。

  • Activity A 第一次被创建 :onCreate() -> onStart() -> onResume()
  • Activity A 跳转至 Activity B 时,Activity A 的变化:onPause() -> onStop()
  • Activity B 返回 Activity A 时,Activity A 的变化:onRestart() -> onStart() -> onResume()
  • Activity A 打开一没有遮挡全部界面的弹窗,Activity A 的变化:onPause()
  • 将上述弹窗关闭,Activity A 的变化:onResume()
  • Activity A 中按下 BACK 按钮:onPause() -> onStop() -> onDestroy()
  • Activity A 中按下 HOME 按钮,并从桌面再次返回 Activity AonPause() -> onStop() -> onRestart() -> onStart() -> onResume()
  • Activity A 中执行 finish() 方法:onDestroy()

当一个Activity进入了停止状态,是有可能被系统回收,就可能造成上一个页面的临时数据与状态丢失,使用 onSaveInstanceState() 回调方法可以避免这种情况,这个方法可以保证在 Activity 被回收之前一定会被调用。

正常情况下,切换横竖屏后,Activity 会被销毁并重新创建,正常情况下会重新走一遍生命周期:onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()。也可以通过在 AndroidManifest 中配置 android:configChanges = "orientation | screenSize" 来避免重新走一遍生命周期,配置后切屏只会执行 onConfigurationChanged() 方法。

Activity 启动模式

Android中的 Activity 是可以层叠的。我们每启动一个新的 Activity ,就会覆盖在原 Activity 之上,然后点击 BACK 键会销毁最上面的 Activity ,下面的一个 Activity 就会重新显示出来。Android是使用任务 Task 来管理 Activity 的,一个任务就是一组存放在栈里的 Activity 的集合,这个栈也被称作返回栈Back Stack。在默认情况下,每当我们启动了一个新的 Activity ,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下 BACK 键或调用 finish() 方法去销毁一个 Activity 时,处于栈顶的 Activity 就会出栈,前一个入栈的 Activity 就会重新处于栈顶的位置。系统总是会显示处于栈顶的 Activity 给用户。

返回栈

应该根据特定的需求为每个 Activity 指定恰当的启动模式,共有四种启动模式,可以在 AndroidManifest.xml 中通过给 <activity> 标签指定 android:launchMode 属性来选择启动模式。

  • standard : 默认的启动模式,不显式指定则默认使用。在 standard 模式下,每当启动一个新的 Activity ,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard 模式的 Activity,系统不会在乎这个 Activity 是否已经在返回栈中存在,每次启动都会创建一个该 Activity 的新实例,同一个 Activity 可以被实例化多次。
  • singleTop : 如果当前返回栈的顶部不存在该 Activity ,则新建该 Activity 并放入栈顶,所以不在栈顶的 Activity 还是会被多次创建;如果当前返回栈的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent ,不创建该 Activity 的新实例。
  • singleTask : 如果 singleTask 模式指定了不同的 taskAffinity ,会启动一个新的返回栈。假设在 AndroidManifest.xml 中给 <activity> 标签指定 android:taskAffinity="com.android.task" ,如果 com.android.task 返回栈不存在,系统会新建新的返回栈,然后再创建该 Activity A 的实例将其压入返回栈中;如果 com.android.task 返回栈存在,而且返回栈中没有该 Activity A ,则新建 Activity A 并放入栈顶;如果 com.android.task 返回栈存在,而且返回栈中已经有该 Activity A ,则如果发现已经存在该 Activity 则直接使用该实例,并把在这个 Activity 之上的所有其他 Activity 统统出栈,如果没有发现就会创建一个新的 Activity 实例。如果只是指定了 android:taskAffinity 属性,但是启动模式没有指定为 singleTask 模式,新启动的 Activity 依然会在原来的返回栈中。
  • singleInstance : singleTask 的升级版,创建 singleInstance 启动模式的 Activity 时,系统都会直接创建一个新的返回栈并创建 Activity 的新实例置于新 Task 返回栈中。之后系统不会将任何其他 Activity 的实例放入这个新建的 Task 中,该 Activity 始终是其 Task 唯一仅有的成员,一旦该模式的 Activity 实例已经存在于某个栈中,任何应用再激活该 Activity 时都会重用该栈中的实例。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android上重启一个Activity,可以使用 Intent 和 finish() 方法。 例如: ``` Intent intent = new Intent(CurrentActivity.this, CurrentActivity.class); finish(); startActivity(intent); ``` 首先,创建一个新的 Intent 对象,并将当前 Activity 作为上下文传入。 然后调用 finish() 方法结束当前 Activity,最后调用 startActivity(intent) 方法重新启动该 Activity。 ### 回答2: 在Android中,可以通过以下几种方式来重启Activity。 1. 使用Intent重新启动Activity:可以通过创建一个新的Intent对象,并将原Activity的类名和其他需要传递的数据传递给新的Intent,然后调用startActivity()方法来启动新的Activity,并使用finish()方法来销毁原Activity。 2. 使用FLAG_ACTIVITY_CLEAR_TOP标志重新启动Activity:可以在Intent中设置FLAG_ACTIVITY_CLEAR_TOP标志,然后调用startActivity()方法来启动新的Activity。这个标志会检查Activity的任务栈,如果需要启动的Activity已经在任务栈中存在,那么会将该Activity之上的所有Activity都销毁掉,然后重用已存在的Activity,并将其置于栈顶。 3. 使用Recreate()方法重启Activity:在Android 3.0及以上版本中,可以通过调用Activity的recreate()方法来重启Activity。这个方法会销毁当前的Activity,然后重新创建一个新的Activity,并将其置于栈顶。 需要注意的是,以上这些方法都会导致Activity的生命周期方法被重新调用,如onCreate()、onStart()、onResume()等,所以在处理重启逻辑时,需要注意保存和恢复Activity的状态。 另外,可以根据具体的需求选择合适的重启方式,如是否需要传递数据、是否需要清空任务栈等。根据不同的场景,选择合适的方法可以更好地实现Activity的重启功能。 ### 回答3: 在Android中,我们可以通过调用`startActivity()`方法来启动一个新的Activity。当我们希望重新启动当前Activity时,有以下几种常见的方法。 1. 使用`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志: 通过在启动新Activity时设置`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志,我们可以清除当前Activity之上的所有Activity。这样,在新的Activity启动后,原来的Activity会被销毁并被新的Activity覆盖。代码如下: ```java Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish(); ``` 2. 使用`Intent.FLAG_ACTIVITY_NEW_TASK`标志: 通过在启动新的Activity时设置`Intent.FLAG_ACTIVITY_NEW_TASK`标志,我们可以在新的任务栈中启动新的Activity。这样,原来的Activity会被销毁,并且返回到主界面,而新的Activity将会在新的任务栈中启动。代码如下: ```java Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); ``` 3. 通过重新启动Activity: 通过重新调用`onCreate()`方法和`onStart()`方法,我们可以重新启动当前Activity。代码如下: ```java Intent intent = getIntent(); finish(); startActivity(intent); ``` 以上是三种常见的Android重启Activity的方法,开发者可以根据具体的需求选择合适的方法来实现重启。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值