`

停止和重新启动一个Activity(翻译)

 
阅读更多

停止和重新启动一个Activity

合适的停止和重新启动你的Activity是你的Activity生命周期中的重要的过程,从而使得你的用户感觉你的app是一直活着的,并且不会丢失他们的进度。有一些关键的场景,你的Activity会被停止和重新启动。

  • 用户打开最近使用app的窗口,并且从你的app切换到另一个app。你的app中当前正在前台运行的Activity会被停止,如果用户从主屏幕登陆图标或最近使用app窗口返回你的app,Activity被重新启动。
  • 用户在你的app中执行一个动作启动一个新的Activity。当第二个Activity被创建的时候当前的Activity被停止。如果用户之后按返回按钮,第一个Activity被重新启动。
  • 当在电话上使用你的app时用户接到一个电话。

Activity类提供两个生命周期方法,onStop()和onRestart(),这允许你明确你的Activity如何处理被停止和被重新启动。不像暂停状态,暂停状态是明确部分UI被遮掩,停止状态保证UI不再可见并且用户的关注点在别的Activity上(或者完全是另一个app)。

注意:因为当Activity停止时系统在系统内存中保持你的Activity实例,可能你完全不需要实现onStop()和onRestart()(或者甚至是onStat()方法)方法。对于大多数相对简单的Activity来说,Activity能很好的停止和重新启动,并且你也许只需要使用onPause()方法来暂停正在执行的动作和从系统资源断开。

 停止你的Activity

当你的Activity收到一个onStop()方法的调用时,它将不再可见并且应该释放几乎所有当用户不使用它时不需要的资源。一旦你的Activity被停止了,系统可能会销毁这个实例当它需要释放系统内存时。在极端的情况下,系统可能简单的杀掉你的app进程,而不调用Activity最终的onDestroy()回调函数,因此使用onStop()方法来释放资源很重要,因为可能泄露内存。

尽管onPause()方法在onStop()方法之前被调用,你应该使用onStop()方法执行更大的,更加CPU密集型的关闭操作,比如写信息到数据库。

例如,这里有一个onStop()的实现,将笔记草稿的内容保存到永久性存储中。

@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    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被重新启动后被找回。你不需要重新初始化那些在Resumed状态之前所调用的回调方法中创建的组件。系统也会保持当前布局中各个视图View的当前状态的跟踪,因此如果用户在EditText组件中输入文本,内容会被保存,因此你不需要去保存和恢复它。

注意:即使当处于Stopped状态时系统销毁了你的Activity,系统仍然在一个Bundle(一个保存键值对的二进制文件)中保存着视图对象的状态(比如文本框中的文本),并且在用户导航回同样的Activity实例时恢复它们(下一课将讨论更多关于在你的Activity被销毁和重新创建时使用一个Bundle来保存其他状态数据的内容)。

启动和重新启动你的Activity

当你的Activity从Stopped状态回到前台运行,它会被调用onRestart()方法。系统也会调用onStart()方法,这会发生在每次你的Activity变得可见时(不管是被重新启动还是被首次创建)。然而,onRestart()方法只在Activity从Stopped状态被重新启动时才会被调用,因此你可以使用它来执行一些特殊的恢复工作,这些工作可能只在Activity原来只是被停止,而没有被销毁时才是需要的。

一个app需要使用onRestart方法来恢复Activity状态是不常见的,因此没有任何关于这个方法的指南适用于普通的app。然而,因为你的onStop()方法本应该清除你的Activity所有的资源,在Activity重新启动时你会需要重新初始化它们。然而,当你的Activity在首次创建时(当还不存在Activity的实例时)你也需要初始化它们。因为这个原因,你应该使用onStart()回调方法作为onStop()方法的配对,因为系统在当它第一次创建你的Activity时和当它从Stopped状态重新启动你的Activity时都会调用onStart()方法。

举个例子,因为用户在回来之前可能已经长时间的离开你的app,onStart()方法是一个好地方来验证需要的系统特性是否使能了。

@Override
protected 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"
    }
}

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

 当系统要销毁你的Activity,它会为你的Activity调用onDestroy()方法。因为你通常应该在onStop()方法中释放你的大多数资源,当你收到onDestroy方法时,大多数app都不需要做什么。这个方法是你的最后机会来清除资源,从而避免资源泄露,因此你应该确保那些额外的线程已经被销毁了,并且其他长时间的动作比如方法跟踪也被停止了。

  • 大小: 45.6 KB
分享到:
评论

相关推荐

    同时启动两个Activity测试

    在描述中提到的“activity生命周期”,当Activity启动和销毁时,它会经历一系列的生命周期回调方法,例如onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等。当同时启动两个Activity时,第一...

    动态设置启动的第一个activity

    总结来说,动态设置启动的第一个Activity是Android应用开发中的一个高级技巧,它涉及到对AndroidManifest.xml的动态操作以及Intent的管理,可以极大地增强应用的灵活性和用户体验。开发者在使用这项技术时需要注意...

    Android 一次启动多个Activity (TaskStackBuilder)

    一个任务是一个可以包含多个Activity的容器,它们按照添加的顺序形成一个回退栈。用户可以通过按设备上的返回键从栈顶Activity回退到栈中的前一个Activity,直到任务被清空或者用户手动关闭应用。 TaskStackBuilder...

    Android利用Intent启动和关闭Activity

    【Android Intent 启动和关闭Activity】 在Android应用程序开发中,Intent是连接各个组件(如Activity、Service等)的关键桥梁,主要用于启动和关闭Activity。Intent不仅能够启动一个新的Activity,还能在Activity...

    实现启动和关闭Activity

    理解如何启动和关闭Activity是每个Android开发者必须掌握的关键技能。本篇将深入探讨如何在Android环境中有效地管理Activity的生命周期。 首先,我们从Activity的启动说起。启动一个Activity主要通过Intent对象来...

    从application启动activity

    在Android应用开发中,"从application启动activity"是常见的操作,涉及到Android系统的基本架构和生命周期管理。Application类是每个Android应用程序的基类,它在应用程序的生命周期中扮演着核心角色,而Activity是...

    在一个Activity中更新操作另一个Activity的内容

    总的来说,Android系统提供了多种方式来实现在一个Activity中更新另一个Activity的内容,但共享Handler和使用BroadcastReceiver是最常见的两种。共享Handler虽然可以直接通信,但增加了耦合度和潜在的内存问题。相比...

    Android receiver 多次启动相同Activity

    当我们创建一个BroadcastReceiver并注册它来监听特定的广播时,可能会遇到一个问题:在某些情况下,BroadcastReceiver可能会多次启动相同的Activity。这种情况通常是由于对广播的处理不当或者对Android生命周期理解...

    042集-跨进程启动Activity和设置Activity多个入口

    其次,关于Activity的多个入口点,这意味着可以从不同的起点启动同一个Activity。在AndroidManifest.xml文件中,我们可以通过定义多个<activity>标签,每个标签拥有不同的来实现。例如,可以为一个Activity添加...

    Activity生命周期与启动模式

    6. **重新启动(Restarted)**:如果已停止的Activity重新变得可见,系统会先调用`onStart()`,然后是`onResume()`。 7. **销毁(Destroyed)**:当Activity不再需要或者系统资源紧张时,`onDestroy()`会被调用,...

    TextView中文字超链接,点击启动另一个Activity 源码

    总结来说,实现TextView中的文字超链接并点击启动另一个Activity,主要涉及`android:autoLink`属性、`SpannableString`、`URLSpan`和自定义Intent。通过这种方式,我们可以灵活地控制文本中链接的行为,满足各种业务...

    Activity启动和退出动画

    当我们谈论Activity的启动和退出动画,我们实际上是在讨论如何通过自定义动画来增强用户体验,使应用更具吸引力。Android系统允许开发者为Activity的启动和退出定义特定的动画效果,这通常涉及到视图的过渡和变换。...

    service中启动activity

    然而,Service本身并不能直接启动一个Activity,因为它们属于不同的Android组件生命周期。通常,Service启动Activity是通过发送意图(Intent)来实现的。 **一、Service启动Activity的基本流程** 1. **创建Intent**:...

    启动另一个Activity并返回结果(附源码)

    在Android应用开发中,启动另一个Activity并返回结果是常见的操作,通常用于实现用户交互或数据交换。例如,从一个Activity启动相机应用拍摄照片后,我们需要获取拍摄的照片并显示在当前Activity上。这个过程就涉及...

    Activity四种启动模式

    这意味着,无论从哪个应用或任务启动这个Activity,都将进入同一个任务栈,其他Activity不能与之位于同一栈。因此,它是唯一一个可以跨应用共享的Activity,但要注意这可能会导致数据安全问题。 3. **单任务模式...

    android多个activity和一个service通信

    4. **EventBus**: EventBus是一个轻量级的消息总线库,允许Activity和Service之间松耦合地发送和接收事件。订阅者(如Activity)注册事件,发布者(如Service)发送事件,减少了显式意图的使用。这种方法灵活,但...

    如何启动另外一个应用的任意Activity

    在Android系统中,启动另一个应用的任意Activity是开发者经常遇到的操作。这涉及到Android的Intent机制,它是Android系统中实现组件间通信(IPC)的主要方式。本文将深入探讨如何通过Intent来启动其他应用的Activity...

    从一个activity跳到fragment,再从fragment跳到activity

    首先,我们来看如何从一个Activity启动Fragment。在Android中,Fragment不能直接启动,它必须嵌套在Activity中。我们可以使用FragmentManager和FragmentTransaction类来完成这一过程。以下是一个简单的示例: ```...

    Android应用:Intent打开另外一个Activity,Intent拨电话,Intent在2个Activity间传递参数

    `startActivity()`方法会启动目标Activity,并且如果当前Activity在栈顶,那么它会被暂停或停止。 接下来,我们来看看如何使用Intent拨打电话。Android提供了`ACTION_DIAL`和`ACTION_CALL`两种Intent类型来拨打电话...

Global site tag (gtag.js) - Google Analytics