本篇播客我们重点介绍下如下知识点:

  1. 程序启动原理
  2. Activity生命周期
  3. 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生命周期和销毁保存数据的一些知识,我们要合理使用这些知识。

  1. 使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
  2. 用户没有激活某个组件时不会消耗宝贵的系统资源。
  3. 离开app并且一段时间后返回,不会丢失用户的使用进度。
  4. 设备发生屏幕旋转时不会crash或者丢失用户的使用进度

Android教程 -06 Activity的生命周期的更多相关文章

  1. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android开发之Activity的生命周期以及加载模式

    本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...

  3. android 基础02 - Activity 的生命周期及状态

    返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...

  4. Android Studio 之 Activity 的生命周期

    翻转屏幕,会重新加载Activity package com.example.activitylivecycle; import android.os.Bundle; import android.u ...

  5. Android学习笔记----Activity的生命周期图示

    转载,一目了然.

  6. Android Activity的生命周期

    一.为什么要了解Activity的生命周期 activity is directly affected by its association withother activities, its tas ...

  7. Android开发艺术1之Activity的生命周期

    作为<Android开发艺术探索>这本书的第一篇博客,我就多说几句.本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程.不敢说书评,也不能说教程,只希望对有些人有帮助就好 ...

  8. android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

    转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...

  9. Android SDK上手指南:Activity与生命周期

    Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...

随机推荐

  1. java利用JXL导出/生成 EXCEL【my】

    一.创建一个excel文件 package test;// 生成Excel的类 import java.io.File; import jxl.Workbook;import jxl.write.La ...

  2. 2018-8-10-如何使用-C#-爬虫获得专栏博客更新排行

    title author date CreateTime categories 如何使用 C# 爬虫获得专栏博客更新排行 lindexi 2018-08-10 19:16:51 +0800 2018- ...

  3. win10 ubuntu 双系统启动顺序设置

    之前安装ubuntu的时候就遇到过这个问题, 当时解决了,设置成开始可以选择启动ubuntu系统还是win系统. 但是过了好久后又忘记了,最近win10开了一次安全模式启动后,一开机就是win10,u ...

  4. 安装scrapy问题:-bash:scrapy:command not found

    但是可以import,于是添加python3.5到环境变量,搞定 export PATH=$PATH:/usr/local/python3./bin/

  5. JavaScript-JQ实现自定义滚动条插件1.0

    此滚动条仅支持竖向(Y轴) 一.Css /*这里是让用户鼠标在里面不能选中文字,避免拖动的时候出错*/ body { -moz-user-select: none; /*火狐*/ -webkit-us ...

  6. CSS hack处理

    css hack指各版本及各品牌浏览器之间对CSS解释后出现网页内容的误差. 各浏览器CSS解析: 1.大部分特殊字符IE浏览器支持,其他主流浏览器firefox,chrome,opera,safar ...

  7. MyEclipse优化】-----如何合理设置MyEclipse中的validation选项

    打开eclipse,点击[window]菜单,选择[preferences]选项. 在左侧点击[validation]选项,在右侧可以看到eclipse进行的自动检查都有哪些内容. 将Manual(手 ...

  8. 【水滴石穿】bstmy-blend-app

    这个项目是一个简单的底部导航切换页面 项目的地址为:https://github.com/Bstmy/bstmy-blend-app 先看效果 点击首页是首页面,点击个人中心是个人中心页面 先看代码 ...

  9. Lunix文件的读写权限问题

    今天把在windows平台build好的lunix执行文件复制到Lunix的虚拟机上,发现可执行文件不能执行了,后来才发现文件时有读写和可执行权限的,但是是可以更改的,右键属性,把可执行属性勾选上就可 ...

  10. iPhone开发之深入浅出 (7) — ARC总结

    原文链接:http://www.yifeiyang.net/development-of-the-iphone-simply-7/ 通过前面几篇文章的介绍,我想大家应该对ARC有了一个比较完整的理解. ...