Android开发第2-3课:停止和重启一个Activity
2013-05-16 11:48
323 查看
本课将会教你
停止你的Activity启动/重启你的Activity
你应该还读了
Activities尝试它
Download the demoActivityLifecycle.zip
适当的停止和重启你的activity是activity生命周期中一个非常重要的过程,它可以确保你的用户意识到你的app总是活的并且没有丢失进度。有一些情景中,你的activity需要停止和重启:
用户打开最近的 Apps窗口并且跳转到你其他的app。 你的app中的前景activity已经停止。如果用户从主屏图标或者最近app窗口返回你的,然后activity重启。
用户在你的app中执行一个动作来启动一个新的activity。 当创建一个activity时当前的activity已经停止。 如果用户按返回键,第一个activity被重启。
在用户使你的app的时候,用户接到一个电话。
Activity类提供了两个生命周期函数,
onStop()和
onRestart(),它们可以使得你特别地控制你的activity句柄何时停止,何时重启。和 标示部分UI被掩盖的UI的paused状态不同,停止状态保证了 UI不再可见并且用户的焦点已经在一个分离的activity (或者一个完全分离的app)中。
注意: 由于停止的时候系统内存中保留了你的Activity实例,所以你有可能不需要实现
onStop()和
onRestart()(甚至
onStart()。大多数的activity都是比较简单的,activity会停止并且重启的很好,你只需使用
onPause()来停止运行中的动作并且他们从系统资源中断开。
Figure 1. 等用户离开你的activity,系统调用
onStop()来停止activity 。 如果在activity停止的时候,用户返回了,系统调用
onRestart()(2),然后快速调用
onStart()(3) 和
onResume()(4)。 要注意的是无论什么场景导致activity停止了,系统总会在调用onStop()前调用
onPause()。
停止你的Activity
当你的activity接到onStop()的调用,它将不在可视并且应该释放所有用户没有用到的资源。一旦你的activity停止了,如果需要恢复系统内存,系统会毁掉这个实例。在极端的情况下,系统会直接杀死你的app进程而不会调用
onDestroy(),所以使用o
nStop()来释放会导致内存泄露的资源。尽管
onPause()前会先调用
onStop(),你应该使用o
nStop()来执行大的,需要更多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窗体中输入文本,这些内容将会被保留,所以你不必保存并且恢复它。
注意: 就算系统在activity停止的时候销毁了你的activity,它仍然在
Bundle (一个blob的主值对) 中保留View对象的状态 (例如
EditText中的文本),如果用户回到之前的实例系统会回复它(下一节课将会介绍更多有关
Bundle在保存状数据中的应用)。
启动/重启你的Activity
当你的activity从停止状态中回到前台时,它将会接受到onRestart的调用。每次你的activity变得可视时(无论是重启还是第一次创建),系统也会调用onStart()函数。然而,
onRestart()函数只会在stopped状态中恢复的时候调用一次,所以你可以使用它来执行特定的恢复工作,这只是在activity在之前被停止了,但是还有销毁的时候有需要。
用
onRestart()来恢复activity的状态是不正常的,所以这个函数没有任何应用到这个app的向导。然而,因为你的
onStop()函数应该必要地清除你的所有activity的资源,在重启的时候你需要重新初始化它。 然而,当你的activity第一次创建的时候,你还需要实例化它 (当已经没有这个activity的实例的时候)。 由于这个原因,你应该使用
onStart()来作为
onStop()的反向对应函数,应为不管是第一次创建你的activity‘还是由stopped状态重启你的activity,系统都会调用s
onStart()。
例如,由于用户在回到你的app前,已经离开了很长时间,
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时,它为你的
Activity.调用
onDestroy()函数,因为你应该已经在onStop()释放了你的大多数资源。当你接到
onDestroy()的调用的时候,apps已经没有太多东西要做了。 这个函数是你清理可能导致内存泄露的资源的最后机会,所以你应该确保其他的线程和长期运行的动作也已经停止。
相关文章推荐
- Android开发第2-1课:启动一个Activity
- Android开发第2-4课:重建一个Activity
- android开发实战系列(10)-- 停止和重启Activity
- 【Android Developers Training】 17. 停止和重启一个Activity
- Android Training - 停止和重启一个Activity
- Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity
- Android开发第2-2课:暂停和恢复一个Activity
- Android开发中在一个Activity中关闭另一个Activity
- Android开发中在一个Activity中关闭另一个Activity
- Android 快速开发(一),封装一个 TopBarBaseActivity
- [Andriod官方训练教程]管理Activity的生命活动之停止和重启一个Activity
- Android开发中在一个Activity中关闭另一个Activity
- android开发,如何实现通过上拉由一个activity切换到另一个activity
- android开发之一个手机重启问题引发的思考
- Android开发中在一个Activity中关闭另一个Activity
- Android 开发一个Activity 启动另一个Activity碰到的一个问题
- Android开发中在一个Activity中关闭另一个Activity
- Android开发中在一个Activity中关闭另一个Activity
- Android开发 按back键不返回上一个Activity (Activity的启动模式)