Code前端首页关于Code前端联系我们

科特林面试题!花了两周时间解决了

terry 2年前 (2023-09-22) 阅读数 80 #移动小程序

从个人角度来说,我想写一个30岁码农的感受:确实,年龄的压力开始增大了。比如,一个二十多岁的年轻人什么都知道,知道团体的事情。有时我也会想,是不是我智商不够,是不是我自主学习能力太弱,是不是我基础不好,是不是别人加班,你知道30多岁带来的危机感吗?

这是一个让我印象深刻的问题。显然这是第一次。当时我去一家公司(暂且称之为T公司)面试韩国三星的工作机会。 T公司的面试官以Bely和架构师的名字命名。显然,当时的Android开发是一种稀缺资源,了解Service是一件大事。当然,Bely不想让我难堪(毕竞工作了4年多了,是个帅哥)。我回答得很简单:

Service是一个Android组件,专门负责在后台处理长期任务。它没有用户界面。启动方法有两种,startService和bindService。

他猜对了,Bely接着问我:两种首发方式有什么区别。

startService 正在启动服务。触发它的组件(例如 Activity)未连接到 Service。只有当Service调用stopSelf或者其他组件调用stopService时,服务才会终止。
bindService 方法启动服务。其他组件可以通过回调获取Service代理对象并与Service进行交互。双方均有约束力。当发起者被销毁时,Service也会自动解绑。在其运行期间,只有当所有绑定都已终止时,服务才会被销毁。

这是一个关键的区别。面试之前,我用 Serivce 做了一个音乐播放器。几年后,我在深圳采访了很多人,其中60-70%的人没有使用Service的经验,这给我的感觉是深圳的Android发展比较蓬勃。因为这里的工作机会非常多,初级开发人员都追求急功近利,自己不用付出太多努力就能找到工作(当然,这是片面的看法)。

当然还有其他的区别,比如两次调用对Service生命周期函数的影响。面试官还可以就这个问题展开阐述。

kotlin面试题!耗时两个礼拜才解决

当我遇到一个知道如何使用Service并且能够像几年前一样轻松回答startService和bindService之间的区别的提问者时,我通常会多问一个问题:

一个服务的onCreate回调函数可以。消耗。时间操作?

很多人说:是的。

真面目已显露。您之前的回答只是面试前问题的预览。如果你知道 Service onCreate 是在主线程(ActivityThread)中调用的,并且耗时操作阻塞了 UI,我通常会问:

如果你需要耗时操作,你会怎么做?

问题是这样展开的。一个人是否真正理解原理并能灵活运用,一目了然。当提问者回答完线程和Handler方法后,我再问提问者:

你熟悉IntentService吗?IntentService是在什么场景下使用的?

面试官也希望看到这一点。一个真正的项目需要开发人员对某个问题有一定的深度,并且对整个Android有一定的知识广度。深度是指这个人认真对待问题并具有求知精神,广度是指当面对同样的问题时,会更容易在几种可行的解决方案中选择最合适的解决方案。

该服务在实际项目中被很多人忽视。为什么我一再强调服务很重要?我们来看看,如果我们对Service完全一无所知,我们在工作中会遇到哪些问题。

场景:如果应用程序想要从 Internet 下载 MP3 文件并在 Activity 上显示进度条,则该 Activity 需要屏幕旋转。因此当屏幕旋转时 Actvitiy 会重新启动。如何保证下载进度条能够正确显示进度?

对服务不了解的人通常会想到以下解决方案:

  1. 在屏幕旋转之前缓存进程,然后在屏幕旋转之后读取它。
  2. 使用 android:configChanges 来防止 Activity 在屏幕更改时被破坏和重建。

对于第一个选项,我还是问他进度值存放在哪里?在屏幕传输过程中,我们知道 Activity 重建相对耗时,可能需要数百毫秒以上。目前,下载线程仍在工作,进度与保存过程无法一致。我们该如何处理这个问题呢? ?

你可以考虑第二种方案。在实际项目中,你可能需要做一些额外的事情来处理ContentView的水平和垂直布局。

如果使用服务来解决问题,看起来很完美,但它涉及到 Activity(UI)和服务之间的交互。我们稍后会讨论这个问题。

结语

如果你想成为一名优秀的Android开发者,请集中精力深入研究基础知识和重要的事情。

对于很多年轻、中级的Android工程师来说,想要提升自己的技能,往往就得自己去探索和发展。不规律的学习效率低、时间长、无益。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门