4、广播的两种注册方式有什么区别?

5、广播发送和接收的原理了解吗?

6、ContentProvider、ContentResolver与ContentObserver之间的关系是什么?

7、遇到过哪些关于Fragment的问题,如何处理的?

8、Android里的Intent传递的数据有大小限制吗,如何解决?

9、描述一下Android的事件分发机制?

10、描述一下View的绘制原理?

11、了解APK的打包流程吗,描述一下?

12、了解APK的安装流程吗,描述一下?

13、当点击一个应用图标以后,都发生了什么,描述一下这个过程?

15、BroadcastReceiver与LocalBroadcastReceiver有什么区别?

16、Android Handler机制是做什么的,原理了解吗?

17、Android Binder机制是做什么的,为什么选用Binder,原理了解吗?

18、描述一下Activity的生命周期,这些生命周期是如何管理的?

19、Activity的通信方式有哪些?

20、Android应用里有几种Context对象?

21、描述一下进程和Application的生命周期?

22、Android哪些情况会导致内存泄漏,如何分析内存泄漏?

23、Android有哪几种进程,是如何管理的?

24、SharePreference性能优化,可以做进程同步吗?

25、如何做SQLite升级?

26、进程保护如何做,如何唤醒其他进程?

27、理解序列化吗,Android为什么引入Parcelable?

28、Android如何在不压缩的情况下加载高清大图?‘

29、Android里的内存缓存和磁盘缓存是怎么实现的?

30、为什么会选择LinkedHashMap呢?

31、PathClassLoader与DexClassLoader有什么区别?

32、WebView优化了解吗,如何提高WebView的加载速度?

33、Java和JS的相互调用怎么实现,有做过什么优化吗?

34、JNI了解吗,Java与C++如何相互调用?

35、了解插件化和热修复吗,它们有什么区别,理解它们的原理吗?

36、如何做性能优化?

37、如果防止过度绘制,如何做布局优化?

38、如何提高代码质量?

39、有没有遇到64k问题,为什么,如何解决?

40、MVC、MVP与MVVM之间的对比分析?

41、如何计算一个Bitmap占用内存的大小,怎么保证加载Bitmap不产生内存溢出?


相关文章:

=====

Android 面试题集 包含答案

记大厂Android开发的一些面试经验

1、Activity如与Service通信?

======================

Intent intent = new Intent(this, LocalService.class);

bindService(intent, mConnection, Context.BIND_AUTO_CREATE);可以通过bindService的方式,先在Activity里实现一个ServiceConnection接口,并将该接口传递给bindService()方法,在ServiceConnection接口的onServiceConnected()方法

里执行相关操作。

2、Service的生命周期与启动方法有什么区别?

=========================

startService():开启Service,调用者退出后Service仍然存在。

bindService():开启Service,调用者退出后Service也随即退出。

生命周期:只是用startService()启动服务:onCreate() -> onStartCommand() -> onDestory

只是用bindService()绑定服务:onCreate() -> onBind() -> onUnBind() -> onDestory

同时使用startService()启动服务与bindService()绑定服务:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory

3、广播分为哪几种,应用场景是什么?

==================

普通广播:调用sendBroadcast()发送,最常用的广播。

有序广播:调用sendOrderedBroadcast(),发出去的广播会被广播接受者按照顺序接收,广播接收者按照Priority属性值从大-小排序,Priority属性相同者,动态注册的广播优先,广播接收者还可以选择对广播进行截断和修改。

4、广播的两种注册方式有什么区别?

=================

静态注册:常驻系统,不受组件生命周期影响,即便应用退出,广播还是可以被接收,耗电、占内存。

动态注册:非常驻,跟随组件的生命变化,组件结束,广播结束。在组件结束前,需要先移除广播,否则容易造成内存泄漏。

5、广播发送和接收的原理了解吗?

================

继承BroadcastReceiver,重写onReceive()方法。

通过Binder机制向ActivityManagerService注册广播。

通过Binder机制向ActivityMangerService发送广播。

ActivityManagerService查找符合相应条件的广播(IntentFilter/Permission)的BroadcastReceiver,将广播发送到BroadcastReceiver所在的消息队列中。

BroadcastReceiver所在消息队列拿到此广播后,回调它的onReceive()方法。

6、ContentProvider、ContentResolver与ContentObserver之间的关系是什么?

==========================================================

ContentProvider的简单使用

ContentProvider:管理数据,提供数据的增删改查操作,数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口,可以用来做进程间数据共享。

ContentResolver:ContentResolver可以不同URI操作不同的ContentProvider中的数据,外部进程可以通过ContentResolver与ContentProvider进行交互。

ContentObserver:观察ContentProvider中的数据变化,并将变化通知给外界。

7、遇到过哪些关于Fragment的问题,如何处理的?

===========================

getActivity()空指针:这种情况一般发生在在异步任务里调用getActivity(),而Fragment已经onDetach(),此时就会有空指针,解决方案是在Fragment里使用

一个全局变量mActivity,在onAttach()方法里赋值,这样可能会引起内存泄漏,但是异步任务没有停止的情况下本身就已经可能内存泄漏,相比直接crash,这种方式

显得更妥当一些。

Fragment视图重叠:在类onCreate()的方法加载Fragment,并且没有判断saveInstanceState==null或if(findFragmentByTag(mFragmentTag) == null),

导致重复加载了同一个Fragment导致重叠。(PS:replace情况下,如果没有加入回退栈,则不判断也不会造成重叠,但建议还是统一判断下)

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

// 在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠 ;

if(saveInstanceState == null){

// 或者 if(findFragmentByTag(mFragmentTag) == null)

// 正常情况下去 加载根Fragment

}

}

8、Android里的Intent传递的数据有大小限制吗,如何解决?

==================================

Intent传递数据大小的限制大概在1M左右,超过这个限制就会静默崩溃。处理方式如下:

进程内:EventBus,文件缓存、磁盘缓存。

进程间:通过ContentProvider进行款进程数据共享和传递。

9、描述一下Android的事件分发机制?

=====================

面试题八:事件分发机制

Android事件分发机制的本质:事件从哪个对象发出,经过哪些对象,最终由哪个对象处理了该事件。此处对象指的是Activity、Window与View。

Android事件的分发顺序:Activity(Window) -> ViewGroup -> View

Android事件的分发主要由三个方法来完成,如下所示:

// 父View调用dispatchTouchEvent()开始分发事件

public boolean dispatchTouchEvent(MotionEvent event){

boolean consume = false;

// 父View决定是否拦截事件

if(onInterceptTouchEvent(event)){

// 父View调用onTouchEvent(event)消费事件,如果该方法返回true,表示

// 该View消费了该事件,后续该事件序列的事件(Down、Move、Up)将不会再传递

// 给其他View。

consume = onTouchEvent(event);

}else{

// 调用子View的dispatchTouchEvent(event)方法继续分发事件

consume = child.dispatchTouchEvent(event);

}

return consume;

}

10、描述一下View的绘制原理?

=================

View的绘制流程主要分为三步:

onMeasure:测量视图的大小,从顶层父View到子View递归调用measure()方法,measure()调用onMeasure()方法,onMeasure()方法完成绘制工作。

onLayout:确定视图的位置,从顶层父View到子View递归调用layout()方法,父View将上一步measure()方法得到的子View的布局大小和布局参数,将子View放在合适的位置上。

onDraw:绘制最终的视图,首先ViewRoot创建一个Canvas对象,然后调用onDraw()方法进行绘制。onDraw()方法的绘制流程为:① 绘制视图背景。② 绘制画布的图层。 ③ 绘制View内容。④ 绘制子视图,如果有的话。⑤ 还原图层。⑥ 绘制滚动条。

11、了解APK的打包流程吗,描述一下?

====================

Android的包文件APK分为两个部分:代码和资源,所以打包方面也分为资源打包和代码打包两个方面,这篇文章就来分析资源和代码的编译打包原理。

具体说来:

a、通过AAPT工具进行资源文件(包括AndroidManifest.xml、布局文件、各种xml资源等)的打包,生成R.java文件。

b、通过AIDL工具处理AIDL文件,生成相应的Java文件。

c、通过Javac工具编译项目源码,生成Class文件。

d、通过DX工具将所有的Class文件转换成DEX文件,该过程主要完成Java字节码转换成Dalvik字节码,压缩常量池以及清除冗余信息等工作。

e、通过ApkBuilder工具将资源文件、DEX文件打包生成APK文件。

f、利用KeyStore对生成的APK文件进行签名。

g、如果是正式版的APK,还会利用ZipAlign工具进行对齐处理,对齐的过程就是将APK文件中所有的资源文件举例文件的起始距离都偏移4字节的整数倍,这样通过内存映射访问APK文件

的速度会更快。

12、了解APK的安装流程吗,描述一下?

====================

a、复制APK到/data/app目录下,解压并扫描安装包。

b、资源管理器解析APK里的资源文件。

c、解析AndroidManifest文件,并在/data/data/目录下创建对应的应用数据目录。

d、然后对dex文件进行优化,并保存在dalvik-cache目录下。

e、将AndroidManifest文件解析出的四大组件信息注册到PackageManagerService中。

f、安装完成后,发送广播。

13、当点击一个应用图标以后,都发生了什么,描述一下这个过程?

===============================

  • a、点击桌面应用图标,Launcher进程将启动Activity(MainActivity)的请求以Binder的方式发送给了AMS。

  • b、AMS接收到启动请求后,交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。同时以Socket方式请求Zygote进程fork新进程。

  • c、Zygote接收到新进程创建请求后fork出新进程。

  • d、在新进程里创建ActivityThread对象,新创建的进程就是应用的主线程,在主线程里开启Looper消息循环,开始处理创建Activity。

  • e、ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法。这样便完成了Activity的启动。

15、BroadcastReceiver与LocalBroadcastReceiver有什么区别?

=================================================

BroadcastReceiver 是跨应用广播,利用Binder机制实现。

LocalBroadcastReceiver 是应用内广播,利用Handler实现,利用了IntentFilter的match功能,提供消息的发布与接收功能,

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

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

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

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

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

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

最后

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android 基础知识点

Java 基础知识点

Android 源码相关分析

常见的一些原理性问题

希望大家在今年一切顺利,进到自己想进的公司,共勉!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

码相关分析**

常见的一些原理性问题

[外链图片转存中…(img-uujJNc9J-1712453770243)]

希望大家在今年一切顺利,进到自己想进的公司,共勉!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐