Android 浅谈 Activity(上)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Activity 是 Android 四大组件之一 ,可以说一个Android手机里处处都是它的影子,个人认为,它的出现频率比另外三个组件的总和还要高。既然如此,那什么是Activity呢?今天我就稍微浅谈一下我对Activity的认识,由于笔者才疏学浅,有错误的地方还请各位多加指正。

首先,学习Android我认为最有效的方式就是看官方文档,因为这是最权威的地方。官方文档是这么描述Activity的:

AnActivity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface. The window typically fills the screen, but may be smaller than the screen and float on top of other windows.


其实它的意思就是说Activity是一个应用程序的组件,可以和用户做交互,比如打电话、拍照啊等等。

接下来我们来了解一下Activity的起源和用法。

一、Activity的生命周期

就像一个人要经历从出生到死亡一样,Activity也有自己的生命周期,并且在特定的时候会走相应的生命周期。

官方文档用一张图说明了Activity的生命周期,如下:


当Activity启动的时候首先会走onCreate,销毁的时候会走onDestroy。Activity可以在多种形态间进行切换,并以此来控制自己的生命周期。

onCreate():

文档说,这是你必须实现的一个方法,当创建了你的Activity时,这是系统第一个走的生命周期,你可以在这里做一些初始化工作,比如调用setContentView去加载界面布局或者初始化一些数据等等。

onStart():

这表示当前Activity正在被启动,而这个时候其实Activity已经可见了,但是还不能与我们进行交互。因为它还没有出现在前台,只是在后台。

onResume():

表示Activity已经出现在前台,并且可以跟我们进行交互。它跟onStart()的区别就是,一个在前台并且可交互而另一个在后台还不能交互。

onPause():

这个状态,就是说当Activity被挡住一部分的时候会回调,注意:是挡住一部分。就是说,这个时候Activity已经没有焦点了,接受不到用户的输入了。一般情况下,走完这个生命周期接下来onStop()会被调用。后面会提到其他情况。

onStop():

当Activity被完全覆盖,即不能被用户所看到的时候会回调这个方法,此时Activity已经不可见,仅仅在后台运行。我们可以在这里做一些回收的工作,比如数据的保存或者动画的停止,但不要太耗时。

onDestroy():

表示Activity被销毁,这是Activity生命周期里的最后一个回调,如字面意思,就是销毁,在这里可以做一些回收工作以及资源的释放。

onRestart():

也许你注意到上图右边还有一个生命周期,为什么这个在右边呢?它表示的意思是重新启动,也就是说当Activity从不可见的状态切换回可见时会回调这个方法。比如说当你突然接到了一个电话,挂了电话之后再回来时,这就经历了从可见变为不可见再变为可见的一个过程。就会回调这个方法。

说了一大堆概念,是时候搞一搞代码了。

<span style="font-size:14px;"><span style="font-size:14px;">public class MainActivity extends Activity {

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		System.out.println("MainActivity.onCreate");
	}

	@Override
	protected void onStart() {
		super.onStart();

		System.out.println("MainActivity.onStart");
	}

	@Override
	protected void onResume() {
		super.onResume();

		System.out.println("MainActivity.onResume");
	}

	@Override
	protected void onPause() {
		super.onPause();

		System.out.println("MainActivity.onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();

		System.out.println("MainActivity.onStop");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();

		System.out.println("MainActivity.onDestroy");
	}

	@Override
	protected void onRestart() {
		super.onRestart();

		System.out.println("MainActivity.onRestart");
	}
}</span></span>
当程序运行的时候

<span style="font-size:14px;"><span style="font-size:14px;">09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onCreate
09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onStart
09-12 18:56:10.816 9604-9604/? I/System.out: MainActivity.onResume</span></span>

当我按Home键时

<span style="font-size:14px;"><span style="font-size:14px;">09-12 18:59:13.476 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onPause
09-12 18:59:14.040 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStop</span></span>
当我再次进入时

<span style="font-size:14px;"><span style="font-size:14px;">09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onRestart
09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStart
09-12 19:00:51.536 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onResume</span></span>
而此时如果我按后退键

<span style="font-size:14px;"><span style="font-size:14px;">09-12 19:01:26.252 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onPause
09-12 19:01:26.712 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onStop
09-12 19:01:26.712 9604-9604/com.mesmerize.activitytest I/System.out: MainActivity.onDestroy
</span></span>

基于以上现象,我们来总结一下:

(1)当应用第一次启动,回调:onCreate->onStart->onResume。

(2)当切换到后台时,回调:onPause->onStop。

(3)当再次回来,回调:onRestart->onStart->onResume。

(4)当我按返回键的时候,回调:onPause->onStop->onDestroy。

二、创建一个Activity

讲了那么多偏概念性的东西,那么我们该怎么去使用它呢?

打开官方文档看一下,发现是这么说的:

To create an activity, you must create a subclass ofActivity(or an existing subclass of it). In your subclass, you need to implement callback methods that the system calls when the activity transitions between various states of its lifecycle, such as when the activity is being created, stopped, resumed, or destroyed. The two most important callback methods are:

onCreate()
You must implement this method. The system calls this when creating your activity. Within your implementation, you should initialize the essential components of your activity. Most importantly, this is where you must callsetContentView() to define the layout for the activity's user interface.

官方文档上说,首先你要创建一个类继承自Activity或者Activity的子类,这是第一步。其次,你要实现它的一些方法,比如onCreate()、onResume()、onStop()、onDestroy()等等,这是第二步。最后还要记得在manifest里声明。

其实简而言之就是三部曲:一继承二重写三声明。

<span style="font-size:14px;"><span style="font-size:14px;"></span><pre name="code" class="java"><span style="font-size:14px;">public class MainActivity extends Activity {// 第一步 继承Activity或者其子类

	</span></span>
<span style="font-size:14px;"><span style="font-size:14px;"><span style="white-space:pre">	</span>// 第二步 重写onCreate方法(必须重写的)
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		System.out.println("MainActivity.onCreate");
	}

}</span></span>


第三步,清单文件声明

<span style="font-size:14px;"><activity android:name=".MainActivity"><span style="white-space:pre">					</span>// 声明的Activity的名字,全类名
            <intent-filter><span style="white-space:pre">						</span>// 意图过滤器
                <action android:name="android.intent.action.MAIN" /> <span style="white-space:pre">	</span>// 动作

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity></span>


做了这些之后,我们就做好了创建Activity了。

我们经常看到点击了某个按钮之后就切换了一个页面,接下来看一看如何进行页面之间的跳转。

按照三部曲的形式再创建一个Activity,比如叫SecondActivity,然后给按钮写一个点击事件,当点击的时候,执行以下代码:

<span style="font-size:14px;">Intent intent = new Intent(MainActivity.this, SecondActivity.class);
		
startActivity(intent);</span>

这样就可以开启一个名为SecondActivity的页面了,这叫做通过intent意图开启一个Activity

intent 意思是意图,上述的开启方式叫显示意图,还有另一种开启的形式叫隐式意图,如下:

<span style="font-size:14px;">Intent intent = new Intent();
// 这里的setAction就是AndroidManifest.xml中的action的name值		
intent.setAction("com.mesmerize.activity.SecondActivity");
		
startActivity(intent);</span>


如果是用隐式意图的形式开启Activity,那么切忌清单文件中的category的值一定要为.DEFAULT,不然会导致匹配失败。

以上是两种启动Activity的形式。

但是,有些时候可能是要搞一些系统的东西,比如说发短信、邮箱、打电话,这些可怎么办呢?其实Android已经提供了相应的方法了,比如说官方文档示例是以发邮件为例:

<span style="font-size:14px;">Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
		
startActivity(intent);</span>

这个是官网文档上给的例子,recipientArray其实就是一个容器、数组,因为Android规定邮件必须以数组的形式传入,比如详细点来说:

<span style="font-size:14px;">String[] email = {"50****5@qq.com"}; <span style="white-space:pre">				</span>// 需要注意,email必须以数组形式传入  
Intent intent = new Intent(Intent.ACTION_SEND);  
intent.setType("message/rfc822"); <span style="white-space:pre">				</span>// 设置邮件格式  
intent.putExtra(Intent.EXTRA_EMAIL, email); <span style="white-space:pre">			</span>// 接收人  
intent.putExtra(Intent.EXTRA_CC, email); <span style="white-space:pre">			</span>// 抄送人  
intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); <span style="white-space:pre">	</span>// 主题  
intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); <span style="white-space:pre">		</span>// 正文  
startActivity(Intent.createChooser(intent, "请选择邮件类应用"));  </span>

以上是关于发送邮件的,当然不止这么点功能,还有打电话发短信啊等等,我就不再一一列举了。

希望大家多提意见,共同进步!








Android 事件分发机制详解/ 及Activity启动流程浅谈 目前网上的事件分发机制文章很多,可能大家看了很多,还是很懵逼,这篇文章是我自己总结的事件分发机制,提取了在事件分发机制中,最精华的部分,如果对事件分发还是不太清楚,可以看看这篇文章。 阅读详情

相关推荐

初学者---Android Studio导入项目常见报错

常见报错集合 错误如下:Error:Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after 解决办法: gradle-wrapper.properties里修改了gradle的版本,与之前没有报错的gradle版本一致。就可以了 问题完美解决

xcjean的博客 759

android学习问题记录(一)

1、java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.第一行代码,强制下线功能:代码运行到弹出提示框的时候报错,查阅网上资料,有的说activity继承自AppCompatActivity,需要设置theme为Theme.AppCom...

liu_chen_xi的博客 373

Android Studio的相关错误

1、我用as导入github一个项目astuetz/PagerSlidingTabStrip 出现了Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer。stackoverflow上有一个解决办法是删除buil.gradl

烧烤的技术博客水文集合 961

Android报错MainActivity is not an enclosing class

把画黄色横线那段代码加上,此处参考Java内部类的知识。

qiaidihaonan的博客 478

解决Android studios里报错“MainActivity is not an enclosing class“问题附上解决方法

Android studios里报错 MainActivity is not an enclosing class 刚开始接触Android的时候呢。我啥也不懂就跟着某瓜上的视频开发起项目来,在开发的过程中就遇到了一个问题就是 Mainctivity.this这里报错了。 看下图: 解决方法: ...

一起学习,共同成长。 887

2024年安卓最新Android——浅谈Activity生命周期,海尔面试一般都会问什么

本人从事Android开发已经有十余年,算是一名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。所以在此将我十年载,从萌新小白一步步成长为Android移动开发架构师的学习笔记,从Android四大组件到手写实现一个架构设计,我都有一一的对应笔记为你讲解。当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。

2401_84123201的博客 839

Android 浅谈 Activity

在正文开始之前,我给大家来个段子: 乌龟正在河里洗澡被癞蛤蟆看见了, 乌龟:没见过像我这样的美女吗?看你眼珠子都快要蹦出来了。 癞蛤蟆:妹,你就别逗我了,没有看见我身上已经起鸡皮疙瘩了吗? 只是想让大家放松下,作为一名程序猿不要一直紧绷着大脑。相信大家对 Activity都不陌生,或多或少都有自己的理解,我会从什么是 Activity,创建一个 Activity,实现一个用户界面,如何在清单

文淑的博客 858

Android——浅谈Activity生命周期

1.从硬件来说,移动设备的CPU、电量等受到了一定的限制,如果用户暂时不使用APP时,后台的运行会占用很大部分的内存等资源,这是一种浪费。Activity生命周期机制就是为了终止不影响用户的无用事情,用这些资源去分配其他需要的对象。2.从手机的交互性质来说,只能显示一个APP界面在前台,而不在前台的APP自然优先级会降低,而后台的占用资源的事件不应该影响到前台用户的使用。而生命周期则是确认Activity创建的过程,根据流程创建Activity是该模式的本质,而Activity创建的流程是哪些呢?

2401_85729556的博客 756

浅谈AndroidActivity生命周期

浅谈AndroidActivity生命周期Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的。今天我们就来详细地聊聊Activity的生命周...

angyunlin5641的博客 222

Android 浅谈 Activity (下)

暂存

programming_path的博客 318

浅谈androidactivity

Activity生命周期 和 J2ME 的 MIDlet 一样,在 android 中,Activity生命周期交给系统统一管理。与 MIDlet 不同的是安装在 android 中的所有的 Activity 都是平等的。 Activity 的状态及状态间的转换 在 android 中,Activity 拥有四种基本状态: Active/Runing一个新 Activit

gaohongijj的专栏 693

Android 浅谈 Activity(中)

上篇内容讲一些比较基本和简单的用法,这篇稍微说一些相对来来说比较高级一点的用法。数据传递举例来讲:当前页面上有一个EditText用于接收用户输入信息,当点击一个按钮,开启下一个页面,并在写个页面显示用户所输入的文字,怎么做? 这就涉及到了Activity之间数据传递。 而通过Intent就可以做到这个功能,查看官方API发现Intent有一个putExtra的方法,接收很多种数据类型,如图:

programming_path的博客 687

浅谈AndroidActivity启动流程介绍

4 Activity相关介绍 Activityandroid四大组件之一,主要用于显示用户界面,通过上面的章节我们已经知道,App Client如果要向系统屏幕输出图形数据,需要通过Surface来实现,那在开发过程中,调用Activity的setContentView来设置自定义视图,这个视图的图形数据是如何关联到Surface的呢?接下去就对相关内容做简单介绍。 Android通过

拿节 943

2024年安卓最新Android——浅谈Activity生命周期(1),2024最新阿里Android高级面试题总结

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。

2401_84123201的博客 931
下一篇: Android 浅谈 Activity(中)
临风眠
博客等级 码龄10年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值