Android面试知识笔记:那些年面试官常问的知识点

IntentService

继承于Service,启动方式与Service的传统启动方式一样,不同点在于内部有一个线程来处理耗时操作,当任务执行完成时服务会自动停止。

Activity的启动模式

  • standard:标准模式,默认的启动模式,不管是否已经存在实例都会生成新的实例

  • singleTop:栈顶复用模式,如果发现有对应Activity的实例正位于栈顶,则直接打开此页面,不再生成新的实例,同时onNewIntent方法会被执行,onCreate跟onStart方法都不会执行。否则跟standard模式一样继续生成新的实例。

  • singleTask:站内复用模式,如果栈内存在对应Activity的实例就会复用这个Activity,复用时会将它上面的Activity全部出栈,同时onNewIntent方法也会被执行。

  • singleInstance:单例模式,该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

Activity的启动过程

app启动的过程有两种情况,第一种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity来启动一个新的activity。

1.Luncher.startActivitySafely()

public final class Launcher extends Activity

implements View.OnClickListener,

OnLongClickListener,

LauncherModel.Callbacks,

AllAppsView.Watcher {

void startActivitySafely(Intent intent, Object tag) {

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

try {

startActivity(intent);

} catch (ActivityNotFoundException e) {

} catch (SecurityException e) {

}

}

}

2.Activity.startActivity

public class Activity extends ContextThemeWrapper

implements LayoutInflater.Factory,

Window.Callback, KeyEvent.Callback,

OnCreateContextMenuListener, ComponentCallbacks {

@Override

public void startActivity(Intent intent) {

startActivityForResult(intent, -1);

}

}

3.Activity.startActivityForResult

public class Activity extends ContextThemeWrapper

implements LayoutInflater.Factory,

Window.Callback, KeyEvent.Callback,

OnCreateContextMenuListener, ComponentCallbacks {

public void startActivityForResult(Intent intent, int requestCode) {

if (mParent == null) {

Instrumentation.ActivityResult ar =

mInstrumentation.execStartActivity(

this, mMainThread.getApplicationThread(), mToken, this,

intent, requestCode);

} else {

}

}

4.Instrumentation.execStartActivity

public class Instrumentation {

public ActivityResult execStartActivity(

Context who, IBinder contextThread, IBinder token, Activity target,

Intent intent, int requestCode) {

IApplicationThread whoThread = (IApplicationThread) contextThread;

if (mActivityMonitors != null) {

}

try {

int result = ActivityManagerNative.getDefault()

.startActivity(whoThread, intent,

intent.resolveTypeIfNeeded(who.getContentResolver()),

null, 0, token, target != null ? target.mEmbeddedID : null,

requestCode, false, false);

} catch (RemoteException e) {

}

return null;

}

}

这里的ActivityManagerNative.getDefault返回ActivityManagerService的远程接口,即ActivityManagerProxy接口

5.ActivityManagerProxy.startActivity

class ActivityManagerProxy implements IActivityManager

{

public int startActivity(IApplicationThread caller, Intent intent,

String resolvedType, Uri[] grantedUriPermissions, int grantedMode,

IBinder resultTo, String resultWho,

int requestCode, boolean onlyIfNeeded,

boolean debug) throws RemoteException {

Parcel data = Parcel.obtain();

Parcel reply = Parcel.obtain();

data.writeInterfaceToken(IActivityManager.descriptor);

data.writeStrongBinder(caller != null ? caller.asBinder() : null);

intent.writeToParcel(data, 0);

data.writeString(resolvedType);

data.writeTypedArray(grantedUriPermissions, 0);

data.writeInt(grantedMode);

data.writeStrongBinder(resultTo);

data.writeString(resultWho);

data.writeInt(requestCode);

data.writeInt(onlyIfNeeded ? 1 : 0);

data.writeInt(debug ? 1 : 0);

mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);

reply.readException();

int result = reply.readInt();

reply.recycle();

data.recycle();

return result;

}

}

6.ActivityManagerService.startActivity

Context

Context是一个抽象基类,翻译为上下文,也可以理解为环境,提供一些程序运行基础信息。

Context有两个子类,ContextWrapper是上下文功能的封装类,而 ContextImpl 则是上下文功能的实现类。而 ContextWrapper 又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

Activity、Window、View三者之间的关系

  • Activity 构造的时候会初始化一个Window( PhoneWindw )

  • PhoneWindow 有一个 RootView ,这个RootView 是一个ViewGroup,是最初始的根视图

  • RootView 通过 addView 方法来一个个添加 View

View的绘制流程

View的绘制流程:onMeasure -> onLayout -> onDraw

第一步:onMeasure 测量视图大小,从顶层父View到子View递归调用 measure 方法,measure 方法又回调 onMeasure方法。

第二步:onLayout 确定View位置,进行页面布局。从顶层父View向子View递归调用 layout 方法的过程,即父View根据上一步 measure 得到的布局大小和布局参数,将子View放在合适的位置上。

第三步:onDraw 绘制视图。主要步骤为①:绘制背景,②:绘制自己,③:绘制子View,④:绘制滚动条

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

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

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-7lARHKe4-1712780297408)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值