新建项目ActivityLifeCycleTest,创建主活动后,再新建两个子活动--NormalActivity和DialogActivity。

现在活动及其对应布局文件创建完毕。

编辑normal_layout.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"> <TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a normal activity"/>
</LinearLayout>

只是简单是使用了一个TextView,用来显示一行文字。

然后编辑dialog_layout.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a dialog activity"/>
</LinearLayout>

从名字上可以看出来这两个子活动一个是普通的活动,一个是对话框式的活动。现在我们来修改这个对话框式的活动,打开AndroidManifest.xml文件的<activity>标签,并修改。代码如下:

<activity android:name=".DialogActivity"android:theme="@style/Theme.AppCompat.Dialog">
</activity>

这里是活动的注册码,并且只给DialogActivity的代码进行了修改,给它使用了android:theme属性,这是用来给当前活动指定主题的,Android系统内置了很多主题可以选择,这里是让DialogActivity使用对话框式的主题。

接下来,重新定制主活动的布局,将里面的代码替换成如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/start_normal_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text = "Start NormalActivity"/><Buttonandroid:id="@+id/start_dialog_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text= "Start DialogActivity"/>
</LinearLayout>

只是添加了两个按钮,分别对应两个子活动。

最后修改MainActivity中的代码,如下所示:

package com.example.activitylifecycletest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity { public  static final  String TAG = "MainActivity";?//定义当前类名为常量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);    }})} @Overrideprotected void onStart() {super.onStart();Log.d(TAG,"onStart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"onResume");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG,"onPause");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG,"onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG,"onDestroy");}
}

在onCreate()方法中,我们分别为两个按钮定义了点击事件,点击按钮会启动相应的Activity,然后会在Activity的7个回调方法中分别打印了一句话,这样更好的观察理解活动的生命周期。

  • 倘若活动被回收了怎么办?

假设有一个活动A,在活动A的基础上启动了活动B,那么活动A进入了Stop状态,这时突然由于系统内存不存,将活动A回收了,然后用户按下Back键返回活动A,会出现什么情况呢?还是会正常启动A的,只不过并不是执行onReStart()方法,而是会执行活动A的onCreate()方法,因为活动A在这种情况会被重新创建一次。那么加入活动A本来是存在临时数据和状态的,那么重新创建一次,什么都不没有显示了,这不是令人很难过吗?

经查阅文档。Activity中还提供了一个onSaveInstanceState()回调方法,这个方法可以保证活动在回收之前一定被调用,因此这个方法来解决活动被回收时,临时数据得不到保存的问题。

onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,例如可以使用putString()来保存字符串,使用putInt()保存整型,每个保存方法有两个参数,一个是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。这么看来,键和保存的内容是一一对应的吧。

在MainActivity中添加如下代码:

@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempData = "Something you just typed";outState.putString("data_key",tempData);}

我们是在MainActivity文件中重写了这个方法。那么数据是保存好了,但是我们应该在哪里恢复呢?我们之前一直使用的onCreate()方法其实也有一个Bundle类型的参数。这个参数一般情况是null,但是如果在活动被回收之前有通过onSaveInstanceState()方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要修改MainActivity的onCreate()方法,代码如下:

 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"onCreate");setContentView(R.layout.activity_main);if(savedInstanceState !=null){String tempData = savedInstanceState.getString("data_key");Log.d(TAG,tempData);}Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}

Intent还可以结合Bundle一起用于传输数据,首先可以把需要传递的数据都保存在Bundle对象中,然后再将Buddle对象存放在Intent里。到了目标活动之后先从Intent中取出Bundle,在从Bundle中一一取出数据。

Android 第三课 Activity的生命周期相关推荐

  1. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  2. Android实验二:Activity的生命周期

    要求 设计如下界面,包括四个按钮,两个文本框.单击对应按钮可以启动对应activity.假 定Activity A为启动Activity. 部分代码 import androidx.appcompat ...

  3. Android用代码测试Activity的生命周期

    Activity的生命周期图 代码测试Activity的生命周期 测试用例: 1)界面从"死亡"-->"运行" (打开界面) 2) 界面从"运行 ...

  4. Android学习之管理Activity的生命周期

    Activity生命周期 activity第一次启动的时候,它来到系统的前台,开始与用户交互.在此期间,Android系统调用了Activity生命周期中一系列的方法.如果用户执行启动了另一个acti ...

  5. 重温Android四大组件(一)—Activity的生命周期

    前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了.但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心. 这里以& ...

  6. android tabhost 多个activity,Android:TabHost中Activity的生命周期问题

    用过TabHost制作多个activity的分页效果的朋友应该知道,tabhost中镶嵌的activity的onCreate和onDestroy是和tabhost关联的,在创建了tabhost之后,第 ...

  7. Android四大组件之一Activity的生命周期

    Activity的七大生命周期 onCrate 不可见不可交互. onStart 可见不可交互 . onResume 可见可交互 . onPause 可见不可交互 .onStop 不可见不可交互 . ...

  8. android笔记3:activity的生命周期(转)

    我们知道Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括: onCreate .onStart .onResume .onPause .onSto ...

  9. Activity的生命周期方法

    一:Activity的生命周期方法 Android提供了很多Activity的生命周期方法,比如我们常用的onCreate.onPause.onResume等.这里主要介绍粗粒度的周期方法,诸如onP ...

最新文章

  1. python入门代码示例-总算知道python入门代码示例
  2. python学习笔记四-列表
  3. pycharm的安装和使用
  4. 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
  5. 基于mcp940反编译Minecraft源代码
  6. Android之ZXing扫描二维码以及生成二维码
  7. 伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理
  8. mysql limit offset很大_MySQL查询中LIMIT的大offset导致性能低下浅析
  9. mac 10.13 配置 php,MacOS10.13.6 升级后 PHP7.3配置
  10. 2021亳州高考成绩查询,2021年亳州高考状元名单公布,亳州文理科状元是谁多少分...
  11. Java使用swagger时显示实体类注解问题
  12. MySQL8.0数据库配置注意事项
  13. 两轮差速驱动机器人运动模型及应用分析
  14. [BZOJ 4010] 菜肴制作
  15. 一些嵌入式面试题目的集锦
  16. 我的Android进阶之旅------经典的大牛博客推荐(排名不分先后)!!
  17. 基于tushare和python的证券市场价格分析
  18. 微信公共号如何本地调试
  19. 牛!发出中国第一封电子邮件,注册登记域名CN,中国互联网之父传奇
  20. 同步/异步 异步回调 协成 线程队列

热门文章

  1. java applet 文本框_Java Applet 文本框 TextField 小例 | 学步园
  2. Mask RCNN笔记
  3. excel换行按什么键_电脑结束任务按什么键
  4. 进程线程区别,和线程初识
  5. 不安装oracle客户端如何用plsql连接oracle
  6. jQuery自定义选择器
  7. 如何改变XCode的默认设置
  8. The mook jong 计数DP
  9. Less Css 教程
  10. 不浮躁的社会是什么样的?