android 重新启动应用程序,Android应用开发初级教程 第二节之三 停止和重新启动一个活动...

Android应用开发初级教程 第二节 管理活动的生命周期

三 停止和重新启动一个活动

适当停止和重新启动你的活动是活动生命周期的一个重要流程,确保用户感知到应用程序总是活着,没有失去他们的进程。在你的活动停止和重新启动时有几个情节是关键的:

◇用户打开最新的应用程序窗口,和从你的应用程序切换到另一个应用程序时,你的应用程序的活动目前在前台是停止。如果用户从主屏幕发射器的图标或最近的应用程序窗口返回应用程序,该活动将重新启动。

◇用户执行你的应用程序中的一个动作开启一个新活动。当前活动停止并创建第二个活动。如果用户按下后退按钮,第一个活动就重新启动。

◇在使用你的应用程序时用户收到一个电话。

Activity类提供了onStop()和onRestart()这两个生命周期方法,它允许您专门处理活动如何处理停止并重新启动。不象暂停状态其标识是UI界面是部分被遮盖,停止状态要保证UI不再是可见,用户的重点是在一个单独的活动(或一个完全独立的应用程序)。

注意:由于停止时系统在内存中保留你的活动的实例,你也许根本不需要实现onStop()和onRestart(),甚至onStart()方法。对于大多数相对简单活动,活动停止并重启就行,你可能只需要使用onPause()暂停正在进行的动作和断开系统资源。

a4c26d1e5885305701be709a3d33442f.png

图2-3。 当用户离开你的活动,系统调用onStop()(1)停止活动。当活动停止时用户要返回,系统调用onRestart()(2),紧接着onStart()(3)和onResume()(4)。请注意,无论什么情况导致活动停止,系统总是在调用onStop()之前调用onPause()。

1 停止你的活动

当你的活动收到onStop()方法的回调,它不再是可见的和应该释放几乎所有资源,它们是用户不使用和不需要的。一旦你的活动停止,如果需要恢复系统内存系统可能会摧毁实例。在极端的情况下,系统会在没有调用活动的finai

onDestroy()方法的情况下简单地杀死进程。所以,重要的是你要使用onStop()来释放可能会泄漏内存的资源。

尽管在调用onStop()之前onPause()方法被调用,您也应该使用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.

);

}

当你停止活动时活动对象是一直驻留在内存的,恢复时召回活动。为恢复之前的状态,你不需要再初始化在任何回调方法中创建的组件。该系统还跟踪布局中的每个视图的当前状态,因此,如果用户输入文本到一个EditText部件,该内容被保留,这样你不需要保存和恢复它。

注意:即使系统在活动停止时销毁了你的活动虽,它仍然在包Bundle中保留视图对象的状态(例如文本在一个EditText),(键-值对的一个blob)如果用户导航回到恢复活动的相同实例就恢复它们。(下节课会更多论及关于使用Bundle保存其他状态数据,以防你的活动被销毁重新创建)。

2 启动和重新启动活动

当你的活动从停止状态回到前台,它接收onRestart()回调。系统也调用onStart()方法,每一次遇到它你的活动就变得可见(无论是重启还是第一次创建)。但是,只有当活动从停止状态回返时,才调用onRestart()方法。所以,你可以使用它来执行特殊的修复工作,这项工作可能只有在前面的活动停了下来而不是被摧毁时才是需要的。

应用程序需要使用onRestart()来恢复活动状态是不常见的,所以没有任何指导方法可适用于一般人群的应用。然而,因为onStop()方法本来就要清理活动的所有资源,然而,当活动重启动时你还需要实例化它们(如果不存在现有活动的实例)。出于这个原因,你通常应该使用onStart()回调方法来对应onStop()方法,因为当你从停止状态创建活动和重启活动时,系统调用onStart()。

例如,因为用户可能在回来之前已经离开你的应用程序很长一段时间,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 }

当系统要摧毁你的活动时调用onDestroy()方法。因为一般你应该用onStop()释放大部分资源,没用几个应用程序需要在调用onDestroy()是做这些事情,这种方法是你清理可能导致内存泄漏的资源的最后一次机会,所以你应该确保摧毁额外的线程和其他的长期方法,如追踪等这样的操作也停止掉。

——完——

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值