撸撸Android的羊毛(二)----Activity生命周期

2024-08-22 20:08

本文主要是介绍撸撸Android的羊毛(二)----Activity生命周期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处:https://www.jianshu.com/p/d78c53f4b1b9

前言

部分内容参考Google爸爸的资料:
https://developer.android.google.cn/guide/components/activities?hl=zh-cn
最近由于部门的发展需要,加上就楼主一个一线开发人员,于是乎。惨被HR当做苦力去做技术面试官。在其中楼主发现,一些一两年经验的开发人员对于基础的Android知识不是很了解,所以打算整理一下,面试中一些技术点和面试者对于一些问题自己新颖的看法,希望可以让大家能够升职加薪,走上人生巅峰。。。。
接上上一篇的文章,有喜欢的朋友可以回去查看:
撸撸Android的羊毛(一)----Activity启动模式
本篇将讨论我们面试中经常会被问的问题,Activity的生命周期。

1.什么是Activity

提到Activity,每个做Android开发的程序员都有自己的理解,“展示界面的”,“应用的前端界面”,“功能和展示的实现面”...这里我们直接摘录Google官网对于Activity的定义:

Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

2.如何创建Activity

要创建Activity,就必须继承(extends)并实现其子类,这里我们直接使用系统原生的Activity,其他衍生类如FragmentActivity,AppCompatActivity也基本相似。

public class BActivity extends Activity {long value; // 保存从A传递过来的N值TextView valueTextView;TextView running;TextView result;long fab;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取到从A传递过来的值if (getIntent() != null && getIntent().hasExtra("value")) {value = getIntent().getLongExtra("value", 0);}setContentView(R.layout.b_activity);valueTextView = (TextView) findViewById(R.id.value);running = (TextView) findViewById(R.id.running);result = (TextView) findViewById(R.id.result);// 将获取到的value设置到当前的valueTextView控件上去valueTextView.setText(value + "");running.setVisibility(View.VISIBLE);new MyThread(value).start();}
}

这需要在onCreate方法中使用setContengtView()方法定义当前Activity使用的界面。然后在AndroidManifest文件<application>下注册Activity

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

android:name 属性是唯一必需的属性—它指定 Activity 的类名。应用一旦发布,即不应更改此类名,否则,可能会破坏诸如应用快捷方式等一些功能。

3. Activity 生命周期

3.1 Activity三种存在状态

在讲到Activity的生命周期之前,我们先了解一下Activity的三种存在状态:

  • 继续
    此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)

  • 暂停
    另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态Activity对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。

  • 停止
    该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态Activity 对象保留在内存中,它保留了所有状态和成员信息,但与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。

如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建,也就是会重新调用onCreate方法。

3.2 Activity生命周期方法

Activity的生命周期有七个方法,这里google的网站已经给出一张比较好的参考图:
[图片上传失败...(image-f8198b-1535094868734)]

我们使用一个表格对Activity生命周期中的七个方法做一个总结,并且其中对每一种方法做了更详细的描述,并说明了每一种方法在 Activity 整个生命周期内的位置,包括在方法完成后系统能否终止 Activity。

方法说明是否能事后终止后接
onCreate()首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态。始终后接 onStart()onstart()
onRestart()在 Activity 已停止并即将再次启动前调用。始终后接 onStart() onstart()
onStart()在 Activity 即将对用户可见之前调用。如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()onResume() 或onStop()
onResume在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()onPause()
onPause()当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()onResume() 或onStop()
onStop()在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()onRestart()或onDestroy()
onDestory()在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了 finish(),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 isFinishing() 方法区分这两种情形。

上面的文本对于Activity的生命周期的 7个方法做了一个较为详细的讲解,但是程序员还是采用比较直观的代码展现:

public class FirstActivity extends Activity implements OnClickListener{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("Activity LifeCycle","FirstActivity----->onCreate");setContentView(R.layout.first_layout);findViewById(R.id.pause).setOnClickListener(this);findViewById(R.id.pause_stop).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()) {case R.id.pause://跳转到一个非全屏的activity 或者一个全透明的activityIntent intent = new Intent(this, TransparentActivity.class);startActivity(intent);break;case R.id.pause_stop:Intent intent2 = new Intent(this, SecondActivity.class);startActivity(intent2);break;}}@Overrideprotected void onStart() {super.onStart();Log.d("Activity LifeCycle","FirstActivity----->onStart");}@Overrideprotected void onResume() {super.onResume();Log.d("Activity LifeCycle","FirstActivity----->onResume");}@Overrideprotected void onPause() {super.onPause();Log.d("Activity LifeCycle","FirstActivity----->onPause");}@Overrideprotected void onStop() {super.onStop();Log.d("Activity LifeCycle","FirstActivity----->onStop");}@Overrideprotected void onRestart() {super.onRestart();Log.d("Activity LifeCycle","FirstActivity----->onRestart");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("Activity LifeCycle","FirstActivity----->onDestroy");}
}

之后我们会使用该类来实现相应的操作,验证流程。
首先,我们进入该activity,


2326194-3bae2b615dfeca98.png
image.png

然后我们查看logcat下的日志


2326194-4773ffffc9922ad2.png
image.png

此时activity经过onCreate--->onStart--->onResume,Activity获取到焦点,并展示在界面上。
然后我们点击home键,这时logcat日志如下:
2326194-d199866cadcdbde9.png
image.png

过程中activity经过onPause---->onStop最终是去焦点,并退到后台栈中。
再次启动该界面,logcat展示:


2326194-51d0f3fc33ffca3f.png
image.png

在这过程中activity经过onStart---->onResume 最终获取焦点,展示在界面上。
我们退出该界面,logcat展示如下:
2326194-19570c57ddda8420.png
image.png

在这过程中activity经过onPause-->onStop--->onDestroy.结合之前的google官方图,能够很好的了解Activity的生命周期

学习的参考项目在我的github下,该项目是我从学习到现在整理的一些常用资料,欢迎大家star
https://github.com/jixiang52002/MyAndroid

这篇关于撸撸Android的羊毛(二)----Activity生命周期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097270

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到