金三银四跳槽季即将过完,相信大家肯定急需一套Android面试宝典,今天给大家准备了我珍藏已久的Android高阶面试宝典,供大家学习 !【文末有干货】

一、面试题:

1.自定义Handler时如何避免内存泄漏
2.onNewIntent的调用时机
3.RecyclerView相比ListView有哪些优势
4.谈一谈Proguard混淆技术
5.ANR出现的场景及解决方案

二、详细解析:

1.自定义Handler时如何避免内存泄漏

一般非静态内部类持有外部类的引用的情况下,造成外部类在使用完成后不能被系统回收内存,从而造成内存泄漏。为了避免这个问题,我们可以自定义的Handler声明为静态内部类形式,然后通过弱引用的方式,让Handler持有外部类的引用,从而可避免内存泄漏问题。

以下是代码实现

private WeakReference < MainActivity > activityWeakReference;private MyHandler myHandler;static class MyHandler extends Handler {private MainActivity activity;MyHandler(WeakReference < MainActivity > ref) {this.activity = ref.get;}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1://需要做判空操作if (activity != ) {activity.mTextView.setText("new Value");}break;default:Log.i(TAG, "handleMessage: default ");break;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在onCreate中初始化activityWeakReference = new WeakReference < MainActivity > (this);myHandler = new MyHandler(activityWeakReference);myHandler.sendEmptyMessage(1);mTextView = (TextView) findViewById(R.id.tv_test);}

2.onNewIntent的调用时机

在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就会存在一点点小问题。

首先,在默认情况下,当您通过Intent启到一个Activity的时候,就算已经存在一个相同的正在运行的Activity,系统都会创建一个新的Activity实例并显示出来。为了不让Activity实例化多次,我们需要通过在AndroidManifest.xml配置activity的加载方式(launchMode)以实现单任务模式,如下所示:

<activity android:label="@string/app_name"android:launchmode="singleTask"android:name="Activity1"></activity>

launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法

前提:ActivityA已经启动过,处于当前应用的Activity堆栈中;当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent方法

当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时会调用onNewIntent方法

当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法,仍然调用的是onCreate方法

以下是代码实例

  • 设置MainActivity的启动模式为SingleTask(栈内复用)
<activityandroid:name=".MainActivity"android:launchMode="singleTask"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
  • MainActivity中重写onNewIntent方法
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private Button mButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButton = (Button) findViewById(R.id.forward_btn);mButton.setOnClickListener(new View.OnClickListener {@Overridepublic void onClick(View view) {startActivity(new Intent(MainActivity.this, Main2Activity.class));}});@Overrideprotected void onNewIntent(Intent intent) {Toast.makeText(this, "onnewIntent", Toast.LENGTH_SHORT).show;Log.i(TAG, "onNewIntent: i done....");}
  • Main2Actvity执行点击跳转,MainActivity被复用,执行onNewIntent方法
public class Main2Activity extends AppCompatActivity {private Button mButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);mButton = (Button) findViewById(R.id.btn);mButton.setOnClickListener(new View.OnClickListener {@Overridepublic void onClick(View view) {startActivity(new Intent(Main2Activity.this, MainActivity.class));finish;}});

3.RecyclerView相比ListView有哪些优势

首先需要解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)

其次RecyclerView提供了添加、删除item的动画 效果,而且可以自定义

RecyclerView相比ListView优势在于可以轻松实现:

  • ListView的功能
  • GridView的功能
  • 横向ListView的功能
  • 横向ScrollView的功能
  • 瀑布流效果
  • 便于添加Item增加和移除动画

不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。

不过我们也可以自己去添加,只是会多了些代码而已。

实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势,

当然你也可以通过adapter中自己去提供回调

4.谈一谈Proguard混淆技术

Proguard技术有如下功能:

  • 压缩 --检查并移除代码中无用的类
  • 优化--对字节码的优化,移除无用的字节码
  • 混淆--混淆定义的名称,避免反编译
  • 预监测--在java平台对处理后的代码再次进行检测

代码混淆只在上线时才会用到,debug模式下会关闭,是一种可选的技术。

那么为什么要使用代码混淆呢?

因为Java是一种跨平台的解释性开发语言,而java的源代码会被编译成字节码文件,存储在.class文件中,由于跨平台的需要,java的字节码中包含了很多源代码信息,诸如变量名、方法名等等。并且通过这些名称来访问变量和方法,这些变量很多是无意义的,但是又很容易反编译成java源代码,为了防止这种现象,我们就需要通过proguard来对java的字节码进行混淆,混淆就是对发布的程序进行重新组织和处理,使得处理后的代码与处理前的代码有相同的功能,和不同的代码展示,即使被反编译也很难读懂代码的含义,哪些混淆过的代码仍能按照之前的逻辑执行得到一样的结果。

但是,某些java类是不能被混淆的,比如实现了序列化的java类是不能被混淆的,否则反序列化时会出问题。

下面这类代码混淆的时候要注意保留,不能混淆。

  • Android系统组件,系统组件有固定的方法被系统调用。
  • 被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。
  • Android Parcelable ,需要使用android 序列化的。

其他Anroid 官方建议 不混淆的,如

  • android.app.backup.BackupAgentHelper
  • android.preference.Preference
  • com.android.vending.licensing.ILicensingService
  • Java序列化方法,系统序列化需要固定的方法。
  • 枚举 ,系统需要处理枚举的固定方法。
  • 本地方法,不能修改本地方法名
  • annotations 注释
  • 数据库驱动
  • 有些resource 文件

5.ANR出现的场景及解决方案

在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视。当用户触发了输入事件(如键盘输入,点击按钮等),如果应用5秒内没有响应用户的输入事件,那么,Android会认为该应用无响应,便弹出ANR对话框。而弹出ANR异常,也主要是为了提升用户体验。

解决方案是对于耗时的操作,比如访问网络、访问数据库等操作,需要开辟子线程,在子线程处理耗时的操作,主线程主要实现UI的操作

这些是小编根据上面的高级工程师技术大纲整理的一套系统全面而且非常深入的Android进阶资料

命运永远会眷顾那些努力付出的人。如果你还没达到你的目标,那是因为你努力的程度还不够!

希望看到最后的朋友们,通过一年到两年的努力,都能实现追求的目标。

月薪20+的Android面试都问这些问题(含答案)相关推荐

  1. 解析底层原理!月薪20k+的Android面试都问些什么?深夜思考

    正文 Android行业主要问题是初级Android太多了,会写xml和Activity的程序员太多了,初中级程序员面临很大的竞争,现状也就偏于高级开发者.越来越多的初中级Android程序员找不到满 ...

  2. 月薪20k+的Android面试都问些什么?完整PDF

    前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...

  3. 月薪20k+的Android面试都问些什么?终获offer

    开头 这里是一些个人开发者接私活和自己做软件加广告的一些科普知识.可是做软件,需要服务器,需要后台,对于一些小的开发者,想赚点广告费而又不想做后台使用服务器的人来说,网上提供了一些免费的接口,可以供我 ...

  4. android从入门到精通!阿里巴巴Android面试都问些什么?绝对干货

    金九银十,给大家整理了月薪20K的Android面试题必问集锦,希望让大家查漏补缺,最后祝大家都能在金九银十找到一份不错的工作! 一.Android性能优化的方面 针对Android的性能优化,主要有 ...

  5. 深度剖析原理!阿里巴巴Android面试都问些什么?积累总结

    开头 相信大多数互联网的从业者都有着这样一个梦想:进大厂,获得丰厚的薪酬,和更优秀的人一起共事,在技术上获得更快的成长. **然而部分人其实一直都陷入了"穷忙"的困局,觉得自己每天 ...

  6. Android程序员必备!阿里巴巴Android面试都问些什么?完整版开放下载

    背景 坐标广州,五年iOS开发经验. 最近面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年iOS开发经验,简历上写着精通Java,iOS,熟悉H5开发.没有具体的技术点. ...

  7. 美团安卓面试,阿里巴巴Android面试都问些什么?含小米、腾讯、阿里

    金九银十过后各大网络平台都是各种面经分享,包括已收offer,或面试失败的都有,相信大部分人都拿到了自己心仪的大厂offer,不过也有没有少数没能进到自己内心向往的大厂而懊恼的,那么到底如何才能进大厂 ...

  8. 阿里巴巴Android面试都问些什么?系列篇

    Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support ...

  9. HR:你们这个学校是三本吗?对不起,阿里巴巴Android面试都问些什么

    他前几天面试,双方谈得都挺好,对方都准备下offer了,可是因为学历的问题卡住了.他是一所民办大学本科,对方HR死活坚持他们只要统招本科以上的. 面试题分享 项目介绍:如何实现的:为什么使用反射:XM ...

最新文章

  1. hive与hbase整合
  2. Boost:与gz文件相关的操作实例
  3. BZOJ3555: [Ctsc2014]企鹅QQ
  4. leetcode设计链表,非常工整的实现你值得拥有
  5. mysql删除unionkey_MySQL索引如何优化?二十条铁则送给你
  6. LeetCode 326. Power of Three
  7. 【ElasticSearch】Es 源码之 Transport 和 TransportService 源码解读
  8. Linux下的FTP服务
  9. 高德地图上展示终端信息
  10. messagedigest 图片加密_MessageDigest对密码进行加密
  11. 手机通话记录重复显示怎么处理_苹果8手机通话记录合并 苹果合并重复通话记录...
  12. 电表芯片CS5460A调试心得
  13. macOS 安装postman 中文语言包
  14. ceph的rbd使用和理解(全)
  15. 同花顺没签三方要赔钱才能拿回三方!!!!
  16. 各软件版本、仓库、官网地址
  17. 城乡规划现状数据移动调研系统开发
  18. gnome状态栏图标消失的解决方法
  19. python+vue网上二手书购物商城旧书回收系统re1kx
  20. 随机过程与排队论(一)

热门文章

  1. Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E>
  2. Win32 Application 、Win32 Console Application、MFC工程项目
  3. LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算
  4. 企业在推行流程管理过程中可能出现以下四个问题
  5. VB快速读取 TextBox 第 N 行的资料
  6. 英语总结系列(二十四):历经GCT的一月
  7. 英语总结系列(四):寻觅激励自我之道
  8. 痴人、信徒、先驱:深度学习三巨头等口述神经网络复兴史
  9. CentOS7.5安装Tigervnc-server
  10. 解决:mysql5.7 timestamp默认值0000-00-00 00:00:00 报错