2024年安卓最新android系统性学习 2(3),2024年最新微信小程序如何跳转页面

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3、singleTask(栈内复用模式)

如果栈中任意位置已经有一个 Activity 实例, 那么这个 Activity 就会被调到栈顶, 始终保持一个实例, 同时回调 onNewIntent() , 并且 singleTask 会清理在当前 Activity 上面的所有 Activity.

应用场景:

程序模块逻辑入口:主页面(Fragment的containerActivity)、WebView页面、扫一扫页面

电商中:购物界面,确认订单界面,付款界面

  • 4、singleInstance(单实例模式)

这个模式和 singleTask 很接近, 只会有一个实例存在. 不同点是持有这个 Activity 的 Task 不能再有其他 Activity 的实例了.

如果从这个 Activity 中启动另外一个不同的 Activity, 将会自动创建一个新的 Task 来存放新的 Activity.

如果从一个已经存在许多 Activity 的 Task 中调用 singleInstance Activity. 这个新 Activity 同样会被放在一个新的 Task 中.

该模式下活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。

那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singlelnstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。

应用场景:系统Launcher、锁屏键、来电显示等系统应用

在singleTop、singleTask、singleInstance 中如果在应用内存在Activity实例,并且再次发生startActivity(Intent intent)回到Activity后,由于并不是重新创建Activity而是复用栈中的实例,因此Activity再获取焦点后并没调用onCreate、onStart,而是直接调用了onNewIntent(Intent intent)函数;

你知道onNewIntent吗?

只有启动模式是 singleTop 或者使用 FLAG_ACTIVITY_SINGLE_TOP 来 startActivity(Intent). 这个方法才回被调用. 如果新 Activity 已经位于任务栈的栈顶, 那么此 Activity 不会被重新创建. 然是调用如下方法:

onNewIntent–>onRestart–>onStart–>onResume.

二、启动过程


三、Intent/flag


上文中的四种模式都是在mainfest的xml文件中进行配置的

还可通过Intent.setFlags(int flags)设置启动模式;

FLAG_ACTIVITY_CLEAR_TOP : 等同于mainfest中配置的singleTask

FLAG_ACTIVITY_SINGLE_TOP: 同样等同于mainfest中配置的singleTop;

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 其对应在AndroidManifest中的属性为android:excludeFromRecents=“true”,当用户按了“最近任务列表”时候,该Task不会出现在最近任务列表中,可达到隐藏应用的目的。

FLAG_ACTIVITY_NO_HISTORY: 对应在AndroidManifest中的属性为:android:noHistory=“true”,这个FLAG启动的Activity,一旦退出,它不会存在于栈中。

FLAG_ACTIVITY_NEW_TASK: 这个属性需要在被start的目标Activity在AndroidManifest.xml文件配置taskAffinity的值【必须和startActivity发其者Activity的包名不一样,如果是跳转另一个App的话可以taskAffinity可以省略】,则会在新标记的Affinity所存在的taskAffinity中压入这个Activity。

四、taskAffinity


Activity 的归属, 也就是 Activity 应该在哪个 Task 中. 一般情况下在同一个应用中, 启动的 Activity 都在同一个 Task 中.

每个 Activity 都有 taskAffinity 属性, 这个属性指出了它希望进入的 Task. 如果一个 Activity 没有显式的指明 taskAffinity, 那么它就会使用 Application 的 taskAffinity, 如果 Application 也没有指明, 那么该 taskAffinity 的值就等于包名

五、生命周期


活动(activity)表示一个单一屏幕上的用户界面。

例如,电子邮件应用程序可能是一个活动,显示新的电子邮件列表是另一个活动,撰写电子邮件,阅读电子邮件可能又是其它的活动。如果应用程序有一个以上的活动,那么应该将其中的一个活动标记为活动启动应用程序。

C,C++ 或者 Java 语言编程,这些程序从 main() 函数开始。

Android系统是从一个Activity 的 onCreate() 方法调用开始启动程序。一个回调方法 - 启动一个活动,以及其它回调方法,如销毁一个活动,活动的生命周期如下图所示序列:

Activity类定义了以下的回调方法,即事件。并不需要实现所有的回调方法。需要了解每一个变化以及实现,以确保应用程序如用户所期望的行为或方式。

| 回调 |

描述

|

| — | — |

|

onCreate()

|

这是第一个回调,在活动第一次创建时调用

|

|

onStart()

|

这个回调在活动为用户可见时被调用

|

|

onResume()

|

这个回调在应用程序与用户开始可交互的时候调用

|

|

onPause()

|

被暂停的活动无法接受用户输入,不能执行任何代码。

在当前活动将要被暂停,上一个活动将要被恢复时调用

|

|

onStop()

|

当活动不在可见时调用

|

|

onDestroy()

|

当活动被系统销毁之前调用

|

|

onRestart()

|

当活动被停止以后重新打开时调用

|

两个 Activity 之间跳转时必然会执行的是哪几个方法

一般情况下比如说有两个 activity, 分别叫 A,B, 当在 A 里面激活 B 的时候, A 会调用 onPause() 方法, 然后 B 调用 onCreate()–>onStart()–>onResume(). 这个时候 B 覆盖了窗体, A 会调用 onStop() 方法. 如果 B 是个透明的或者是对话框的样式, 就不会调用 A 的 onStop() 方法.

六、如何保存 Activity 的状态


覆写 onSaveInstanceState() 方法

Activity 的状态通常情况下系统会自动保存的, 只有当我们需要保存额外的数据时才需要使用到这样的功能.

一般来说, 调用 onPause() 和 onStop() 方法后的 activity 实例仍然存在于内存中, activity 的所有信息和状态数据不会消失, 当 activity 重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用 onPause() 和 onStop() 方法后的 Activity 可能会被系统摧毁, 此时内存中就不会存有该 Activity 的实例对象了, 如果之后这个 Activity 重新回到前台, 之前所作的改变就会消失.

为了避免此种情况的发生, 需要覆写 onSaveInstanceState() 方法. onSaveInstanceState() 方法接受一个 Bundle 类型的参数, 开发者可以将状态数据存储到这个 Bundle 对象中, 这样即使 Activity 被系统摧毁, 当用户重新启动这个 Activity 而调用它的 onCreate()方法时, 上述的 Bundle 对象会作为实参传递给 onCreate()方法, 开发者可以从 Bundle 对象中取出保存的数据, 然后利用这些数据将 activity 恢复到被摧毁之前的状态.

需要注意的是, onSaveInstanceState() 方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下 BACK 键退出 Activity 时, 用户显然想要关闭这个 Activity, 此时是没有必要保存数据以供下次恢复的, 也就是 onSaveInstanceState() 方法不会被调用. 如果调用 onSaveInstanceState() 方法, 调用将发生在 onPause() 或 onStop() 方法之前.

onSaveInstanceState和onRestoreInstanceState

a.出现时机:异常 情况下Activity 重建,非用户主动去销毁

b.系统异常终止时,调用onSavaInstanceState来保存状态。该方法调用在onStop之前,但和onPause没有时序关系。

**onSaveInstanceState与onPause的区别:**前者适用于对临时性状态的保存,而后者适用于对数据的持久化保存。

c.Activity被重新创建时,调用onRestoreInstanceState(该方法在onStart之后),并将onSavaInstanceState保存的Bundle对象作为参数传到onRestoreInstanceState与onCreate方法。

可通过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但需要注意的是,在onCreate取出数据时一定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。

七、如何退出 Activity? 如何安全退出已调用多个 Activity 的 Application?


  1. 通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish() 方法就行.

  2. 发送特定广播: 在需要结束应用时, 发送一个特定的广播, 每个 Activity 收到广播后, 关闭即可.

//给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)

//如果接受到的是 关闭 activity 的广播 activity finish()掉

  1. 递归退出 就调用 finish()方法 把当前的在打开新的 Activity 时使用 startActivityForResult, 然后自己加标志, 在 onActivityResult 中处理, 递归关闭.

  2. 其实也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。 此时如果该任务栈中已经有该 Activity, 那么系统会把这个 Activity 上面的所有 Activity 干掉. 其实相当于给 Activity 配置的启动模式为 SingleTop.

  3. 记录打开的 Activity: 每打开一个 Activity, 就记录下来. 在需要退出时, 关闭每一个 Activity


List<Activity> lists; // 在 application 全局的变量里面` 

`lists = new ArrayList<Activity>;  lists.add(this);  for(Activity activity: lists) {     activity.finish(); }  lists.remove(this);

八、Context, Activity, Appliction 有什么区别?


相同:

Activity 和 Application 都是 Context 的子类

Context 从字面上理解就是上下文的意思, 在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的作用, 方便我们可以简单的访问到各种资源.

不同:

维护的生命周期不同.

  • Activity 维护的是当前的 Activity 的生命周期. 所以其对应的Context也只能访问该 Activity 内的各种资源

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的百度、腾讯、网易、字节跳动、阿里等公司2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ndroid部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值