android笔试面试知识点,Android面试题知识点积累(二)

一个Bitmap占用内存计算

即是通过占用的像素点多少和一个像素点占的字节数。一个像素用一串二进制表示。

即是宽高byte数。Bitmap.Config有一个属性决定这个字节数。分别为:

一个int值32位,占4个字节,那16位就占2字节,8位占1个字节

ALPHA_8 图片只有一个alpha透明度值,占8位 一个像素1字节

ARGB_4444 argb各占4位,共16位 一个像素2字节

RGB_565 没有alpha,rgb各占5,6,5位,共16位 一个像素2字节

ARGB_8888 argb各占8位,共32个字节 一个像素4字节

代码中可以用bitmap.getByteCount()获取当前这个占用的内存大小。

jpg为什么比png图片小?

jpg是有损压缩,png是无损压缩。jpg没有alpha值,png有。

动画实现原理:

Android视图是以树形结构添加的,子view都有一个父view。当一个view调用动画,会对其比如大小,位置,透明度等发生改变。子view就会在每一帧动画改变后调用invalidate(),invalidate内部获取了parentView-它的父view调用ondraw()进行重绘,父view就会遍历将所有子view进行重绘,从而将子view的变化过程实时绘制出来。

java如何实现一次编译到处运行

javac将java文件编译成字节码.class文件,它是运行在JVM上的,只要操作系统安装了JVM,就能运行字节码文件,JVM是各个操作系统的中间层。

public和static没有先后之后,都可以这样写,只是公认习惯而已。

public static void haha(){

}

static public void hehi(){

}

低版本SDK实现高版本api

当程序使用一些方法或属性时,当判断项目minsdk还不支持该属性时,就会报错。那么就要加上

@TargetApi(Build.VERSION_CODES.X),声明让低版本sdk去调用高版本的api。

Android为每个应用程序分配的内存大小是多少?

Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,一旦应用超出这个内存使用值就会OOM。

不同的手机支持的App最大内存不一样。可以通过ActivityManager去获取。

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

int memClass = activityManager.getMemoryClass();

Android应用程序的默认最大内存值为16M

static public int staticGetLargeMemoryClass() {

// Really brain dead right now -- just take this from the configured

// vm heap size, and assume it is in megabytes and thus ends with "m".

String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");

return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));

}

写代码时怎么尽量去除重复代码?

1.封装完善基类,baseActivity,baseFragment,baseDialog等,封装父类统一属性和方法,比如网络判断,主题,跳转,toast等。

2.布局文件复用的单独抽出,用include使用

3.对于color,字符串,布局,ID,dimen等资源的引用放在res下进行引用,而不要每次都写一次在代码中。

Bundle机制

Bundle用于在Activity,fragment之间传值,Activity,fragment保存状态值的使用。

public final class Bundle extends BaseBundle implements Cloneable, Parcelable

Bundle用final修饰,不能被继承。由于要传值,所以需要序列化。

内部使用ArrayMap的键值对进行存储。

ArrayMap mMap = null;

AndroidStudio点击build(运行)后的流程

即是运行编译打包生成apk这一过程。

什么情况需要使用多进程?

类似音乐类、跑步健身类、手机管家类等长时间需要在后台运行的应用。

需要当手机切到别的应用,锁屏的情况下,要让应用的核心功能继续运行,比如播放,计步数。

启动新进程开启服务,使服务进程可以使用的内存更多,更不容易被杀死。

怎么跨进程启动app?

使用PackageManager,通过包名来启动应用,intent需要添加flag FLAG_ACTIVITY_NEW_TASK。

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(packageName);

LaunchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(LaunchIntent);

如何将一个Activity设置成窗口的样式。

中配置:android :theme="@android:style/Theme.Dialog"

项目方法超过65535以后怎们办?

谷歌官方推荐使用MultiDexApplication,具体步骤如下

Gradle 配置:

defaultConfig {

applicationId "XXX"

minSdkVersion 14

targetSdkVersion 23

multiDexEnabled true

}

dependencies {

compile 'com.android.support:multidex:1.0.0'

}

Application 类重写方法:

@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

简要描述一下AsynckTask的使用

AsyncTask抽象类,有三个泛型参数类型,第一个是你需要传递进来的参数类型,第二个是任务完成进度的类型一般是Integer,第三个是任务完成结果的返回类型,不需要的设为Void即可.

onPreExecute() doInbackground();子线程里执行 onPostExecute()返回执行结果

退出Activity或者退出App,那么后台任务不会立即退出,需要在onpause中调用cancle()方法

AsyncTask与Handler异步机制对比

1.AsyncTask是对Handler与Thread的封装。

2.AsyncTask底层是一个线程池,而Handler仅仅就是发送了一个消息队列。

图片三级缓存

图片的三级缓存:1、内存缓存;2、本地缓存;3、网络缓存

c105bd8c3428?utm_source=oschina-app

image.png

列表图片错位的解决:

Item1和item8谁先下载完就加载谁,然后会被后加载完成的图片覆盖。

解决:用对应项的图片url给imageview设置tag,当图片加载完成,判断这个url是不是imageview所添加的tag来设置图片。

View与SurfaceView的区别:

surfaceView 是在一个新起的单独线程中可以重新绘制画面而 View 必须在 UI 的主线程中更新画面 ,SurfaceView类就是双缓冲机制。

Surfaceview是view子类,可用于视频播放,摄像头预览等;

View刷新需要调用invalidate()或postInvalidate(),再调用ondraw()进行重绘,并且是在UI线程中刷新

SurfaceView是在子线程中不断调用刷新

如何实现客户端长连接的?

只要你做直播、IM、游戏、弹幕里面的任何一种,或者是你的app想要实时的接收某些消息,你就会要接触到长连接技术。

要做长连接的话,是不能用http协议来做的,因为http协议已经是应用层协议了,并且http协议是无状态的,而我们要做长连接,肯定是需要在应用层封装自己的业务,所以就需要基于TCP协议来做,而基于TCP协议的话,就要用到Socket了。

Android长连接,怎么处理心跳机制

所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息。

IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:

1.在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。

2.省电,不会出现每个应用都各自维护一个自己的长连接。

Android端实现需要第三方SDK,

其原理在于在android端的程序中,让一个SERVICE一直跑在后台,在service中开启子线程,在规定时间之内调用服务器接口进行数据获取。

Butterknife原理:在编译时发生。

当你编译你的Android工程时,ButterKnife工程中ButterKnifeProcessor类的process()方法会执行以下操作:

开始它会扫描Java代码中所有的ButterKnife注解@Bind、@OnClick、@OnItemClicked等

当它发现一个类中含有任何一个注解时,ButterKnifeProcessor会帮你生成一个Java类,名字类似$$ViewBinder,这个新生成的类实现了ViewBinder接口

这个ViewBinder类中包含了所有对应的代码,比如@Bind注解对应findViewById(), @OnClick对应了view.setOnClickListener()等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值