Android面试题知识点积累(三)

onNewIntent()调用时机

当activity设置启动模式为singleTop和singleTask,启动该activity,会调用onNewIntent();

ActivityManagerService的功能

1.统一管理应用的程序的Activity。
2.内存管理。Android官方声称,Activity退出后,其所在的进程并不会被立即杀死,从而在下次启动该Activity时能够提高启动速度。
3.进程管理,ActivityManagerService向外提供了查询系统正在运行的进程信息的API。

Android中还了解哪些方便线程切换的类?

例如:Runnable AsyncTask EventBus Rxjava

什么是Mac地址:

MAC地址采用十六进制数表示,共六个字节(48位),成为物理位置,它是一个用来确认网上设备位置的地址。
MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。

LruCache 实现原理

声明的变量

    private final LinkedHashMap<K, V> map;  //存放数据的集合
    private int size;  //当前LruCahce的内存占用大小
    private int maxSize;  //Lrucache的最大容量
    private int putCount;  //put的次数
    private int createCount;  //create的次数
    private int evictionCount;  //回收的次数
    private int hitCount;  //命中的次数
    private int missCount;  //丢失的次数

总述:实例化了一个LinkedHashMap对象,LinkedHashMap对象是实现Lru算法的关键,Lru–Least Recently Used 是最近最少使用算法的简称,意思呢就是查询出最近的时间使用次数最少的那个对象。主要的功能是判断当前容量时候已经超出最大的容量,如果超出了maxSize的话,就会循环移除map中的第一个元素,直到达到跳出循环的条件。由上面的分析知道,map中的第一个元素就是最近最少使用的那个元素。

make Project、clean Project、Rebuild Project的区别

Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。
Clean Project:删除之前编译后的编译文件,并重新编译整个Project,比较花费时间,不生成apk。
Rebuild Project:同Clean Project一样
Build APK:重新编译生成apk

Android为什么要加签名机制

Android系统要求所有的程序通过数字签名才能安装。图标、名字、包名可以被仿冒掉,但是根据签名能唯一判别apk,签名相同才会覆盖安装。防止被恶意替换掉;和加入开发方身份认证机制。注:平常开发调试运行会有一个默认debug.key签名文件进行签名打包。

简要讲述动画的基本原理

其实就是利用插值器和估值器,来计算出各个时刻View的属性,然后通过改变View的属性来,实现View的动画效果。

Java 中内部类为什么可以访问外部类

因为内部类创建的时候,需要外部类的对象,在内部类对象创建的时候会把外部类的引用传递进去。

string转换成integer的方式及原理
public static int digit(int codePoint, int radix) {
        //基数必须再最大和最小基数之间
        if (radix < MIN_RADIX || radix > MAX_RADIX) {
            return -1;
        }
        if (codePoint < 128) {
            // Optimized for ASCII
            int result = -1;
            //字符在0-9字符之间
            if ('0' <= codePoint && codePoint <= '9') {
                result = codePoint - '0';
            }
            //字符在a-z之间
            else if ('a' <= codePoint && codePoint <= 'z') {
                result = 10 + (codePoint - 'a');
            }
            //字符在A-Z之间
            else if ('A' <= codePoint && codePoint <= 'Z') {
                result = 10 + (codePoint - 'A');
            }
            return result < radix ? result : -1;
        }
        return digitImpl(codePoint, radix);
    }

Integer.parseInt(String str),用while循环获取string中的每个字符,根据ascll码进行判断,如果大于’0’小于’9’,就可以转成数字,减去’0’字符就得到它对应的int值,如果有一个字符不能在0-9字符之间,就会抛出数字类型转换异常。

Application的生命周期有哪些?
 public class LifeCycleApplication extends Application {

    @Override
    public void onCreate() {
        // 程序创建的时候执行
        Log.d(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public void onTerminate() {
        // 程序终止的时候执行
        Log.d(TAG, "onTerminate");
        super.onTerminate();
    }

    @Override
    public void onLowMemory() {
        // 低内存的时候执行
        Log.d(TAG, "onLowMemory");
        super.onLowMemory();
    }

    @Override
    public void onTrimMemory(int level) {
        // 程序在内存清理的时候执行(回收内存)
        // HOME键退出应用程序、长按MENU键,打开Recent TASK都会执行
        Log.d(TAG, "onTrimMemory");
        super.onTrimMemory(level);
    }
}
应用安装的流程及路径
  • 应用安装涉及到如下几个目录:
    system/app —————系统自带的应用程序,获得adb root权限才能删除
    data/app —————用户程序安装的目录。安装时把apk文件复制到此目录
    data/data —————存放应用程序的数据
    data/dalvik-cache——–将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

  • 安装过程:
    复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

  • 卸载过程:
    删除安装过程中在上述三个目录下创建的文件及目录。

RecyclerView怎么实现item拖拽?

只需要给recyclerView添加一个ItemTouchHelper对象就行
mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback());
mItemTouchHelper.attachToRecyclerView(mRecyclerView);

特殊域变量(volatile)关键字

通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。

a.volatile关键字为域变量的访问提供了一种免锁机制,
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

//需要同步的变量加上volatile
private volatile int account = 100;

十六进制数据怎么和十进制和二进制之间转换

System.out.println(“十进制10转16进制为”+Integer.toHexString(10));
System.out.println(“十进制10转二进制为”+Integer.toBinaryString(10));
或者用10进制转换进行中转

子view比父view大时,怎么让子view能超出父view?

在父布局中,加上android:clipChildren=”false”这个属性,不限制子view大小,默认为true。

怎么加速启动activity?

1.初始化觉得会耗时的操作,可以开子线程去处理
2.尽量减少布局层次

SharedPreferences的commit和apply的区别?

commit是原子提交到数据库,所以从提交数据到存在Disk中都是同步过程,中间不可打断。
apply方法的原子操作是原子提交的内存中,而非数据库,所以在提交到内存中时不可打断,之后再异步提交数据到数据库中,因此也不会有相应的返回值。
所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败。

如何控制某个方法允许并发访问线程的个数

在Java中常使用Semaphore(信号量)来进行并发编程,Semaphore控制的是线程并发的数量,实例化一个Semaphore对象,如Semaphore semaphore = newSemaphore(5,true) ,其创建了对象semaphore,并初始化了5个信号量,即最多允许5个线程并发访问,在执行的任务中,调用semaphore的acquire()方法请求一个信号量,这时信号量个数就减1,(一旦没有可使用的信号量,再次请求就会阻塞),来执行任务,执行完任务,调用semaphore的release()方法释放一个信号量此时信号量的个数就会加1 。就算门卫记录该停车场的剩余停车位。

原子性:

原子是世界上最小的物质单位,具有不可分割性,比如a=0,这个操作是不可分割的,那么我们就会说这个操作是原子操作,再如a++,这个操作实际上是a=a+1,是可以分割的,所以他不是一个原子操作,非原子操作都会存在线程安全的问题,需要使用synchronized同步技术来使其变成一个原子操作,一个操作是原子操作,那么我么称它具有原子性。

字节流和字符流的区别?

字符流只能处理字符类型(char,纯文本可以用字符流,比如汉字,传输的时候要查询编码表,得到汉字对应的字符),
而字节流可以处理任何类型(比如图片,视频,是以二进制传输的)
字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的
而字符流在操作的时候是使用到缓冲区的,需要调用flush()强制清空缓冲区才能输出。

    原文作者:奔跑吧李博
    原文地址: https://www.jianshu.com/p/01737e2b42fd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞