Android Training - 停止和重启一个Activity
来源:互联网 发布:陀螺效应 知乎 编辑:程序博客网 时间:2024/05/16 16:55
为了确保你的用户能感觉到程序一直是活着的,并且没有丢失他们的使用进度,合理的停止和启动你的activity将显得尤为重要。这里有一些场景是需要你的activity停止和重启的:
当activity接收一个onStop()函数调用时,activity是不可见的,而且释放几乎所有不需要的资源。一旦activity被停止,系统在恢复系统内存时可能会销毁activity实例。在极少情况下,系统会直接杀掉你的程序进程而不调用activity的onDestroy()函数,所以在onStop()方法中释放资源,防止内存泄露是很重要的。
当activity被停止后,activity对象被保持在内存中,等待被呼叫恢复到Resumed状态,当恢复时你不需要重新创建activity和初始化组件。系统会保持每个View的当前状态,所以当用户输入内容到EditText时,内容会被自动保存,你不需要手动保存和恢复它。
当你从停止状态返回到前台时,会调用onRestart()函数。每次程序可见时系统都会调用onStart()方法(不管是重启还是第一次创建)。当然,onRestart()方法只是当activity从stopped状态恢复时才会调用,所以你可以使用这个方法实现一些特殊的恢复工作,这些工作是恢复停止之前的数据,而不是销毁后的。
当系统消耗你的activity,它会调用onDestroy()函数。因为你已经在onStop()中释放了差不多所有的资源,所以这个方法一般没太多的事情要做。这个方法是清理资源,防止内存泄露的最后方法,所以你必须确保附加的线程已经被销毁,和像函数回溯这些长时间运行的行为已经被停止。
- 用户在你的程序中从“正在运行程序窗口”选择切换到其他程序。那么你的程序的activity就会被停止。如果用户从“主屏幕图标”或者“正在运行程序窗口”中选择了你的程序,那么这个activity会被重启。
- 用户在你的程序中执行一个行为启动了一个新的activity。当前activity就会被停止,第二个activity被创建。当用户点击Back按钮时,第一activity被重启。
- 当用户正在使用你的程序时接了一个电话。
Activity提供两个方法onStop()和onRestart()让你在停止和重启时做一些特定操作。和paused状态不一样的是,stopped状态保证了UI界面是不可见的,用户的焦点完全是在另外一个activity中(或者另外一个单独的程序中)。
提示:因为系统在stopped状态中会保存你activity实例在内存中,所以你可能不需要实现onStop()和onRestart()方法(甚至是onStart())。对大多数activity来说都是比较简单的,activity能够很好的停止和重启,你只需要使用onPause()暂停进行中的动作和释放系统资源。
图解:当你用户离开你的activity,系统调用onStop()停止activity(1)。如果从stopped状态返回activity,系统调用onRestart()(2),然后快速的执行onStart()(3)和onResume()(4)。注意,不管是什么场景导致activity的停止,系统都是先调用onPause()然后再调用onStop()。
停止你的Activity
当activity接收一个onStop()函数调用时,activity是不可见的,而且释放几乎所有不需要的资源。一旦activity被停止,系统在恢复系统内存时可能会销毁activity实例。在极少情况下,系统会直接杀掉你的程序进程而不调用activity的onDestroy()函数,所以在onStop()方法中释放资源,防止内存泄露是很重要的。
虽然onPause()在onStop()前被调用,不过你应该使用onStop()执行更大、更多CPU密集的关闭操作。比如写入信息到数据库。
比如,这是保存笔记草稿到永久存储器在onStop()中的实现:
@Overrideprotected void onStop() { super.onStop(); // Always call the superclass method first // 保存当前笔记草稿,确保不丢失工作进度。 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状态,当恢复时你不需要重新创建activity和初始化组件。系统会保持每个View的当前状态,所以当用户输入内容到EditText时,内容会被自动保存,你不需要手动保存和恢复它。
提示:即使系统在你的activity被停止时销毁它,它仍然保存View对象(比如EditText中的文本)到一个Bundle(一些key-value对)中,在返回activity时恢复这些数据。(我们会在另外的课程中讨论当activity被销毁和重启时使用Bundle保存数据)
启动/重启你的activity
当你从停止状态返回到前台时,会调用onRestart()函数。每次程序可见时系统都会调用onStart()方法(不管是重启还是第一次创建)。当然,onRestart()方法只是当activity从stopped状态恢复时才会调用,所以你可以使用这个方法实现一些特殊的恢复工作,这些工作是恢复停止之前的数据,而不是销毁后的。
一个程序需要使用onRestart()来恢复activity状态是很不寻常的,所以对于常用的程序来说,我们没有关于这个函数的任何教程。不管怎样,因为你本来应该在onStop()方法中清理所有的activity资源,你将要在activity重启的时候从新初始化它们。不过,当你activity第一次创建的时候,你也需要初始化它们。基于这个原因,你通常应该再onStart()方法中匹配onStop()的实现,因为系统启动和重启时都会调用onStart()。
例如,用户可能离开你的程序很久,然后返回来,onStart()函数就是一个验证系统所需功能的最好地方:
@Overrideprotected void onStart() { super.onStart(); // Always call the superclass method first // 在这里,activity要么是重启,要么是第一次创建 // 所以在这里确认是否开启GPS。 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!gpsEnabled) { // 弹出对话框提示用户开启GPS }}@Overrideprotected void onRestart() { super.onRestart(); // Always call the superclass method first // activity从停止状态重启 }
当系统消耗你的activity,它会调用onDestroy()函数。因为你已经在onStop()中释放了差不多所有的资源,所以这个方法一般没太多的事情要做。这个方法是清理资源,防止内存泄露的最后方法,所以你必须确保附加的线程已经被销毁,和像函数回溯这些长时间运行的行为已经被停止。
- Android Training - 停止和重启一个Activity
- Training--停止和重启一个Activity
- 停止和重启一个Activity
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity
- 【Android Training - 01】详解Activity生命周期 [ Lesson 3 - 停止与重启Activity ]
- Android开发第2-3课:停止和重启一个Activity
- Android API 中文 (3) —— 停止和重启一个Activity
- Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity
- Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity
- [Andriod官方训练教程]管理Activity的生命活动之停止和重启一个Activity
- [Andriod官方训练教程]管理Activity的生命活动之停止和重启一个Activity
- Android Training - 暂停和恢复一个Activity
- android开发实战系列(10)-- 停止和重启Activity
- Android Training - 开始一个Activity
- Android Training - 重建一个Activity
- Activity生命周期 之 停止和重启Acitivty
- Activity 的停止与重启
- 安卓训练-开始-管理 Activity 生命周期-停止和重启 Activity
- [Err] 1248 - Every derived table must have its own alias
- Java调用linux系统shell执行命令
- Hadoop-0.20.203.0通过Eclipse连接编程
- C#获取 URL参数
- C++数组的动态分配(new)、初始化(memset)和撤销(delete)
- Android Training - 停止和重启一个Activity
- apache和tomcat区别
- Android 调用系统发送短信界面,预设号码和短信内容
- [Basic]面向对象之信息隐藏(三)
- 浅析http协议、cookies和session机制、浏览器缓存
- Ubuntu创建软连接 ln -s
- WIN7右击后资源管理器重启
- Zynga被起诉 反咬EA称其“不懂法”
- 一个变量定义引起的血案