四大组件之Activity

本文全面解析Android中的Activity组件,涵盖其类图结构、生命周期、启动模式及任务管理栈原理。详解Activity如何创建、销毁,以及如何与其他Activity交互,包括显示与隐式意图的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的类图结构
在这里插入图片描述
Activity作为Android的四大组件之一,Activity在Android系统中是以界面的形式进行体现。其中Activity实现了如Window.Callback, KeyEvent.Callback等接口用于与用户进行交互。
文档源码解释
1 一个界面是开发者可以操作的一个重点的独立事项。
2 几乎所有界面都可以与用户交互,所以Activity类负责为用户创建一个窗口,你可以在其中使用setContentView(View)放置UI。
3虽然界面通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过具有windowIsFloating集合的主题)或嵌入另一个活动(使用ActivityGroup)内部。
4几乎所有的Activity子类都会实现两种方法:
onCreate(Bundle)是初始化界面的地方。最重要的是,在这里你通常会调用setContentView(int)和一个定义你的UI的布局资源,并且使用findViewById(int)来检索你需要以编程方式进行交互的那个UI中控件。
onPause()是你对于用户离开界面的处理。最重要的是,此时用户所做的任何更改都应该提交(通常发送给持有数据的ContentProvider。
5 要使用Context.startActivity(),所有界面类必须在其包下的AndroidManifest.xml中具有相应的声明。
如果想要让当前Activity作为启动Activity,则该Activity在清单文件中应该配置为:

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Activity的生命周期
在这里插入图片描述
1 oncreate() ----------------- activity被创建,在第一次创建活动时调用。
这是你应该完成所有常规静态设置的位置:创建视图,将数据绑定到列表等。此方法还会为你提供一个包含Activity先前保存页面状态的Bundle对象(如果有的话)。总是跟着onStart()方法。
2 ondestroy()----------------- activity被销毁的时候调用
3 onStart()--------------------- 当Activity界面变为可视的时候调用
4onStop() --------------------- 当Activity界面变为不可视的时候调用
5onResume()----------------- 当Activity获取焦点的时候调用
6onPause() ------------------ 当界面上按钮不可以被点击 失去焦点时调用。onPause()方法在系统即将开始显示之前的界面时调用。 这通常用于将未保存的更改进行保存,并保存为持久化数据,并且会执行例如停止动画和其他可能消耗CPU的内容等。此方法的实现必须非常快速,因为在此方法返回之前,下一个界面不会显示。

另外还要注意一个横竖屏切换的问题,在切换横竖屏时,如果没有固定方向,Activity就会执行onDestroy()方法。
可以通过在清单文件中声明屏幕方向的方式来固定屏幕方向

android:screenOrientation="portrait"  //代表竖屏
android:screenOrientation="landscape"  //代表横屏

Activity任务与任务管理栈
任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即任务栈)中。
1打开一个Activity叫进栈,关闭一个Activity叫出栈。
2我们操作的Activity永远是栈顶的Activity
3任务栈是用来维护用户操作体验的
4应用程序退出就是任务栈清空了
5一般情况下一个应用程序对应一个任务栈

设备主屏幕是大多数任务的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务将出现在前台。 如果应用不存在任务(应用最近未曾使用),则会创建一个新任务,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。

当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行。 下图 通过时间线显示 Activity 之间的进度以及每个时间点的当前返回栈,直观呈现了这种行为。
参考博文:https://blog.csdn.net/qq_40842611/article/details/79753126?utm_source=copy
在这里插入图片描述
Activity的启动模式
在AndroidManifest.xml文件中为Activity配置相应的launchMode属性可以设置Activity的启动模式,共如下四种模式:

standard
singleTask
singleTop
singleInstance
接下来对四种启动模式进行详细分析。
1、standard模式
标准启动模式:
该模式下每次启动Activity都会重新创建Activity实例,在这种模式下谁启动了这个Actvitiy,那么这个Activity与被启动的Activity位于启动它的Activity的栈中。
2.在这里插入图片描述
在这里插入图片描述
打开新的Activity以及传值
打开新的Activity有两种方式
1startActivity();
2startActivityForResult();

第一种就是单纯打开一个Activity(可以携带数据过去),第二种就是需要从开启的Activity中返回值。
第一种方式

Intent intent=new Intent(this,TestActivity.class);
//intent.putExtra("name","张三");
startActivity(intent);

在TestActivity中接收携带的数据

Intent intent=getIntent();
String name=intent.getStringExtra("name");

第二种方式(返回数据)

Intent intent=new Intent(this, ContactAcitivity.class);
startActivityForResult(intent, 1);

ContactActivity

	//[5.0]把数据返回给调用者
	Intent intent=new Intent();
	intent.putExtra("phone", phone);
	//把结果返回给调用者
	setResult(10, intent);
	//[5.1]关闭当前页面   开启调用者ononActivityResult方法
	finish();

在调用者中接收数据

//当我们开启的Activity 页面关闭的时候 这个方法就调用
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    //用请求码
		if(requestCode==1){
			//代表请求联系人页面的数据
			String phone=data.getStringExtra("phone");
			et_number.setText(phone);
		}else if(requestCode==2){
			//代表请求短信模板页面的数据
            String smsContent=data.getStringExtra("sms");
			et_content.setText(smsContent);
		}
		//用结果码
		/*if (resultCode==10) {
			String phone=data.getStringExtra("phone");
			et_number.setText(phone);
		} else if(resultCode==20){
			String smsContent=data.getStringExtra("sms");
			
			et_content.setText(smsContent);
		}*/
		
		super.onActivityResult(requestCode, resultCode, data);
		
	}

显示意图和隐式意图
以上开启Activity的方式全部都是显示意图。
显示意图通过指定具体的包名和类名来开启Activity
清单文件中只声明,不配置其他信息。

下面介绍隐式意图
隐式意图通过一组动作或数据指明要开启的Activity,该Activity在清单文件中声明时必须定义好这些动作和数据。
在开启其他应用(系统应用)时用隐式意图,例如电话拨号器,短信等
显示意图声明Activity更安全一些,只能由本应用调用该Activity。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值