停止并重新开始Activity

正确停止和重新开始Activity是Activity生命周期中的重要过程,其可确保您的用户知晓应用始终保持Activity状态并且不会丢失进度。有几种Activity停止和重新开始的关键场景:

  • 用户打开“最近应用”窗口并从您的应用切换到另一个应用。当前位于前台的您的应用中的Activity将停止。 如果用户从主屏幕启动器图标或“最近应用”窗口返回到您的应用,Activity会重新开始。
  • 用户在您的应用中执行开始新Activity的操作。当第二个Activity创建好后,当前Activity便停止。 如果用户之后按了返回按钮,第一个Activity会重新开始。
  • 用户在其手机上使用您的应用的同时接听来电。

Activity 课程提供两种生命周期方法:onStop()onRestart(),这些方法允许您专门处理正在停止和重新开始的Activity。 不同于识别部分 UI 阻挡的暂停状态,停止状态保证 UI 不再可见,且用户的焦点在另外的Activity(或完全独立的应用)中。

注意:因为系统在停止时会将您的 Activity 实例保留在系统内存中,您根本无需实现 onStop()onRestart()或甚至onStart() 方法。对于大多数相对简单的Activity而言, Activity将停止并重新开始,并且您可能只需使用 onPause() 暂停正在进行的操作,并从系统资源断开连接。

图 1.用户离开Activity时,系统会调用 onStop() 停止Activity(1)。 如果用户在Activity停止时返回,系统会调用 onRestart() (2),紧接着调用 onStart() (3) 和 onResume() (4)。 注意:无论什么场景导致Activity停止,系统始终会在调用 onStop() 之前调用 onPause()

停止Activity



当您的Activity收到 onStop() 方法的调用时,它不再可见,并且应释放几乎所有用户不使用时不需要的资源。 一旦您的Activity停止,如果需要恢复系统内存,系统可能会销毁该实例。 在极端情况下,系统可能会仅终止应用进程,而不会调用Activity的最终 onDestroy() 回调,因此您使用 onStop() 释放可能泄露内存的资源非常重要。

尽管 onPause() 方法在 onStop()之前调用,您应使用 onStop() 执行更大、占用更多 CPU 的关闭操作,比如向数据库写入信息。

例如,此处是将草稿笔记内容保存在永久存储中的 onStop() 的实现:

@Overrideprotected void onStop() {    super.onStop();  //总是先调用父类的方法

    // 保存该说明的当前草案,因为该活动正在停止    // 我们要确保当前的进展没有失去。    ContentValues values = new ContentValues();    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(            mUri,    // The URI for the note to update.            values,  // The map of column names and new values to apply to them.            null,    // No SELECT criteria are used.            null     // No WHERE columns are used.            );}

当您的Activity停止时, Activity 对象将驻留在内存中并在Activity继续时被再次调用。 您无需重新初始化在任何导致进入“继续”状态的回调方法过程中创建的组件。 系统还会在布局中跟踪每个 View 的当前状态,如果用户在 EditText 小工具中输入文本,该内容会保留,因此您无需保存即可恢复它。

注意:即使系统在Activity停止时销毁了Activity,它仍会保留 Bundle(键值对的二进制大对象)中的 View 对象(比如 EditText 中的文本),并在用户导航回Activity的相同实例时恢复它们 (下一堂课 讲述更多有关在您的Activity被销毁且重新创建的情况下使用 Bundle 保存其他数据状态的知识)。

开始/重新开始Activity



当您的Activity从停止状态返回前台时,它会接收对 onRestart() 的调用。系统还会在每次您的Activity变为可见时调用 onStart() 方法(无论是正重新开始还是初次创建)。 但是,只会在Activity从停止状态继续时调用 onRestart() 方法,因此您可以使用它执行只有在Activity之前停止但未销毁的情况下可能必须执行的特殊恢复工作。

应用需要使用 onRestart() 恢复Activity状态的情况并不常见,因此没有适用于一般应用群体的任何方法指导原则。 但是,因为您的 onStop() 方法应基本清理所有Activity的资源,您将需要在Activity重新开始时重新实例化它们。 但是,您还需要在您的Activity初次创建时重新实例化它们(没有Activity的现有实例)。 出于此原因,您应经常使用 onStart() 回调方法作为 onStop() 方法的对应部分,因为系统会在它创建您的Activity以及从停止状态重新开始Activity时调用 onStart()

例如,因为用户可能在回到它之前已离开应用很长时间, onStart() 方法是确认所需系统功能已启动的理想选择:

@Overrideprotected void onStart() {    super.onStart();  // Always call the superclass method first        // The activity is either being restarted or started for the first time    // so this is where we should make sure that GPS is enabled    LocationManager locationManager =             (LocationManager) getSystemService(Context.LOCATION_SERVICE);    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);        if (!gpsEnabled) {        // Create a dialog here that requests the user to enable GPS, and use an intent        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action        // to take the user to the Settings screen to enable GPS when they click "OK"    }}

@Overrideprotected void onRestart() {    super.onRestart();  // Always call the superclass method first        // Activity being restarted from stopped state    }

当系统销毁您的Activity时,它会调用您的 ActivityonDestroy() 方法。因为您通常应已使用 onStop() 释放大多数您的资源,到您接收对 onDestroy() 的调用时,大多数应用无需做太多操作。 此方法是您清理可导致内存泄露的资源的最后一种方法,因此您应确保其他线程被销毁且其他长期运行的操作(比如方法跟踪)也会停止。

时间: 2024-11-06 06:56:23

停止并重新开始Activity的相关文章

Android官方入门文档[14]停止和重新启动一个Activity活动

Android官方入门文档[14]停止和重新启动一个Activity活动 Stopping and Restarting an Activity停止和重新启动一个Activity活动 This lesson teaches you to1.Stop Your Activity2.Start/Restart Your Activity You should also read?Activities 这节课教你1.停止您的Activity活动2.启动/重新启动您的Activity活动 你也应该阅读?

3.3 停止和重启 Activity

正确停止和重启 Activity 是 Activity 生命周期中的重要过程,其可确保您的用户知晓应用始终保持活跃状态并且不会丢失进度.Activity 停止和重启的场景主要有以下几种: 用户打开"最近应用"窗口并从您的应用切换到另一个应用.您的应用中当前位于前台的 Activity 将停止. 如果用户从主屏幕启动器图标或"最近应用"窗口返回到您的应用,将会重启 Activity. 用户在您的应用中执行开始新 Activity 的操作.当第二个 Activity 创

Android的Activity组件

本章主题是Activity组件:Activity是Android四大组价之一,其重要地位自然不用说."Activity是应用程序中可见的交互组件的基类,大致上等同于传统桌面应用个程序开发中的窗体."(引自---<Android 4 高级编程>) 每一个Activity都表示一个屏幕,应用程序会把它呈现给用户.应用程序越复杂,需要的屏幕可能就越多.典型情况下,这至少包括一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一把由许多Fragment组成,并且通常由一组次要A

Activity的生命周期

Android学习之Activity的生命周期 Android应用程序的不能自己控制他们自己的进程,但是Android运行时可以管理每个进程.因此正确的理解Activity的生存期,对于保证用户有个良好的体验有着很大的帮助. 1. Activity栈及状态 Activity栈是当前正在运行的所有Activity后进先出的集合.新启动的Activity始终在栈顶.Activity有四种种状态. 活动状态   当Activity处于栈顶,也就是Activity是可见的,具有焦点的Activity,此

Android四大基本组件(1)之Activity与BroadcastReceive广播接收器

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.Activity (1)应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. (2)Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. (3)典型的动作类型有:M AIN(activity的门户).VIE

Android笔记(五十八)Android总结:四大组件——Activity篇

什么是Activity Activity是一种包含用户界面的组件,主要用于和用户进行交互,一个APP通常由多个Activity组成. 每个Activity都对应一个布局文件,通过setContentView()方法来载入布局文件.并且通过用户对布局文件中的组件所发出的事件来做出相应的反映. Activity的四种状态 1)激活状态,此时activity运行在屏幕前台 2)暂停状态,此时activity失去焦点,但是用户仍然可以看到(例如这个activity上遮盖了一个透明的或者非全屏的activ

深入剖析Android四大组件(一)——Activity生命周期详解

1.管理Activity的生命周期 无论是正在运行的Activity还是没有运行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的3种状态 通过回调方法来管理Activity的生命周期对于开发一个健壮并且灵活的应用程序是非常关键的.Activity的生命周期直接影响到它与其他Activity,任务以及栈的关系. Activity存在3种状态,分别是resumed,paused和stopped. resumed:指Activi

Activity生命周期的通俗理解

一般一个Activity有三种状态: 1.在屏幕上是可见的且可操作的,他是活跃或运行状态,负责响应用户操作. 2.失去焦点但仍然可见时,他处于暂停状态.也就是说未被完全遮蔽,所以该Activity仍对用户可见,但是当系统处于繁忙的时候下,有肯会杀死该Activity. 3.完全被另一个Activity覆盖时处于停止状态.也有可能被杀死. Activity生命周期中各方法的调用情况 1.onCreate(Bundle savedStatus):第一次创建时调用,只调用一次. 2.onStart()

Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)

一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Activity,例如以下设置 <actionandroid:name="android.intent.action.MAIN" /> 当程序第一次执行时用户就会看这个Activity,这个Activity能够通过启动其它的Activity进行相关操作.当启动其它的Activity