阿里,网易等Android开发的笔试面试是怎么样的

发布网友 发布时间:2022-04-06 05:50

我来回答

3个回答

懂视网 时间:2022-04-06 10:12

一、性能优化

1.如何对 Android 应用进行性能分析

android 性能主要之响应速度 和UI刷新速度。

可以参考博客:Android系统性能调优工具介绍

首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。

UI布局的分析,可以有2块,一块就是Hierarchy Viewer 可以看到View的布局层次,以及每个View刷新加载的时间。

这样可以很快定位到那块layout & View 耗时最长。

还有就是通过自定义View来减少view的层次。

2.什么情况下会导致内存泄露

内存泄露是个折腾的问题。

什么时候会发生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。

I. 静态集合类引起内存泄露

主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。

II.remove 方法无法删除set集 Objects.hash(firstName, lastName);

经过测试,hashcode修改后,就没有办法remove了。

III. observer 我们在使用的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak。

广播没有unregisterrecevier

IV.各种数据链接没有关闭,数据库contentprovider,io,sokect等。cursor

V.内部类:

java中的内部类(匿名内部类),会持有宿主类的强引用this。

所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。

Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。

VI.单例

单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存leak。

3.如何避免 OOM 异常

首先OOM是什么?

当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后

这就会抛出 OutOfMemoryException 也就是OOM

Android的OOM怎么样?

为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上限。

 public void getMemoryLimited(Activity context)
 {
 ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
 System.out.println(activityManager.getMemoryClass());
 System.out.println(activityManager.getLargeMemoryClass());
 System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024));
 }
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192

HTC M7实测,192M上限。512M 一般情况下,192M就是上限,但是由于某些特殊情况,android允许使用一个更大的RAM。

如何避免OOM

减少内存对象的占用

I.ArrayMap/SparseArray代替hashmap

II.避免在android里面使用Enum

III.减少bitmap的内存占用

  • inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
  • decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
  • IV.减少资源图片的大小,过大的图片可以考虑分段加载

    内存对象的重复利用

    大多数对象的复用,都是利用对象池的技术。

    I.listview/gridview/recycleview contentview的复用

    II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8

    这个方法在某些条件下非常有用,比如要加载上千张图片的时候。

    III.避免在ondraw方法里面 new对象

    IV.StringBuilder 代替+

    4.Android 中如何捕获未捕获的异常

    public class CrashHandler implements Thread.UncaughtExceptionHandler { private static CrashHandler instance = null; public static synchronized CrashHandler getInstance()
     { if(instance == null)
     {
      instance = new CrashHandler();
     } return instance;
     } public void init(Context context)
     {
     Thread.setDefaultUncaughtExceptionHandler(this);
     }
    
     @Override public void uncaughtException(Thread thread, Throwable ex) {
     StringBuilder stringBuilder = new StringBuilder();
     stringBuilder.append("Thread:");
     stringBuilder.append(thread.toString());
     stringBuilder.append("	");
     stringBuilder.append(ex);
     TraceLog.i(stringBuilder.toString());
     TraceLog.printCallStatck(ex);
     }
    }

    CrashHandler

    关键是实现Thread.UncaughtExceptionHandler

    然后是在application的oncreate里面注册。

    5.ANR 是什么?怎样避免和解决 ANR(重要)

    ANR->Application Not Responding

    也就是在规定的时间内,没有响应。

    三种类型:

    1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应

    2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成

    3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成

    为什么会超时:事件没有机会处理 & 事件处理超时

    怎么避免ANR

    ANR的关键

    是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算

    而交给work thread操作。

    1)避免在activity里面做耗时操作,oncreate & onresume

    2)避免在onReceiver里面做过多操作

    3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。

    4)尽量使用handler来处理UI thread & workthread的交互。

    如何解决ANR

    首先定位ANR发生的log:

    04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted
    CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量

    从log可以看出,cpu在做大量的io操作。

    所以可以查看io操作的地方。

    当然,也有可能cpu占用不高,那就是 主线程被block住了。

    6.Android 线程间通信有哪几种方式

    1)共享变量(内存)

    2)管道

    3)handle机制

    runOnUiThread(Runnable)

    view.post(Runnable)

    7.Devik 进程,linux 进程,线程的区别

    Dalvik进程。

    每一个android app都会占用一个dvm虚拟机,运行在linux系统中。

    所以dalvik进程和linux进程是可以理解为一个概念。

    8.描述一下 android 的系统架构

    从小到上就是:

    linux kernel,lib dalvik vm ,application framework, app

    9.android 应用对内存是如何的?我们应该如何合理使用内存?

    activitymanager.getMemoryClass() 获取内存。

    关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。

    10. 简述 android 应用程序结构是哪些

    1)main code

    2) unit test

    3)mianifest

    4)res->drawable,drawable-xxhdpi,layout,value,mipmap

    mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.

    google建议只把启动图片放入。

    5)lib

    6)color

    11.请解释下 Android 程序运行时权限与文件系统权限的区别

    文件的系统权限是由linux系统规定的,只读,读写等。

    运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。

    12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么

    Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。

    简单来说framework就是提供app生存的环境。

    1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)

    2)onCreate中的setContentView方法,会创建DecorView

    3)DecorView 的addview方法,会把layout中的布局加载进来。

    13.多线程间通信和多进程之间通信有什么不同,分别怎么实现

    线程间的通信可以参考第6点。

    进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,

    Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。

    14.Android 屏幕适配

    屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。

    dp来适配屏幕,sp来确定字体大小

    drawable-xxdpi, values-1280*1920等 这些就是资源的适配。

    wrap_content,match_parent, 这些是view的自适应

    weight,这是权重的适配。

    15.什么是 AIDL 以及如何使用

    Android Interface Definition Language

    AIDL是使用bind机制来工作。

    参数:

    java原生参数

    String

    parcelable

    list & map 元素 需要支持AIDL

    16.Handler 机制

    参考:android 进程/线程管理(一)----消息机制的框架 这个系类。

    17.事件分发机制

    android 事件分发机制

    18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么

    EventBus,广播,view.post, runinUiThread

    但是无论各种花样,本质上就2种:handler机制 + 广播

    19.子线程中能不能 new handler?为什么

    必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。

    20.Android 中的动画有哪几类,它们的特点和区别是什么

    视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。

    属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0

    帧动画,通过drawable一帧帧画出来。

    Gif动画,原理同上,canvas画出来。

    具体可参考:https://i.cnblogs.com/posts?categoryid=672052

    21.如何修改 Activity 进入和退出动画

    overridePendingTransition

    22.SurfaceView & View 的区别

    view的更新必须在UI thread中进行

    surfaceview会单独有一个线程做ui的更新。

    surfaceview 支持open GL绘制。

    二、项目框架的使用

    23.开发中都使用过哪些框架、平台

    I.EventBus 事件分发机制,由handler实现,线程间通信

    II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils

    III.百度地图

    IV.volley

    V.fastjson

    VI.picciso

    VII.友盟

    VIII.zxing

    IX.Gson

    24.使用过那些自定义View

    pull2RefreshListView

    25.自定义控件:绘制圆环的实现过程

    package com.joyfulmath.samples.Cycle;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/**
     * Created by Administrator on 2016/9/11 0011. */public class CycleView extends View {
     Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null);
     } public CycleView(Context context, AttributeSet attrs) { super(context, attrs);
     initView();
     } private void initView() {
     mPaint.setAntiAlias(true);
     mPaint.setStyle(Paint.Style.STROKE);
     mPaint.setStrokeWidth(20);
     }
    
     @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
     canvas.drawCircle(100,100,50,mPaint);
     }
    }

    CycleView

    关键是canvas.drawCycle & paint.setsytle(stoken)

    26.自定义控件:摩天轮的实现过程

    27.GridLayout的使用

    可以不需要adapter

    28.流式布局的实现过程

    TBD.

    29.第三方登陆

    QQ & 微信都有第三方登陆的sdk,要去注册app

    30.第三方支付

    需要看支付宝的API文档

    热心网友 时间:2022-04-06 07:20

    Android操作系统是基于Linux开发的一个移动操作系统,而大家更知道,Linux是C与C++的天下,所以Android的底层是支持C/C++的。综上描述,Android上所采用的编程语言主要有以下的方式:
    1、基于ADK的Java编程
    2、基于NDK的C编程
    Android应用层的开发,基本上全部是采用Java开发,而个别性能需求的部分,可能会采用NDK的方式。

    热心网友 时间:2022-04-06 08:38

    1. 下列哪些语句关于内存回收的说明是正确的? (b )
    A、 程序员必须创建一个线程来释放内存
    B、 内存回收程序负责释放无用内存
    C、 内存回收程序允许程序员直接释放内存
    D、 内存回收程序可以在指定的时间释放内存对象
    2. 下面异常是属于Runtime Exception 的是(abcd)(多选)
    A、ArithmeticException
    B、IllegalArgumentException
    C、NullPointerException
    D、BufferUnderflowException
    3. Math.round(11.5)等于多少. Math.round(-11.5)等于多少(c).
    A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
    4. 下列程序段的输出结果是:(b )
    void complicatedexpression_r{
    int x="20," y="30;"
    boolean b;
    b="x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;"
    System.out.println(b);
    }
    A、true B、false C、1 D、011.activity
    5. 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)
    A、onPause B、onCreate C、 onResume D、onStart
    6. Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选)
    A、Serializable B、charsequence C、Parcelable D、Bundle
    7. android 中下列属于Intent的作用的是(c)
    A、实现应用程序间的数据共享
    B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
    C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
    D、处理一个应用程序整体性的工作
    8. 下列属于SAX解析xml文件的优点的是(b)
    A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能
    B、不用事先调入整个文档,占用资源少
    C、整个文档调入内存,浪费时间和空间
    D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会消失
    9. 在android中使用Menu时可能需要重写的方法有(ac)。(多选)
    A、onCreateOptionsMenu
    B、onCreateMenu
    C、onOptionsItemSelected
    D、onItemSelected
    10. 在SQL Server Management Studio 中运行下列T-SQL语句,其输出值(c)。
    SELECT @@IDENTITY
    A、 可能为0.1
    B、 可能为3
    C、 不可能为-100
    D、 肯定为0
    11. 在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询之 后的结果是(d)。
    BEGIN TRANSACTION A
    Update SALES Set qty="30" WHERE qty<30
    BEGIN TRANSACTION B
    Update SALES Set qty="40" WHEREqty<40
    Update SALES Set qty="50" WHEREqty<50
    Update SALES Set qty="60" WHEREqty<60
    COMMIT TRANSACTION B
    COMMIT TRANSACTION A
    A、SALES表中qty列最小值大于等于30
    B、SALES表中qty列最小值大于等于40
    C、SALES表中qty列的数据全部为50
    D、SALES表中qty列最小值大于等于60
    12. 在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是(ab)
    A、getWriteableDatabase
    B、getReadableDatabase
    C、getDatabase
    D、getAbleDatabase
    13. android 关于service生命周期的onCreate和onStart说法正确的是(ad)(多选题)
    A、当第一次启动的时候先后调用onCreate和onStart方法
    B、当第一次启动的时候只会调用onCreate方法
    C、如果service已经启动,将先后调用onCreate和onStart方法
    D、如果service已经启动,只会执行onStart方法,不在执行onCreate方法
    14. 下面是属于GLSurFaceView特性的是(abc)(多选)
    A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
    B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
    C、让渲染器在的线程里运作,和UI线程分离。
    D、可以直接从内存或者DMA等硬件接口取得图像数据
    16. 下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确的
    A、android:name="android.provider.action.NewBroad"/>
    B、android:name="android.provider.action.NewBroad"/>
    C、android:name="android.provider.action.NewBroad"/>
    D、android:name="android.provider.action.NewBroad"/>
    17. 关于ContenValues类说法正确的是(a)
    A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值都是基本类型。
    B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是任意类型,而值都是基本类型。
    C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名,可以为空,而值都是String类型。
    D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值也是String类型
    18. 我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(a)
    A、onDestroy
    B、onClear
    C、onFinish
    D、onStop
    19. 下面退出Activity错误的方法是(c)
    A、finish
    B、抛异常强制退出
    C、System.exit
    D、onStop
    20. 下面属于android的动画分类的有(ab)(多项)
    A、Tween B、Frame C、Draw D、Animation
    援引自扣丁2016年最新Android面试题及答案整理

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com