活动的生命周期和启动

  • 实验目的
  • 实验内容
  • 实验步骤
    • 一、新建Activity并初始化
    • 二、尝试初运行并添加对话回显
    • 三、在活动间切换&调试
    • 四、验证系统可能自行对活动运行onDestroy
    • 五、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
    • 六、standard, singleTop, singleTask三种启动模式之间的区别点

实验目的

理解Android Studio的活动调用过程和生命周期

实验内容

1、通过在不同的活动之间的转换,观察onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况。
2、通过实验说明存在系统可能自行对活动运行onDestroy。
3、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
4、通过实验说明活动的standard, singleTop, singleTask三种启动模式之间的区别点。
5、说明活动singleInstance启动模式的功能

实验步骤

一、新建Activity并初始化

1.在activity中new两个新empty activity,重命名为normal和dialog

2.在两个activity的layout中分别添加不同的显示,这里在Normal中添加textView,dialog中不用做修改,用以弹出对话框即可,但是要在Manifest里更改activity样式。

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

3.在value-strings中添加两个词条,用以快速连接text

    <string name="button_normal_name">Goto normal activity</string><string name="button_dialog_name">Goto dialog activity</string>

4.在MainActivity中添加两个button,分别点击text右侧的长条选择上述两个词条

5.最后添加代码,new两个button,并新建点击事件setOnClickListener

    @Overrideprotected void onCreate(@NonNull Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=(Button) findViewById(R.id.button_normal);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,normal.class);startActivity(intent);}});Button button1=(Button) findViewById(R.id.button_diolog);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent1=new Intent(MainActivity.this,diolog.class);startActivity(intent1);}});}
}

二、尝试初运行并添加对话回显

1.试运行很明显分为三个界面。分别如下:
(1)主界面

(2)普通界面

(3)对话框界面(半透明)

2.为了研究onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况,添加如下代码用以回显

public static final String TAG = "1812190523";@Overrideprotected void onDestroy(){super.onDestroy();Log.d(TAG,"onDestroy:");}@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 onStart(){super.onStart();Log.d(TAG,"onStart:");}@Overrideprotected void onRestart(){super.onRestart();Log.d(TAG,"onRestart:");}

在 onCreate里创建如下:

Log.d(TAG,"onCreate:");

在button中添加

tmpData="I am changed";

在button1中添加

Log.d(TAG,tmpData);

三、在活动间切换&调试

---------- 在Logcat中筛选词条后即可观察 ----------
前言:科普一下Activity的四种状态:
1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并,可与用户交互的激活装态;
2.Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,他仍然可见,但是它已经失去焦点,故不可与用户交互。
3.Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
4.Killed状态: Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动CIA可以显示和使用。
以上四种状态,Running状态和Paused状态是课件的,Stopped状态和Killed状态时不可见的。

摘自https://blog.csdn.net/u014419014/article/details/78840218

1.首先打开软件,看到如下步骤

2.打开normal界面

3.退出normal界面

4.打开对话框

5.退出对话框

6.退出程序

看过前面的科普应该很容易理解实验结果,不再赘述

四、验证系统可能自行对活动运行onDestroy

直接举例,在主界面中,直接用屏幕翻转功能

五、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况

首先在第四点的条件下,系统直接destroy会销毁数据。比如说先调用button的tmpData赋值语句后(I am changed),再调用button1中的Log.d时显示的也是I am changed,但是经过一次屏幕翻转就会清空这个tmpData的值,直接调用button1会显示I am original。
这时候,可以用saveinstantstate。

并再添加字符串提取

@Overrideprotected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);outState.putString("IS",tmpData);}

在 onCreate里创建如下:

        if(savedInstanceState!=null){String tmp=savedInstanceState.getString("IS");Log.d(TAG,tmpData);}

这两个的作用呢,是在不是发自用户的destroy后查找已经被赋值的语句,存储到名为IS的一个字符串中,并再重新启动后赋值。

六、standard, singleTop, singleTask三种启动模式之间的区别点

直接贴代码,新建一个自己调用自己的活动

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=(Button)findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,MainActivity.class);startActivity(intent);}});}

在下图中,可以设置launch mode为standard, singleTop, singleTask,singleInstance

<activity android:name=".MainActivity"android:launchMode="*******">

standard模式很好理解,相当于没有任何限制
在如下代码的情况下,只要你单击button就会一直产生新窗口界面(可以通过返回确认页面数)

<activity android:name=".MainActivity"android:launchMode="standard">

single top也很好理解,相当于限制置顶页面的创建,因为当前页面是置顶页面,那么就不能通过自己调用自己产生新的置顶页面

<activity android:name=".MainActivity"android:launchMode="singleTop">

singletask也很好理解,就是这个活动只能存在一个,在single top模式下,通过其他函数仍可以创建新的自己,但是在单task模式下,无论如何都只能同时存在1个

<activity android:name=".MainActivity"android:launchMode="singleTask">

附加题:singleInstance
singleInstance与singletask基本一致,但是singleinstance存在于另一任务栈中
比如activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的activity,除非这个独特的任务栈被系统销毁了
实验的话可以通过新建一个activity2页面设置为singleInstance模式,并设置任务id回显即可

Android Studio学习#2相关推荐

  1. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView

    说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...

  2. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

  3. Android Studio 学习实例记录-手电筒

    Android Studio 学习实例记录-手电筒 刚安装好Android Studio3.1.2,上网搜了一个实例进行实践学习,仅用这篇文章来记录学习过程 MainActivity.java的源码来 ...

  4. 安卓开发Android studio学习笔记12:读取解析XML(案例演示)

    Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...

  5. android studio gradle 添加jar,android studio学习----通过gradle来导入jar包

    转载地址:http://www.th7.cn/Program/Android/201507/495477.shtml File->Project Structure 可以打开下面的图: 1.通过 ...

  6. Android Studio学习记录之简单的页面切换及宫格菜单

    Android Studio学习记录之简单的页面切换及宫格菜单 之前上课听老师讲的一些东西自己其实并没有消化,今天把不懂的都去网上搜了一下,有了一种恍然大悟的感觉,包括很多方方面面的东西.有些东西听说 ...

  7. 【Android Studio学习】第二篇、APP实现画简易的波形图

    目录 第一部分.前言 1.效果展示 2.参考博客 3.实现方式 第二部分.详细步骤 1.添加波形函数的依赖 2.添加一个管理类 3.修改activity_main.xml文件的代码 4.修改MainA ...

  8. android studio 学习入门篇

    开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a new Android Studio Project创建工程: 接下来需要输入应用名称(第一个字母要大写 ...

  9. Android Studio 学习资料大全

    Android Studio / Gradle学习资源 在说设置之前,先上点学习Android Studio和Gradle的学习资源. 官方教程 developer.android.com上的Andr ...

  10. 【安卓开发】android studio 学习入门篇

    以下内容转载自:https://blog.csdn.net/myosotis5/article/details/79208707 (为防止链接失效,特备份文章内容,侵删) 开发第一应用 可以开发属于自 ...

最新文章

  1. Linux程序开机启动
  2. JVM调优:G1三色标记算法
  3. 十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...
  4. 新想法!华科、清华、康奈尔联合提出“圆形卷积”!聚合方形和圆形优势
  5. centos7 卸载安装失败的mysql7
  6. asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案--ZT
  7. android 组件生命周期,Android组件化开发实践(五):组件生命周期管理
  8. js之如何获取css样式
  9. 传智播客 C/C++学习笔记 二级指针作为输出参数以及空间的释放
  10. 家庭版完全免费,下面的注册码为:avast! 4 pro(专业版)的
  11. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)
  12. curl 命令测试post请求
  13. 2022年信息学奥赛介绍
  14. STM32H7 at070tn92 LTDC SDRAM 调试笔记
  15. 论文中出现的 cf. i.e. s.t. e.g. w.r.t. et al. etc等英文缩写是什么意思
  16. Soapui报错There are currently 1 running SoapUI MockServices解决办法
  17. 【幺幺肆】低成本自制BT/PT下载用数据服务器(肆某带你自制NAS)--第一部分--前期准备
  18. Java Applet基础
  19. MySQL SELECT查询语句练习2(中级篇)
  20. 正大期货本周财经大事抢先看

热门文章

  1. 淘宝最基础的优化:标题优化
  2. 实时可视化大数据项目01 -- 项目介绍
  3. Sensor Flicker (Sensor banding现象)
  4. QNAP 威联通 NAS的个人使用经验 篇二:QTS系统各功能讲解
  5. STM32CubeIDE
  6. 网站URL如何SEO优化
  7. HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。
  8. ListNode的理解
  9. C++实现石头剪刀布
  10. python数据分析中data_dict={h:v for h,v in zip(header,zip(header,zip(*value)}的含义