zoukankan      html  css  js  c++  java
  • Android-管理Activity生命周期 -暂停和恢复一个Activity

    在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停。比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停。只要activity仍然部分可见但是没有获得焦点,它会保持在paused状态。

    但是,一旦一个activity完全被阻塞并且不可见,它就会到Stopped状态(后面会讨论这个)。

    当activity进入Paused状态,系统会调用activity的onPause()方法,可以让你停止那些不需要继续运行的动作(比如视频)和保存那些需要永久保存的信息来防止用户后面离开的app造成信息丢失。如果用户从Paused状态返回到activity,系统会调用onResume()方法

    注意:当activity收到onPause()调用,有可能是表示activity会被暂停一会儿,用户一会儿会回来。但是,通常情况下是用户将要离开activity。

    图1.当一个半透明的activity挡住了你的activity,系统会调用onPause()然后这个activity会在Paused状态等待。如果当它还是Paused状态时用户返回了,系统会调用onResume()。 

    暂停Activity

    当系统调用onPause(),技术上说activity仍然部分可见,但是大多数情况下意味着用户很快就会离开activity并且activity很快就会进入Stopped状态。通常情况下你可以用onPause()方法来做下面的事:

    停止动画和正在执行的操作,他们会消耗CPU

    保存没有保存的东西。但是只是在用户希望他们被永久保存的情况下(比如邮件的草稿)

    释放系统资源,比如接收广播信息,处理传感器(比如GPS),或者任何activity暂停后用户不需要但是会消耗电池的资源。

    例如,如果你的程序使用照相机,onPause()方法是一个释放它的好地方。

    @Override
    public void onPause() {
        super.onPause();  // Always call the superclass method first
                                 
        // 在paused状态时,释放照相机资源因为我们不需要它了
        // 以及其他我们不需要的资源
        if (mCamera != null) {
            mCamera.release()
            mCamera = null;
        }
    }

    通常情况下,不应该用onPause()来存储用户更新(比如表单中的用户信息)到永久的存储。只有你确定用户希望更新被自动保存(比如邮件草稿)的时候,才能保存到永久存储。但是需要避免CPU在onPause()时进行大量的工作,比如存数据库,因为会导致切换到下一个activity变慢(应该把需要大量操作的事情放到onStop())。

    你应该控制相对少的操作在onPause()中完成,这样可以让用户迅速切换到下一个activity。实际上你的activity变成Stopped状态了。

    注意:当activity在Paused状态时,activity实例仍然在内存中然后activity恢复时被继续调用。在恢复到Resumed状态时不需要在任何回调方法中重新初始化组件。

    恢复Activity

    当用户从Paused状态恢复activity时,系统会调用onResume()方法。

    activity到达前台时,系统每次都会调用这个方法,包括第一次创建。因此,你需要初在onResume()中始化那些在onPause()中释放的组件以及那些每次进入Resumed状态都需要的初始化(比如开始动画以及那些只有在activity有焦点时才显示的组件)。

    下面的onResume()例子对应上面的onPause()例子,它初始化的activity暂停释放的照相机

    @Override
    public void onResume() {
        super.onResume();  // Always call the superclass method first
               
        // Get the Camera instance as the activity achieves full user focus
        if (mCamera == null) {
            initializeCamera(); // Local method to handle camera init
        }
    }

    上一篇:Android-管理Activity生命周期 -开始一个Activity

    下一篇:Android-管理Activity生命周期 -停止和重启Activity

  • 相关阅读:
    vue-router query和params参数的区别
    vue打包成app后,背景图片不显示
    vue打包成app后,点击手机上的物理返回按钮后直接退出app
    Echarts dataZoom 区域缩放
    CSS3 实现别样图型
    Echarts 不能百分比显示或显示有问题
    循环(数组循环、获取json数据循环)、each()循环详解
    页面数据加载完成时,显示loading页面.数据加载完,loading隐藏.
    获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)
    移动端rem布局,用户调整手机字体大小或浏览器字体大小后导致页面布局出错问题
  • 原文地址:https://www.cnblogs.com/fengquanwang/p/3142351.html
Copyright © 2011-2022 走看看