Android的生命周期(三)
来源:互联网 发布:打印出库单软件 编辑:程序博客网 时间:2024/06/06 09:19
停止和重启activity
翻译自官方文档API 21
合适地停止和重启你的activity是activity生命周期中一个重要的进程,它会确保让用户觉得你的APP一直在运行而且还没有丢掉他们的进度。在以下几个重要的场景中你应当停止和重启你的activity:
- 用户打开了最近使用的应用窗口并从你的APP切换到其他的APP。你的APP中当前在前台的activity被停止了。如果用户从home界面的启动图标或者是近期使用的应用窗口回到你的activity,这个activity就会重启;
- 用户在你的APP中启动了一个活动,从而启动了一个新的activity。如果用户按了返回按钮,第一个activity重启;
- 当正在使用你的APP时,用户接到了一个电话。
Activity类提供了两个生命周期函数,onStop()和onRestart(),这允许你具体地处理你的activity如何应对停止和重启。不像暂停状态确定UI只是被部分遮挡,停止状态确保这个UI很快就不可见,用户的焦点在另外一个activity中(或者是另外一个APP中)。
Note:因为在停止状态时,你的activity实例仍然保留在系统内存中,很有可能你不必去实现onStop()和onStart()方法(甚至完全不用去实现onStart()方法)。对于大多数相对简单的activity,它会很好地停止和重启activity,你仅需要使用onPause()方法去停止一些正在进行的活动并断开他们与系统资源的连接。
图1 当用户离开你的activity时,系统调用onStop()方法停止这个activity(1)。如果在停止时用户回到了这个activity,系统调用onRestart()方法(2),然后马上调用onStart()方法(3)和onResume()方法(4)。注意到,无论是任何场景造成了这个activity停止了,系统都会在调用onStop()方法之前调用onPause()方法。
停止你的activity
当你的activity被调用onStop()方法时,它即将对用户不可见,并且应该释放掉一切用户不再使用而且不再必须的系统资源。一旦你的activity停止了,如果系统需要释放内存时,你的activity实例极有可能被销毁。在极端的情况下,系统可能在未调用最后的onDestory()方法就杀死你的APP进程,所以,使用onStop()方法来释放可能造成内存泄露的资源是十分重要的。
尽管onPause()方法在onStop()方法之前被执行,但是你应当使用onStop()方法来做一些大型的,CPU密集型的关闭操作,比如向数据库写入信息。
举个例子,这里实现了onStop()方法,把一个草稿的内容存到持久存储介质上。
@Overrideprotected 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恢复时,它又会被重新调用。你不必重新初始化那些在恢复状态之前被创建的组件。系统也会追踪当前状态布局文件中的每一个视图(View),所以说,如果用户在EditText组件中输入了文字,这些内容已经被保存,所以你不用再去保存它。
Note: 即便是系统在你的activity停止时将它销毁了,它仍然在Bundle对象(一些键值对)中保留了View对象(比如Edittext对象中的文本)的状态。
启动/重启你的activity
当你的activity从停止状态回到前台的时候,它被调用onRestart()方法。系统同样也会调用onStart()方法,这是每次你的activity变得可见时都会发生的(不管是activity重新启动或是第一次被创建)。然而,onRestart()方法却只有在activity从停止状态恢复时才会被调用,所以你可以用这个方法来做一些特殊的恢复工作,这些工作有可能仅在activity之前被停止但没有被销毁是是必要的。
一个APP使用onSttart()方法来恢复activity的状态是不常见的,所以这里并没有这个方法应用于一般APP的指南。然而,因为你的onStop()方法应当释放你的activity的所有资源,所以你必须在activity重启时重新分配这些资源。但是,你也必须在activity第一次被创建时分配这些资源(当这个activity实例不存在时)。因此,你应该通常使用onStart()方法来对于onStop()方法,因为系统在你第一次创建activity和从停止状态恢复时,都会调用onStart()方法。
举例来说,因为用户可能会在离开你的APP很久后才回来,所以onStart()方法是验证系统所需的功能是否启用的好地方:
@Overrideprotected 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" }}@Overrideprotected void onRestart() { super.onRestart(); // Always call the superclass method first // Activity being restarted from stopped state }
当系统销毁你的activity时,它会为你的activity调用onDestory()方法。因为你已经在onStop()方法中释放了大多数系统资源,所以等到系统再调用onDestory()方法时,大多数APP已经没有太多的资源要释放。这个方法是你释放可能导致内存泄漏的资源的最后机会,所以,你应当确保一些额外的线程已经被销毁,并且其他的一些像方法追踪(method tracing)这样的长期的动作也已经被停止。
- Android的生命周期(三)
- Android的生命周期(三)--Activity的生命周期
- Android(三) Activity的生命周期
- Android的七巧板Activity之一 Activity的生命周期(三)
- 记录自己的Android学习(三)Activity生命周期
- Android之服务(三)服务的生命周期
- Android之Activity(三):活动的生命周期
- Android中Activity的三种生命周期
- Android项目(三)-- Activity生命周期演示
- Android基础知识三(Activity生命周期)
- Android生命周期(三)
- Android学习笔记(三三):Activity生命周期
- Android学习笔记(三三):Activity生命周期
- Spring的Bean的生命周期(三)
- MFC应用程序的生命周期(三)
- Servlet教程(三) Servlet的生命周期
- Java 之 线程的生命周期(三)
- fragment的生命周期三
- uitableview
- 面试:机器学习--支持向量机
- Object转XML && XML转Object
- 关于Bundle及其在不同activity之间的传值
- CSUOJ--1563: Lexicography
- Android的生命周期(三)
- opencv findContours使用问题
- 添加view
- jQuery的prop和attr方法之间区别
- 10000 pcs free gift of chinese top grade brown film faced plywood
- 参数自适应的单层 bp 神经网络
- 019:函数:我的地盘听我的
- mac 下安装android studio
- opencv2的安装、在VS上的配置以及第一个示例