安卓Android面试题镜子里的自己程序员

Android 面试准备

2016-03-18  本文已影响730人  peter_yuan_93

Android的系统架构

系统框架.png

Android Handler机制


Android 多线程-----AsyncTask详解


Android中AIDL使用例子


横竖屏切换时候Activity的生命周期

他切换时具体的生命周期是怎么样的:

1、新建一个Activity,并把各个生命周期打印出来

2、运行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

3、按crtl+f12切换成横屏时

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->



Android中IntentService的原理及使用:
http://laokaddk.blog.51cto.com/368606/1340540/


Android屏幕适配全攻略(最权威的官方适配指导):
http://www.cocoachina.com/android/20151030/13971.html
android的资源限定符的使用


(1) final:修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载

(2) finally:在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally块(如果有的话)。

(3) finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。



sleep()和wait()的区别###

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;
   sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
  在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;
  wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
  wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。

所以sleep()和wait()方法的最大区别是:


Java GC机制主要完成3件事:

Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。对象将根据存活的时间被分为:年轻代(Young Generation)年老代(Old Generation)永久代(Permanent Generation,也就是方法区)


Java内存泄露与溢出的区别:

如何避免内存溢出:

如何避免内存泄露:


单例模式

    public class Singleton{}

观察者模式###

eg:


冒泡排序

    public void bubbleSort(int[] a) {
    int temp = 0;
    for (int i = 0; i < a.length - 1; i++) {
        for (int j = 0; j < a.length - i - 1; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }

    }
}

查找排序

    public void selectorSort(int[] a) {
    for (int i = 0; i < a.length; i++) {
        int min = i;
        for (int j = i + 1; j < a.length; j++) {
            if (a[j] < a[min]) {
                min = j;
            }
        }
        if (i != min) {
            int tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
    }
}

快速排序

    public void quickSort(int[] data, int start, int end) {
    // 设置关键数据key为要排序数组的第一个元素,
    // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小
    int key = data[start];
    // 设置数组左边的索引,往右移动比key大的数
    int i = start;
    // 设置数组右边的索引,往左移动比key小的数
    int j = end;
    // 如果左边索引比右边索引小,则还有数据没有排序
    while (i < j) {
        while (data[j] >= key && j > i) {
            j--;
        }
        data[i] = data[j];

        while (data[i] < key && i < j) {
            i++;
        }
        data[j] = data[i];
    }
    // 此时 i==j
    data[i] = key;

    // 递归调用
    if (i - 1 > start) {
        // 递归调用,把key前面的完成排序
        quickSort(data, start, i - 1);
    }
    if (i + 1 < end) {
        // 递归调用,把key后面的完成排序
        quickSort(data, i + 1, end);
    }

}

java中的四类常见引用类型

原文:java中四种引用类型
http://www.pocketcn.com/forum-viewthread-tid-1661-fromuid-1477.html


关于图片加载OOM问题的总结提供两篇好文:
http://stackoverflow.com/questions/10743381/when-should-i-recycle-a-bitmap-using-lrucache

http://blog.csdn.net/guolin_blog/article/details/9316683

总结一下解决加载图片出现OOM的问题主要有以下方法:


Activity的启动模式,推荐:
http://blog.csdn.net/zhangjg_blog/article/details/10923643


上一篇下一篇

猜你喜欢

热点阅读