Activity生命周期 之 停止和重启Acitivty

恰当的停止和重新启动你的activity,在activity的生命周期里面这个是非常重要的,这种机制可以让用户的觉得你的APP一直是在运行的,即使他不在你的程序的activity界面,但是并不会丢失这个程序的运行进度.下面是几个重要的使用场景:

  • 当用户打开最近使用的APP程序列表(长按HOME按键),这个时候用户选择一个APP,那么用户就由你的APP转移进入到另外一个APP里面,你的APP将不再前台运行,而当用户再次打开最近使用的程序列表,选择打开你的APP的时候,这个时候你的APP又重新启动了。
  • 当用户在你的应用上进行一个操作,启动了另外一个新的Activity(一个APP里面是可以有多个activity的,每个activity都是一个展示界面,展现不同视图),这个时候你当前的activity就进入了stopped状态,当点击返回键的时候,这个activity又重新启动。
  • 当用户使用你的app的时候,接到一个电话,通话结束后,你的app又重新回到前台

Activity 类提供了这两个生命周期函数:onStop()onRestart()分别的对应activity暂停和重新启动的时候的动作,我们可以在这个2个函数来处理我们在activity暂停和重新启动的时候要做的工作。是完全不可见的,完不像Stopped状态,是部分遮盖,可以的,Stopped状态的时候,处于这个状态的Acitvity全被覆盖用户的焦点完全在另外一个独立的activity上或者是一个独立的APP上。

注意:因为当我们的activity进入到stopped状态的时候,我们这个activity的实例还是存储在系统的内存中。那这样的话,也就允许我们不用自己去实现onStop()和onRestart()(甚至onStart()函数)。对于大多数的activity来说,都是相对简单的,activity从停止到重新启动都没什么问题,我们要做的也许仅仅是调用onPause来停止那些消耗资源的动作。


图1:


如图1所示,当用户离开你的activity的时候,系统会调用它的onStop函数来停止这个activity,如果用户返回到处于stopped状态的activity的时候,系统会调用onRestart()函数,然后仅接着就调用onStart和onResume函数。不管是什么情况下使得activity进入stopped状态,系统肯定会在onStop函数之前先调用onPause()函数。

停止的Activity

当你的activity的onStop函数被调用的时候,意味着你的activity将要处于不可见的状态,当用户不使用它的时候,这个时候应该释放绝大部分的资源。一但你的activity进入暂停状态,那么,系统可能因为需要回收内存资源而销毁你的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的实例会被保存在内存里, 当我们重新恢复到前台的时候,系统会调用这个被保存的实例。你不需要再去重新初始化那些在生命周期的Resumed状态之前的被初始化的数据。而且系统会保存布局文件里面每个View的状态。所以如果用户在EditText里面输入了一些内容,那么在stopped的时候,它的内容会被自动保存的,我们不需要去存储它。

注意:即使当系统销毁了除了stopped状态的activity,但是这个activity里面的view对象的状态还是会被保存下来(比方说一个EditText里面的文字内容),这个信息会被保存到Bundle(键值对的一个容器)里面,当用户再次进入这个activity的重新创建的一个实例的时候,可以恢复原来里面的view对象的状态,下一节我们会讲如何利用Bundle来保存其他的一些数据的状态,来防止你的你的activity实例被销毁,重建时候,造成数据损失。

启动/重新启动你的Activity

当你的activity从stopped状态转到前台运行,系统会调用它的onRestart函数。系统同样调用onStart函数,每次你的activity变为可见的时候,都会调用它(不管你是restart,或者是第一次create这个activity).onRestart函数只有在activity从stopped状态恢复到前台运行的时候,才会调用。所以当activity从stopped状态恢复,而未被destoryed的情况下,你可以在它里面实现一些特别的恢复工作。

通常让APP利用onRestart来恢复activity之前的状态这种情况是很罕见的,我们几乎不这么使用它,所以在一些普通的app上对这个方法的使用没有任何指导的方法。因为你onStop函数应该清理你的activity的资源,在restart你的activity的时候,你需要重新去实例化这些资源。当你的activity应用第一次启动的时候也需要去实例化它们。因为这个原因,所以很多时候我们使用onStart函数来和onStop函数对应,因为不管你是第一次创建,还是从stopped状态restart你的activity,系统都会调用onStart这个函数,而onRestart仅仅在stopped状态恢复的时候才会调用。。

比方说用户长时间离开activity界面,那么当回到这个界面的时候,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的时候,会调用 onDestroy() 这个函数。因为我们大部分的释放系统资源的工作都是在onStop里面进行的,所以在onDestroy里面就不需要做很多事情。onDestroy是你最后的机会来清理那些可能会引起内存的泄露的资源,所以你要确保那些额外的线程都被销毁,其他一些长时间运行的工作也被终止。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值