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

ActivityManagerService的功能

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

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

例如:Runnable AsyncTask EventBus Rxjava

什么是Mac地址:

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

make Project、clean Project、Rebuild Project的区别

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

简要讲述动画的基本原理

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

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

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

应用安装的流程及路径
  • 应用安装涉及到如下几个目录:
    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);

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

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.尽量减少布局层次

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

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

        Semaphore semaphore = new Semaphore(5, true);
        semaphore.acquire();
        semaphore.release();
字节流和字符流的区别?

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

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

有三个线程T1,T2,T3,怎么确保它们按顺序执行?

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。

public static void main(String[] args) {
        try {
            t.new T3().start();//启动t3线程
            t.new T3().join();//阻塞主线程,执行完t3再返回
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        try {
            t.new T1().start();//启动t1线程
            t.new T1().join();//阻塞主线程,执行完t1再返回
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        try {
            t.new T2().start();//启动t2线程
            t.new T2().join();//阻塞主线程,执行完t2再返回
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  • 回调的原理

总结起来,回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。事件流的过程就是调用方在任务完成之后,调用接口,实现该接口的回调方就会调用该接口方法,从而获取回调事件或回调信息。
参考

你可能感兴趣的:(Android面试题知识点积累(三))