写点什么

Android 大牛近期大厂面试详解(附解答),hashmap 底层原理

用户头像
Android架构
关注
发布于: 刚刚

3,解释一下 activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver


=========================================================================


一个 activity 呈现了一个用户可以操作的可视化用户界面;


一个 service 不包含可见的用户界面,而是在后台运行,可以与一个 activity 绑定,通过绑定暴露出来接口并与其进行通信;


一个 broadcast receiver 是一个接收广播消息并做出回应的 component,broadcast receiver 没有界面;一个 intent 是一个 Intent 对象,它保存了消息的内容。


对于 activity 和 service 来说,它指定了请求的操作名称和待操作数据的 URI,Intent 对象可以显式的指定一个目标 component。如果这样的话,android 会找到这个 component(基于 manifest 文件中的声明)并激活它。


但如果一个目标不是显式指定的,android 必须找到响应 intent 的最佳 component。它是通过将 Intent 对象和目标的 intent filter 相比较来完成这一工作的;


一个 component 的 intent filter 告诉 android 该 component 能处理的 intent。intent filter 也是在 manifest 文件中声明的。


4、Serializable 和 Parcelable 的区别


============================


在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。


1.Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。


2.Parcelable 不能使用在要将数据存储在磁盘上的情况。


尽管 Serializable 效率低点,但在这 种情况下,还是建议你用 Serializable


实现:


1.Serializable 的实现,只需要继承 Serializable 即可。这只是给对象打了一个标记,系统会 自动将其序列化。


2.Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


,这个变量需要继承 Parcelable.Creator 接口。


public class MyParcelable implements Parcelable {


private int mData;


public int describeContents() {


return 0;


}


public void writeToParcel(Parcel out, int flags) {


out.writeInt(mData);


}


public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {


public MyParcelable createFromParcel(Parcel in) {


return new MyParcelable(in);


}


public MyParcelable[] newArray(int size) {


return new MyParcelable[size];


}


};


private MyParcelable(Parcel in) {


mData = in.readInt();


}


}


5,什么是内存泄漏,android 在什么情况下容易产生内存泄漏


===============================


说到内存泄漏就不得不提内存溢出。


内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer,但给它存了 long 才能存下的数,那就是内存溢出。


内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重。内存溢出导致了内存泄漏。


在 Android 中常见的内存泄漏原因:


1. 资源释放问题 程序代码的问题,长期保持某些资源,如 Context、Cursor、IO 流的引用,资源得不到释放 造成内存泄露。


2. 对象内存过大问题 保存了多个耗用内存过大的对象(如 Bitmap、XML 文件),造成内存超出限制。


3. static 关键字的使用问题 static 是 Java 中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是 该类的实例。所以用 static 修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费 过多的实例(Context 的情况最多),这时就要谨慎对待了。


public class ClassName { private static Context mContext; //省略 }


以上的代码是很危险的,如果将 Activity 赋值到 mContext 的话。那么即使该 Activity 已经 onDestroy,但是由于仍有对象保存它的引用,因此该 Activity 依然不会被释放。


4. 线程导致内存溢出 线程产生内存泄露的主要原因在于线程生命周期的不可控。


5,数据库游标忘记回收等


那么针对上面的问题我们怎么避免呢


1、图片过大导致 OOM Android 中用 bitmap 时很容易内存溢出,比如报如下错误:


Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。


解决方法:?方法 1: 等比例缩小图片


BitmapFactory.Options options = new BitmapFactory.Options();


options.inSampleSize = 2; //Options 只保存图片尺寸大小,不保存图片到内存


BitmapFactory.Options opts = new BitmapFactory.Options();


opts.inSampleSize = 2;


Bitmap bmp = null;


bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);


//回收


bmp.recycle();//


方法 2:对图片采用软引用,及时地进行 recyle()操作


SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap); if(bitmap != null){ if(bitmap.get() != null && !bitmap.get().isRecycled()){ bitmap.get().recycle(); bitmap = null; } }


2、查询数据库没有关闭游标


程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor 后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。


3、构造 Adapter 时,没有使用缓存的 convertView


在使用 ListView 的时候通常会使用 Adapter,那么我们应该尽可能的使用 ConvertView。


为什么要使用 convertView?


当 convertView 为空时,用 setTag()方法为每个 View 绑定一个存放控件的 ViewHolder 对象。


当 convertView 不为空,重复利用已经创建的 view 的时候,使用 getTag()方法获取绑定的


ViewHolder 对象,这样就避免了 findViewById 对控件的层层查询,而是快速定位到控件。


4、Bitmap 对象不再使用时调用 recycle()释放内存


有时我们会手工的操作 Bitmap 对象,如果一个 Bitmap 对象比较占内存,当它不再被使用的时


候,可以调用 Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。


6、 简述下 Android JNI 调用过程


=====================


1)安装和下载 Cygwin,下载 AndroidNDK


2)在 ndk 项目中 JNI 接口的设计


3)使用 C/C++实现本地方法


4)JNI 生成动态链接库.so 文件


5)将动态链接库复制到 java 工程,在 java 工程中调用,运行 java 工程即可

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android大牛近期大厂面试详解(附解答),hashmap底层原理