Activity简介及对生命周期的可能影响因素探究

前言

https://mp.csdn.net/mdeditor/92801025#

简介

Activity是一个用户可以接触到最直接的一个单位,几乎所有的activity都会和用户交互,activity会通过setContentView加载一个UI布局来创建一个窗口,很多情况下它是以全屏的方式呈现,但是它也可以以对话框的形式呈现,或者嵌入到其他的activity中。

生命周期

首先上图镇楼
在这里插入图片描述

onCreate:

在第一次创建活动时调用,一般在该方法中使用setContentView()加载布局和控件、对象等的初始化操作。

onStart:

当活动变得对用户可见时调用。

onRestart:

在活动停止后再次启动之前调用。

onResume:

当活动开始与用户交互时调用。

onPause:

当activity失去焦点的时候调用。这个方法通常代表着系统开始准备离开当前activity去启动或者恢复另一个activity;在这里通常会进行一些数据的保存操作(一般使用ContentProvider)。

onStop:

当activity不再对用户可见时调用,因为另一个activity已恢复并且正在覆盖此activity
简单点说activity就是手机提供给用户一个可以交互的界面,然后这个界面也有生老病死这样的现象。

注册

当我们创建完一个activity后需要在AndroidManifest.xml(清单文件)中进行activity的注册。比如我创建一个名为LinearActivity的activity,在我们运行的时候需要在清单文件中的application节点下使用activity节点进行声明:

在这里插入图片描述

Activity的启动模式

补充:

1、 一般情况下一个应用程序是由多个组件组成,这组件将以进程为载体相互协作实现app的相关功能。
2、 进程,进程是正在运行的程序的实例,是并发执行的程序在执行过程中分配和管理资源的基本单位。
3、 任务栈(task stack),任务栈用来存放用户开启的activity,在应用程序创建之初,系统会默认分配一个任务栈。当任务栈中的最后一个activity被销毁时,对应的应用程序将被关闭,并且清除任务栈,但是会保留该程序的进程。
4、 Affinity,默认状况下,拥有同一个affinity的activity在同一个任务栈中,任务栈的affinity属性由根activity的affinity属性决定,application的affinity属性默认状态下是应用程序的包名。
5、 Activity在栈中是先进后出的原则。

正文:

Standard

默认启动模式:每次启动这个activity,不管这个实例是否存在,都会创建一个新的实例,并且谁启动了这个activity,该activity就会属于启动它的activity所在的任务栈中。

SingleTop

栈顶复用模式,如果该activity已经处于栈顶,那么该activity则不会被重复创建,如果不存在,则创建一个新的activity。该模式常用于通过通知栏跳转到的页面。

SingleTask

栈内复用模式,如果该activity在栈中已经存在,那么不管它是否处于栈顶,都将进行复用,复用时将会将它上面的activity全部出栈,并且调用onNewIntent方法,如果不存在则创建。该模式可用于首页的activity。

SingleInstance

全局唯一模式,通过该模式启动的activity会单独占用一个任务栈,具有全局唯一性,如果该activity已经存在,那么在启动它的时候,系统会将它所在的任务调度到前台。系统工具常使用。

备注:

设置activity的启动模式,可以通过在清单文件中设置,也可通过java代码动态设置,并且动态设置高于静态设置。

Activity的几个重要方法

onSaveInstanceState和onRestoreInstanceState

当activity由于系统原因被杀掉时,activity将会调用onSaveInstanceState方法传入一个bundle对象进行保存数据的操作,然后在onRestoreInstanceState方法中通过bundle再将数据取出来。Android中已经将ui控件进行了封装,我们不需要进行相关操作,我们需要对属于本类中变量进行保存的操作。
新建TestActivity,在布局中放入一个输入框两个button,其中一个button的作用是将输入框中的内容赋值给变量edtStr,另一个button是将变量以Toast的形式弹出。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容" />

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="提交" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试" />

</LinearLayout>

java代码

String edtStr = "";
	EditText edt;
	Button btn;
	Button btn2;

		edt = (EditText) findViewById(R.id.edt);
		btn = (Button) findViewById(R.id.btn);
		btn2 = (Button) findViewById(R.id.btn2);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				edtStr = edt.getText() == null ? "" : edt.getText().toString();
			}
		});

		btn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(TestActivity.this, edtStr, Toast.LENGTH_SHORT).show();
			}
		});


在输入框中随意输入内容,然后点击“提交”按钮,然后点击“测试”按钮会弹出刚才输入的内容,然后旋转屏幕变为横屏,点击“测试”按钮,会发现弹出的内容为空。
然后重写onSaveInstanceState和onRestoreInstanceState方法,如下:

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onRestoreInstanceState(savedInstanceState);
		edtStr=savedInstanceState.getString("edt");
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		super.onSaveInstanceState(outState);
		outState.putString("edt", edtStr);
	}

然后重复刚才的操作可以发现无论怎么切换都可以弹出输入框中的内容。

对生命周期的可能影响因素探究

(1)普通对话框对生命周期的影响:

new AlertDialog.Builder(mContext).setTitle("测试")
						.setPositiveButton("确定", new android.content.DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
								dialog.dismiss();
							}
						}).show();

查看打印的log日志,对activity的生命周期并无影响;
在这里插入图片描述

(2)当其他activity设置为dialog模式弹出时:

创建activity并且设置该activity为dialog模式,查看log日志,activity会执行onPause方法;
在这里插入图片描述
onPause方法是当系统启动另一个activity时才会执行的一个方法。

(3)启动一个普通的activity时:

创建activity,并且在MainActivity中通过intent启动该activity,查看log日志,activity会执行onPause->onStop;当我们点击返回键再次返回到该activity时,activity会执行onRestart->onStart->onResum;
在这里插入图片描述

(4)手机返回键对activity生命周期的影响

在activity界面点击返回键,查看log日志,可以看到activity的生命周期走了onPause->onstop->ondestroy;
在这里插入图片描述

(5)手机home键对activity生命周期的影响

在activity页面点击home键,查看log日志,可以看到activity的生命周期走了onPause->onStop;
在这里插入图片描述

(6)手机灭屏对生命周期的影响

在activity页面,等待手机灭屏,查看log日志,可以看到activity的生命周期走了onpause->onstop;
在这里插入图片描述

(7)默认状态下横竖屏切换对生命周期的影响

查看log日志可知,activity首先会销毁当前activity,然后再重新走onCreate->onStart->onPause方法。
在这里插入图片描述

加入我的行列:

(嘿嘿嘿,点击这里关于我哦,分享小知识):https://www.jianshu.com/p/7d19f0df5b6b

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值