Training--停止和重启一个Activity

停止和重启一个Activity

 

合理地停止和重启你的activity在activity生命周期中是比较重要的部分,这样可以保证你的用户觉得你的app一直是存活的,而且不会丢失他们的操作。有几个关键的场景,在这些场景里你的activity是处于停止和重启的状态:

 

1)      用户打开“最近使用的app”窗口(长按home键弹出或者别的键),从中选择进入别的app。那么你的app中的当前处于前台的activity就会进入后台,成为停止状态。如果用户返回到主屏幕的应用列表,点击你的应用图标或者在“最近使用的app”窗口选择你的应用,那么刚才的activity就会重启。

 

2)      用户在你的app里进行了某个操作去打开另一个activity。当第二个activity创建的时候,当前的activity就会进入停止状态。如果用户点击后退按钮,第一个activity就会重启。

 

3)      当用户正在使用你的app时收到一个来电。

 

Activity类提供两个生命周期方法,onStop()和onRestart(),分别处理activity的停止和重启。暂停状态下,activity只是部分可见,与此不同的是,处于停止状态的activity是完全不可见的,而且用户的焦点完全在另外一个activity上(或者是另一个不同的app)。

 

注意:因为当activity处于停止的时候,系统仍会在系统内存中保留activity实例,所以你可能不需要实现onStop()和onRestart()方法(甚至也不用实现onStart()方法)。对于绝大多数相对简单的activity,activity的停止和重启都会运行的很好,你可能只需要实现onPause()来暂停一些正在进行的动作,或者断开一些系统资源的连接。

 

Figure 1. 当用户离开你的activity, 系统调用 onStop() 去停止activity (1).如果用户返回到处于停止状态的activity, 系统调用 onRestart() (2), 紧接着 onStart() (3)  onResume() (4). 注意到不管是什么情况引起的activity进入停止状态, 系统总是会在调用onStop()之前调用onPause()

 

停止你的Activity

 

当你的activity收到onStop()方法回调时,说明此activity是完全不可见了,所以应该释放所有用户不再需要的资源。一旦你的activity进入了停止状态,系统可能在恢复系统内存的时候销毁你的activity。在极端情况下,系统可能只是简单地杀掉你的app所在的进程,而不会调用activity的最终回调方法onDestroy(),所以重要的是你应该在onStop()中释放资源,以免导致内存泄漏。

 

尽管onPause()会在onStop()之前调用,你应该把那些CPU密集型的大任务量的工作放在onStop()里执行,例如保存信息到数据库。

 

例如,下面的例子就是在onStop()里保存一篇备注的草稿到永久存储区里:

 

@Override
protected void onStop() {
    super.onStop();  // 首先调用基类的方法 

    // 保存当前备注的草稿, 
    //因为activity正在被停止,我们希望保存当前草稿不至于丢失.
    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()回调。系统也会调用onStart()方法,当你的activity变为可见的时候(无论是重启还是第一次创建)。但是,onRestart()方法只有在你的activity是从停止状态中恢复的时候才会被调用,所以也许在activity之前是停止状态,但并未销毁,而后恢复至运行状态时,你可以在这个回调里作一些特别的恢复工作。

 

在onRestart()方法里恢复activity的状态并不常见,所以对于使用这个方法来恢复状态并没有任何指导意见。但是,由于在onStop()方法里基本上清理了所有的activity资源,所以你需要在activity重启的时候重新初始化它们。当然了,你同样需要在第一次创建activity的时候初始化它们(当之前未存在此activity实例时)。基于这个理由,你应该使用onStart()方法作为onStop()的对等配对方法,因为无论你是初次创建activity还是从停止状态中重启activity,系统都会调用onStart()方法。

 

例如,当用户长时间离开你的app,然后返回时,检查某些必需的系统功能是否开启时,onStart()方法就是最好的检测地方:

@Override
protected void onStart() {
    super.onStart();  // 始终首先调用基类方法
    
    // 此activity被重启或者第一次创建
    // 我们可以在这里检查一下GPS是否可用
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
        // 创建一个对话框要求用户开启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时,它会调用你的onDestroy()方法。因为你已经使用onStop()方法做了大部分的清理工作,而此时你可能不需要做什么工作了。这个方法是你清理资源的最后机会,所以你应该保证额外的线程已经被销毁了,其他长时间运行的操作比如方法追踪等都已经被停止了。

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值