撸撸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 NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络