月薪20+的Android面试都问这些成绩系列一(含答案)

  • 时间:2019-03-26 00:41 作者:敲代码的吃货 来源:敲代码的吃货 浏览:76
  • 扫一扫,手机拜访
摘要:金三银四跳槽季,信赖大年夜家必定急需一套Android面试宝典,明天给大年夜家预备了我收藏已久的Android高阶面试宝典,供大年夜家进修 !【文末有干货】一、面试题:1.本身设置Handler时若何防止内存泄漏2.onNewIntent的调用机会3.RecyclerView比拟ListView有哪些优势4.谈一

金三银四跳槽季,信赖大年夜家必定急需一套Android面试宝典,明天给大年夜家预备了我收藏已久的Android高阶面试宝典,供大年夜家进修 !【文末有干货】


一、面试题:

1.本身设置Handler时若何防止内存泄漏
2.onNewIntent的调用机会
3.RecyclerView比拟ListView有哪些优势
4.谈一谈Proguard混淆技巧
5.ANR出现的场景及处理筹划

2、详细解析:

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进阶材料
高等进阶技巧大年夜纲
Android体系进阶材料
这些材料都可以收费分享给大年夜家!QQ群:【Android技巧开辟交换②】979045005:https://jq.qq.com/?_wv=1027&k=5gc0B9E
迎接大年夜家进群,支付材料,一路进修交换!

命运永久会眷顾那些尽力付出的人。假设你还没达到你的目标,那是由于你尽力的程度还不敷!

欲望看到最后的同伙们,经过过程一年到两年的尽力,都能完成寻求的目标。

  • 全部评论(0)
最新发布的资讯信息
【体系情况|办事器应用】树莓派装置TensorFlow(2020-04-24 21:11)
【体系情况|办事器应用】防面试-SD_WebImage(2020-04-24 21:11)
【体系情况|办事器应用】推荐一款视频控件xgplayer(2020-04-24 21:11)
【体系情况|办事器应用】PostgreSQL 源码解读(27)- 查询语句#12(查询优化-上拉子链接#2)(2020-04-24 21:11)
【体系情况|办事器应用】若何轻松进修JavaScript?(2020-04-24 21:10)
【体系情况|办事器应用】【源码分析】Launcher 8.0 源码 (12) --- Launcher 启动流程 第五步之计算桌面各构造细节参数(2020-04-24 21:10)
【体系情况|办事器应用】前台碰撞室之console.log与文本字符(2020-04-24 21:10)
【体系情况|办事器应用】好用的Middleware完成(2020-04-24 21:10)
【体系情况|办事器应用】前台面试逐日 3+1 —— 第373天(2020-04-24 21:10)
【体系情况|办事器应用】绍圣--kafka之临盆者(五)(2020-04-24 21:10)
手机二维码手机拜访支付大年夜礼包
前往顶部