Android面试题(高级)

  • 软通华为HMS项目
  • 中软华为项目1
  • 中软华为视频项目
  • 中软华为视频高级面试


软通华为HMS项目

问:Activity的生命周期

答:略。

问:同时开了4个线程,要等待所有线程都执行完成后再提交结果,应该怎么做

答:我有两种方式可以实现,
1,使用声明一个AtomicInteger类型变量(重点是AtomicInteger,它的自增是线程安全的),每个线程执行完成后让这个变量自增,然后判断是否都执行完成,即它的值是否为4,如果为4则提交结果。(我回答的时候说用volatile修饰int类型也可以。面试结束后发现答错了,volatile不能保证线程安全,因为i++或者++i这种操作不是原子的,可以去看一下这个老铁写的文章AtomicInteger介绍
2,使用CountDownLatch
示例代码如下:

public class Main {

	public static void main(String[] args) {
		CountDownLatch latch = new CountDownLatch(4);
		System.out.println("开始执行");
		for(int i=0;i<4;i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					latch.countDown();
				}
			}).start();
		}
		try {
			latch.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("执行结束了,提交结果。");
	}
}

问:什么是内存泄漏,什么是内存溢出,怎么优化内存

答:内存泄漏是指一个对象已经不再会被使用,但是无法被回收。
内存溢出是指程序在申请内存时,没有足够的内存空间供其使用
优化:
1,尽量减少静态对象的创建,当静态对象不再使用时要置空。
2,不要在for循环中创建对象或者做其它分配内存的操作,自定义View时onMeasure方法onDraw(),自定义ViewGroup里面的onLayout这些方法也是同样的道理,不要在里面创建对象。
3,图片优化,加载大图需要压缩处理,要么使用第三方库,要么自处理。自己处理图片时要注意,decode大图不能直接加载到内存中,要先加载图片的尺寸,(BitmapFactory.Options对象的inJustDecodeBounds设置为true)再压缩,因为直接加载到内存中可能会OOM,而我们压缩图片只需要知道图片的尺寸即可。Bitmap使用后要recyle()去释放内存(释放native层的内存)。
4,cursor对象用完要close(),IO用完流要关闭,播放器用完要release()等,这些都是native()层的,都需要注意带有release(),close()等方法的都需要注意。

问:讲讲Handler机制

答:由Looper驱动的一个消息循环机制。
然后讲讲流程:
ActivityThread在启动后会调用Looper的loop()方法开启一个死循环,在这循环里面它会从MessageQueue中不断地去取Message,如果没有消息就阻塞,如果有消息,就取出Message对象,并且调用这个message对象的target(就是handler)对象去处理消息(dispatchMessage),处理消息先判断message有没有callback(也就是runnable对象),如果有则执行它的run方法,如果为空,则执行handler的handleMessage方法。

问:讲讲第三方登录,OAuth认证。客户端怎么保存的token

答:没搞过,不清楚(这个了解就行,华为的hms涉及到第三方登录)可以自行去搜索。

中软华为项目1

问:内存问题

答:略,回答的和上面的基本一样

问:说说模块化和组件化,以及组件之间的跳转

答:
1,模块化和组件化类似,都是需要创建单独的module,但是他们的侧重点不同,模块化主要强调复用,而组件化强调的是单独编译,因为它一般会编译成aar包供其它模块或者app使用。
2,面试官问我的项目,我说我的项目没有用到使用常用的三方路由库,我说我们项目是通过隐式启动去实现界面跳转的(这个答的不太好,一般他们可能想问三方路由的原理,因为我说没有用到第三方的,估计他也没好问了)。相关的东西
你们可以自己去搜搜开源项目。

中软华为视频项目

问:Activity的生命周期,以及启动第二个界面,第一个界面的和第二个界面的生命周期的顺序,以及什么情况下Activity只执行onPause而不执行onStop

答:
1,onCreate(),onStart(),onResume(),onPause(),onDestroy(),
2,启动第二个Activity,第一个activity以及第二个activity生命周期是:onPause(),onCreate(),onStart(),onResume(),onStop(),加粗的是第二个activity走的方法。
3,当启动一个theme为Dialog的activity时,当前的Activity只会走onPause,不走onStop。

问:Touch事件分发的流程,以及怎么在ViewPager中处理横向滑动的RecyclerView的情况

答:略

问:AES加密,以及是对称还是非对称加密

答:这个问题我没答好,确实没研究过,我只知道它是对称加密,原理你们可以自己去搜

问:问jetpack有没有用过,LiveData和MutableLiveData的区别

答:这个也没答好,这个确实用过,不过不知道它俩的区别。可以看一下这位铁写的 这是总结:
1.MutableLiveData的父类是LiveData
2.LiveData在实体类里可以通知指定某个字段的数据更新.
3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段

问:hashCode的作用

答:我回答用于判断是否是同一个对象,面试官提示我集合里面有没有用,我说HashMap中用来确定数组下标。这个问的主要是考查java基础,可以看一下这位老铁写的

问:线程池有没有用过

我回答我用到的少,一般用AsyncTask多一点。接着他问道AsyncTask中能不能做耗时的操作,我回答在Android3.0之前是可以的,因为task默认是并行的,当然也不能做太多的耗时操作。3.0之后任务默认是串行的,所以默认的情况下不能做耗时操作,如果要执行耗时的任务,要指定线程池,AsyncTask提供了2个默认的线程池THREAD_POOL_EXECUTOR和
SERIAL_EXECUTOR,前者是并行执行,后者是串行执行,我们需要指定使用THREAD_POOL_EXECUTOR实现并行执行。
此外还问到了线程池的队列的饱和策略

中软华为视频高级面试

在通过华为视频初面后,由于我面的级别比较高,所以后面还有级别更高的华为牛人面试

问:项目的架构,代码重构需要注意的点。

因为我项目经验中写到了架构的搭建和重构,所以他会问这些。

答:这些我答的不好,我答的使用了模块化。重构需要注意的是封装,和解耦,可维护性和可拓展性等,这个我自由发挥的

问:讲讲Android中的跨进程通信机制,以及对AIDL理解

答:android中IPC是通过binder来实现。在IPC时,我们也可以不使用AIDL,自己去实现通信,即使用binder对象的transact方法向服务端写数据。AIDL是编译工具给我们简化了代码而已。然后问了AIDL中的原理,重点是AIDL中asBinder方法返回的接口对象,如果当前进程和服务端进程相同则返回本地对象,否则返回服务端的代理对象。整个AIDL机制都需要理解,特别是AIDL生成的文件要搞清楚里面的原理。整个IPC的流程包括client端和service端的原理需要理解。
这位老铁写的很好

问:Handler机制,并用UML图画出来。

答:这个问题他实际上重点考查我UML知识,我很少用,这个问题挂了。。。

问:Hanlder的postDelay是怎么实现的

答:可以看看这位哥们写的

问:volatile关键字作用,以及它能不能解决线程安全问题(中间还问到了线程的内存模型)

答:volatile关键字作用是保持内存可见性和防止指令重排序。不能解决线程安全问。(这个我答的不太好,他会问为何不能解决线程问题,以及内存模型是怎样的,这个你们自己搜索相关资料)

问:MVC,MVP,MVVM的理解,并且画图描述。

这个我答的很烂,主要是考查对这些架构的理解,每个角色的作用以及它们之间的交互,相关资料你们自己搜索。