Android基础相关面试问题-activity面试问题(生命周期,任务栈,启动模式,跳转协议,启动流程)
关于Android的一些面试题在15年就已经开了这个专栏了,但是一直木有坚持收集,而每次面对想要跳槽时大脑一片空白,也有些恐惧,因为毕境面试都是纯技术的沟通,要想让公司对你的技术能有所认可会全方位的进行考量,而面试是临时不能抱浮脚,总结就至关重要啦,所以接下来还是强制让自己不断收集面试相关的东东,争取一年之后再对于面试可以抱着一个非常平和自信的心态,当然自信是源自于强大的知识总结,只有总结的足够丰富之后自信自然而然就来了,接下来会从基础开始一点点进行总结。
这次先从最基础的Activity入手进行总结,下面开始:
生命周期:
1、Activity的4种状态:
- running:说明Activity处于一个活动状态,用户可以点击屏幕并做出响应,它是处于Activity栈顶的。
- paused:表明Activity是失去焦点时候,或者被一个非全屏的Activity给占据,还有可能被一个透明的Activity放置在栈顶,这时它还是可见的状态只是失去焦点了。其Activity的成员变量啥的内存都是存在的,除非是内存比较紧张的话可能被销毁掉。
- stopped:当一个Activity被一个Activity完全给覆盖了,这时它不再是可见状态了,跟paused状态一样在内存充足的情况下都会存在,除了内存不足才有可能被销毁掉。
- killed:表明Activity是已经被回收掉了。
2、Activity生命周期分析:
这里分几个维度来对其进行分析:
- Activity启动 --> onCreate() --> onStart() -> onResume()。
- 点击Home键回到主界面(Activity不可见) --> onPause() --> onStop()。
- 当我们再次回到原Activity时 --> onRestart() --> onStart() --> onResume()。
- 退出当前Activity时 --> onPause() --> onStop() --> onDestroy()。
Android进程优先级:
- 前台进程:处理跟用户交互的Activity,或者在前台绑定的Service。
- 可见进程:处于前台但是不能点击的进程则为可见进程。
- 服务进程:顾名思义就是开启了服务的进程。
- 后台进程:将前台的Activity前台进程按home键时,这时就变为了后台进程,此时的后台进程如果在内存不足的情况下是会被killed掉的。
- 空进程:不属于前面四种进程类型的进程既为空进程,它只是出于缓存的目的而保留,可能随时被系统杀掉。
Android任务栈:
先贴一下官网对于它的一个说明图:
栈很显然就是后进先出的数据结构,每次打开或退出一个Activity都会在一个任务栈中添加或删除一个Activity组件,所以一个栈其实就是包含Activity的集合,Android可以通过任务栈有序的管理每一个Activity,而理解好任务栈对于理解Activity的启动模式是相辅相成的,正因为有启动模式所以说才要有任务栈的概念,而任务栈又是根据启动模式更好的显现出来。对于Android来说当退出应用程序的时候必须要把任务当中的所有Activity清除出栈,这时才能安全完全地退出程序,任务栈只有被销毁了才是处于数据最安全的状态,而如果不销毁的话就得合理的保存这个任务栈,这时就会保留Activity的状态和信息。另外任务栈并不是唯一的,一个APP中可能存在多个任务栈,而有时一个Activity可以独享一个任务栈,这就涉及到了启动模式的概念了。
启动模式:
- standard:这个就是默认的情况下,每次启动Activity都会重新创建一个新的实例,并将它加入任务栈中,完全不会考虑栈中是否已经存在该实例了,比较消耗内存。
- singletop:栈顶复用模式,表明每次创建一个Activity时会去任务栈中判断一下有没有这个Activity,而这个判断有个特殊的地方,只是去判断栈顶元素,如果存在则直接复用该栈里面的Activity而不会再次重新创建了,而如果要创建的Activity在栈顶不存在但是在整个栈里面其实是存在的,那此时也会重新创建。
- singletask:栈内复用模式,是个单例模式,它跟singletop有点类似,只是singletop模式只检测栈顶元素,而singletask是检测整个任务栈,如果要启动的Activity存在于栈中了,那么直接将栈中的该Activity置于栈顶,此时需要注意:它会将该Activity以上的所有Activity从栈中移除销毁,最后调用Activity.onNewIntent()方法。
- singleinstance:这是一个比较特珠的启动模式,该Activity独享一个任务栈,而且在它栈里面有且只有一个Activity,这个实际用用得比较少。
scheme跳转协议:
android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转的那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面【其实现就是APP向H5先注册一个scheme协议,然后再通过浏览器来启动App】等。
其应用场景大体有如下三种:
1、服务端可以下发一个URL的路径,APP端根据下发的URL跳到相应的页面。
2、从H5页面跳转到相应的APP页面。
3、APP根据URL跳转到另外一个APP的指定页面。
启动流程:
参考:【https://blog.csdn.net/seeyoumt/article/details/53187704】
Android基础相关面试问题-activity面试问题(生命周期,任务栈,启动模式,跳转协议,启动流程)的更多相关文章
- Android基础_1 四大基本组件介绍与生命周期
Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器). 一.四大基本组件 Acti ...
- 【Android基础】Fragment 详解之Fragment生命周期
上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...
- Android零基础入门第75节:Activity状态和生命周期方法
前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...
- Android基础学习第二篇—Activity
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- android Fragments详解六:处理fragement的生命周期
把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptio ...
- Android学习笔记(六)Fragment的生命周期
在上一篇博文中对Fragment做了简单的介绍,现在再来探讨一下Fragment的生命周期. 一.Fragment的几种状态: 与Activity类似,Fragment也有一下几种状态: · 活动状态 ...
- Activity完整的生命周期
首语:群里看到一位网友说:你能说出Activity的完整生命周期吗?看到这句话,我也在反思自己,我也是个fresh,所以想找个时间仔细的扒一扒Activity生命周期. 首先拿一张简单而又复杂的生命周 ...
随机推荐
- Cocos Creator 中的动作系统那些事儿
动作系统就是可以在一定的时间内实现位移.旋转.缩放.跳动等各种动作. 需要注意的是,动作系统跟 Cocos Creator 编译器的动画系统不同,动作系统是面向程序员的API接口,而动画系统是通过编译 ...
- winform 更新文件上传(一)
using Common; using DevExpress.XtraEditors; using FileModel.UpLoad; using System; using System.Colle ...
- vue项目中兼容ie8以上浏览器的配置
1.首先需要在根目录的index.html文件加入如下代码 <meta http-equiv="X-UA-Compatible" content="IE=edge& ...
- centOS 安装 pm2
安装 npm install -g pm2 自启 pm2 startup centos 启动 pm2 start server/add.js (以实际路径为准) 其他命令: pm2 list #查看进 ...
- SpringBoot整合Redis及Redis工具类
前言 想做一个秒杀项目,问了几个大佬要了项目视频,结果,自己本地实践的时候,发现不太一样,所以写下这篇,为以后做准备. 环境配置 IDE:IDEA 环境:Windows 数据库:Redis Maven ...
- javascript let
es6支持通过let关键字声明属于单独块{}的变量,更好的管理变量作用屿 funtion foo() { var a=1; if (a>1) { let b=2; //只属于if模块 while ...
- JavaSE基础(九)--Java二进制运算
Java二进制运算 Java二进制表示法 首先了解下二进制,二进制是相对十进制而言的,当然还有八进制,十六进制等等,我们常用的都是十进制,计算机用的都是二进制,而符号表示常用十六进制. 二进制就是只有 ...
- 新拉的项目在idea中启动时报如下错误:org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
今天真的是很苦恼,之前启动项目没有任何问题,今天突然启动时给我报了如下一个错误. 详细报错信息: org.apache.catalina.core.ContainerBase.addChildInte ...
- Photon Server 实现注册与登录(五) --- 服务端、客户端完整代码
客户端代码:https://github.com/fotocj007/PhotonDemo_Client 服务端代码:https://github.com/fotocj007/PhotonDemo_s ...
- 【Python】**kwargs和takes 1 positional argument but 2 were given
Python的函数定义中可以在参数里添加**kwargs——简单来说目的是允许添加不定参数名称的参数,并作为字典传递参数.但前提是——你必须提供参数名. 例如下述情况: class C(): def ...