Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)
一、体验活动的生命周期的执行
代码组成:
1、三个Java类:MainActivity.java、NormalActivity.java、DialogActivity.java
2、三个布局文件:activity_main.xml、activity_normal.xml、activity_dialog.xml
3、程序入口:AndroidManifest.xml
4、创建一个过滤器:MainActivity
下面是具体代码:
MainActivity.java
package com.example.administrator.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;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
public static final String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG,"onCreate");
Button startNormalActivity= findViewById(R.id.start_normal_activity);
Button startDialogActivity= findViewById(R.id.start_dialog_activity); startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
}); startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
} @Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart");
} @Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
} @Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause");
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop");
} @Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
NormalActivity.java
package com.example.administrator.activitylifecycletest; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class NormalActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
}
}
DialogActivity.java
package com.example.administrator.activitylifecycletest; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class DialogActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}
activity_main.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"> <Button
android:id="@+id/start_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity"/> <Button
android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity"/> </LinearLayout>
activity_normal.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"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a normal activity"/>
</LinearLayout>
activity_dialog.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"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a dialog activity"/>
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.activitylifecycletest"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
<!--android:theme是设置活动的主题,上面是将活动设置成了对话框式的活动-->
</application> </manifest>
MainActivity过滤器:


代码运行结果:
1、运行程序,打印出一下日志:创建项目的时候运行了三个方法:onCreate()、onStart()、onResume()


2、点击Start NormalActivity:此时调用了两个方法:onPause()、onStop()


3、点击Back键:此时调用了三个方法:onRestart()、onStart()、onResume()


4、点击Start DialogActivity:DialogActivity是对话框式的活动,因此启动该活动时,只会调用onPause()方法,不会调用onStop()方法


5、点击Back键:相应的对话框式的活动按Back键后也是只调用onResume()方法。


6、再次按Back退出程序后:调用了三个方法:onPause()、onStop()、onDestroy()

二、活动被回收后临时数据的保存(onSaveInstanceState方法)
现象描述:MainActivity活动中有一个文本输入框,现在在文本框中输入了一段文字后,没有关闭该文本输入框,然后打开活动NormalActivity,这个时候MainActivity由于系统内存不足被回收了,过了一会儿又点击Back键回到MainACtivity,发现刚刚输入的文本信息全部清空了,这是因为MainActivity被重建了。
实际需求:在NormalActivity活动回到MainActivity活动后,我们需要之前的数据保留下来。
问题解决:Activity类提供了一个onSaveInstanceState()方法,这个方法保证活动在被回收前一定调用,我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
保存临时数据:
在MainActivity.java(有临时数据的活动)中添加如下代码:

获取临时数据:
修改MainActivity.java(有临时数据的活动)中onCreate()方法中的代码:下面通过Log来打印出那些临时数据的。

拓展:
使用Bundle来保存和取出数据,与Intent传递数据基本类似。Intent可以结合Bundle一起用于传递数据:
思路:先把数据保存在Bundle对象中,在把Bundle对象放在Intent里。到了目标活动后,先从Intent中取出Bundle,再从Bundle中一一取出数据。
Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)的更多相关文章
- Android学习之基础知识四-Activity活动3讲(Intent的使用)
主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...
- Android学习之基础知识四-Activity活动5讲(Activity的生命周期)
一.返回栈 1.Android是通过任务(Task)来管理活动,一个任务就是一个返回栈内所有活动的集合. 2.返回栈是一个后进先出的数据结构,每启动一个新的活动,该活动就会覆盖原来的活动,位于栈顶位置 ...
- Android学习之基础知识四-Activity活动2讲
一.在活动(activity)中添加Toast显示: 1.Toast作用:Android系统提供的一种非常好的提醒方式,将一些短小的信息提供给用户,这些信息会在一段时间后自动消失,不会占用任何屏幕空间 ...
- Android学习之基础知识四-Activity活动7讲(活动的启动模式)
在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式.Activity的启动模式一共有4种:standard.singleTop.singleTask.singleInstance. ...
- Android学习之基础知识四-Activity活动1讲
一.活动(Activity)的基本用法: 1.手动创建活动FirstActivity(java源码): A.Android Studio在一个工作区间只允许打开一个项目,点击:File--->C ...
- Android学习之基础知识四-Activity活动8讲(活动的灵活运用)
一.判断当前是在哪个活动 1.我们还是接着上一讲的代码,首先创建一个Java类:BaseActivity.java.这个类我们不作为一个活动,也不在AndroidManifest.xml中注册,它只是 ...
- Android学习之基础知识四-Activity活动4讲(Intent传递数据)
Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据. 一.使 ...
- Android学习之基础知识七—碎片的使用
碎片(Fragment)是一种可以嵌入在活动中的UI片断,它能让程序更加合理和充分地利用大屏幕的空间,它与活动相似,可以简单的理解为一个迷你型的活动,它也有自己的生命周期.碎片在平板的应用非常广泛. ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
随机推荐
- 在UAP中如何通过WebView控件进行C#与JS的交互
最近由于项目需求,需要利用C#在UWP中与JS进行交互,由于还没有什么实战经验,所有就现在网上百度了一下,但是百度的结果显示大部分都是在Android和IOS上面的方法,UWP中的几乎没有.还好微软又 ...
- SQL Server 连接(内连接,外连接,完全连接,交叉连接,联合)
1.连接 有时候需要将连个表的数据合并成一个结果集来显示.为了解决这个问题,就需要用到JOIN连接. 2.内部连接 内部连接根据一个或几个共同的字段将记录匹配到一起.内部连接仅仅返回那些存在字段匹配的 ...
- FormData对象的使用
一.概述 FormData类型是XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据提供便利. 作用:1.利用一些键值对来模拟一系列表单控件:即将form中的所有表单元 ...
- csharp: DefaultValueAttribute Class
public class CalendarEvent { public int id { get; set; } public string title { get; set; } public st ...
- 【读书笔记】iOS-解析XML
使用最广泛的解析XML文档的方法有两种,一种基于SAX,另一种基于DOM.SAX解析器是事件驱动型的,在解析时增量地读取XML文档,当解析器识别出一个结点的时候会调用相应的委托方法. 参考资料< ...
- python之正则表达式及RE模块
正则表达式(匹配字符串)web界面正则匹配工具:http://tool.chinaz.com/regex/ 元字符 1 . 匹配除换行符之外的任意字符 2 \w 匹配数字字母下划线 3 \d 匹配数字 ...
- ios开发GCD(2)-dispatch_semaphore_t信号量计数器
思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办? dispatch_semaphore_t 看代码解析: NSLog(@"开始"); dispatch_ ...
- [20171120]bash使用here documents的一个小细节.txt
[20171120]bash使用here documents的一个小细节.txt --//昨天看bash文档,,发现一些小细节,做一个记录,就是EOF加引号的问题. command <<' ...
- 修改sqlserver2008数据库的排序规则 (转)
修改sqlserver2008数据库的排序规则 (转) 修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...
- Sublime Text 3 注册码激活码被移除的解决办法
新版的sublime text3中加入了验证功能,之前成功注册的也被移除了,在网上搜索的验证码要么已经失效要么已经被封,少数几个正常的注册输入进去注册成功后几分钟之内这个注册码就会被莫名其妙的被移除. ...