Android教程 -06 Activity的生命周期
2015-10-22 10:36
483 查看
本篇播客我们重点介绍下如下知识点:
程序启动原理
Activity生命周期
Activity销毁与创建
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
我们需要在AndroidManifest.xml中声明主Activity,添加如下的意图过滤器
Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。
其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。以上就是基本的activity生命周期。
onStart() 可见的时候调用
onResume() 获取焦点的时候调用
onPause() 失去焦点的时候调用
onStop() 不可见的时候调用
onDestroy() 销毁的时候调用
onRestart() 重新可见的时候调用
当activity异常退出的时候会调用onSaveInstanceState() 保存数据,当重新打开的时候会调用onRestoreInstanceState()
其实onRestoreInstanceState可以不用写,当程序异常退出时,有保存的数据,我们还可以在onCreate方法中取出来
默认情况下,当手机横竖屏切换的时候,首先会销毁Activity,然后重新创建Activity,这时候Activity就被认为异常退出。
怎么保证Activity横竖屏切换的时候不会销毁重新创建呢?
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
我们需要在清单文件中对Activity进行配置,添加了android:configChanges:
对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次,测试的时候发现在高版本并不会调用多次。
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges=”orientation|keyboardHidden”后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation”, 你还必须设置”ScreenSize”。
如果当前你的程序不允许横竖屏切换,可以加上android:screenOrientation配置,其中portrait是锁定竖屏,landscape是横屏
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
用户没有激活某个组件时不会消耗宝贵的系统资源。
离开app并且一段时间后返回,不会丢失用户的使用进度。
设备发生屏幕旋转时不会crash或者丢失用户的使用进度
程序启动原理
Activity生命周期
Activity销毁与创建
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
程序启动原理
当用户从主界面点击程序图标时,系统会调用app中被声明为”launcher” (or “main”) activity中的onCreate()方法。这个Activity被用来当作程序的主要进入点。我们需要在AndroidManifest.xml中声明主Activity,添加如下的意图过滤器
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Activity生命周期
Activity几种状态
Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为”running” 状态)Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。
其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。以上就是基本的activity生命周期。
生命周期的方法
onCreate() 当Activity 创建的时候调用onStart() 可见的时候调用
onResume() 获取焦点的时候调用
onPause() 失去焦点的时候调用
onStop() 不可见的时候调用
onDestroy() 销毁的时候调用
onRestart() 重新可见的时候调用
Activity销毁时保存数据
当activity异常退出的时候会调用onSaveInstanceState() 保存数据,当重新打开的时候会调用onRestoreInstanceState()
// 当Activity异常退出的时候调用 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG, "onSaveInstanceState"); //保存了临时的数据 outState.putString("key","value"); } // 异常退出重新打开的时候调用 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.e(TAG, "onRestoreInstanceState"); // 取出临时的数据 String value=savedInstanceState.getString("key"); Toast.makeText(getApplicationContext(),value,Toast.LENGTH_SHORT).show(); }
其实onRestoreInstanceState可以不用写,当程序异常退出时,有保存的数据,我们还可以在onCreate方法中取出来
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //如果之前保存过数据, 取出来 if(savedInstanceState!=null){ String value=savedInstanceState.getString("key"); Toast.makeText(getApplicationContext(),value,Toast.LENGTH_SHORT).show(); } Log.e(TAG, "onCreate"); setContentView(R.layout.activity_life); }
默认情况下,当手机横竖屏切换的时候,首先会销毁Activity,然后重新创建Activity,这时候Activity就被认为异常退出。
怎么保证Activity横竖屏切换的时候不会销毁重新创建呢?
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
我们需要在清单文件中对Activity进行配置,添加了android:configChanges:
<activity android:name=".LifeActivity" android:configChanges="orientation|keyboardHidden|screenSize" > </activity>
对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次,测试的时候发现在高版本并不会调用多次。
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges=”orientation|keyboardHidden”后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation”, 你还必须设置”ScreenSize”。
如果当前你的程序不允许横竖屏切换,可以加上android:screenOrientation配置,其中portrait是锁定竖屏,landscape是横屏
<activity android:name=".LifeActivity" android:screenOrientation="portrait" > </activity>
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
最后建议
我们学习了Activity生命周期和销毁保存数据的一些知识,我们要合理使用这些知识。使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
用户没有激活某个组件时不会消耗宝贵的系统资源。
离开app并且一段时间后返回,不会丢失用户的使用进度。
设备发生屏幕旋转时不会crash或者丢失用户的使用进度
相关文章推荐
- [转]Android进程间通信
- android 自定义toast 开源项目
- android 的四种枚举
- Android开发手记(14) 使用MediaPlayer播放mp3
- android 中 任务、进程和线程的区别
- android Uri获取真实路径转换成File的方法
- Android Gradle实用技巧——多渠道打包
- [转]android ANR产生原因和解决办法
- android Titlebar一行代码实现沉浸式效果
- android Titlebar一行代码实现沉浸式效果
- android Titlebar一行代码实现沉浸式效果
- NullPointerException at android.widget.AbsListView.obtainView.
- [bug记录]Android5+运行带有so文件的项目时候找不到so文件异常
- Caused by: java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper
- Android----Fragment的基本用法
- Android getWidth和getMeasuredWidth的正解
- Android四大组件应用系列——使用ContentProvider实现跨进程通讯
- Android客户端与PC服务端之间的SOCKET实现登陆功能(服务器)
- Android入门:Handler简介与实例
- Android x86 Emulator Error