Android面试题—校招—京东

来源:互联网 发布:淘宝虚假代理 编辑:程序博客网 时间:2024/04/19 22:25

1 Fragment声明周期

OnCreateView用于初始化非静态的View
在其中创建View并返回给调用者

OnActivityCreate 当Fragment依存的Activity的
onCreate返回时调用。

Fragment扩展说明:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~
transaction.add() 之后要commit()
往Activity中添加一个Fragment

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

2、Fragment与Activity通信
因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:
a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

3 Fragment持有的主要引用
Animator
Bundle
序列化Parcelable 这个应该是用于跨进程传输数据的
FragmentManagerImpl
FragmentHostCallback 通过这个引用可以获取跟F相关的Activity

2 JAVA里的同步操作

1 Synchronized
Synchrnized.class 是对这个类上锁
Synchrnized.this 是对这个类的实例上锁
单利模式的一次判断,可以在方法前加 static Synchronized 类似于两次判断

其实Synchronized也分同步方法和同步代码块
2 volatile
强制值的改变发生在内存中。
但是本身操作不具备原子性。

3 ReentrantLock 可重入锁
需要创建 ReentrantLock lock = new ReentrantLock()
Lock.lock();
lock.unLock();
4 ThreadLocal的功能也可以做同步操作

3 强引用 弱引用 软引用 虚引用

String weak Soft

软引用的强度大于弱引用
软弱都可以跟引用队列联合使用
软在内存不够的时候才会回收,弱扫描到才会回收。

可以帮助预防OOM 以及检测内存泄漏

4 OOM 与内存泄漏

内存泄漏:使用了,应该被回收,但是没有。
例如不正确的使用单利
长生命周期引用了短生命周期
没用convertView
没关游标
没recycle() Bitmap

解决办法:
Acgtivity泄漏可以通过LeakCanary
代码中的可以通过MAT看,原理是新建,回收,看涨没涨
分析实战:
生成hprof
转格式
Mat打开
看Suspect 或者是生成两个图进行对比

OOM分两种
一种是本身加载图的大小超过了应用分配的大小
另一种就是本来够,但是因为内存泄漏,导致剩余的空间不足。

5 JAVA的GC
JVM 堆:
新生代:存储所有新生成的对象
老年代:新生代的经过若干次GC后,移入
永久代:存储类和方法
1.当eden满了,触发young GC;
2.young GC做2件事:一,去掉一部分没用的object;二,把老的还被引用的object发到survior里面,等下几次GC以后,survivor再放到old里面。
3.当old满了,触发full GC。full GC很消耗内存,把old,young里面大部分垃圾回收掉。这个时候用户线程都会被block。

6 ISO TCP/IP的七层架构
ISO从上到下

PS:TCP/IP的 可靠传输也是由传输层实现的

7 捎带看一下三次握手里面ACK FIN等字段
服务器数据的序号和客户端数据的序号是没关系的。
8 Android常用的设计模式:
1 单利
2 工厂
BitmapFactory 根据参数返回不同的子类实例
3 适配器 Adapter
把一个类的接口变换成客户端所期待的另一种接口,从而使原本不匹配而无法在一起工作的两个,类能够在一起工作。

4 观察者模式 onClickListener

9 JAVA 多线程的实现方法:
1 Thread
2 实现Runnable
3 实现Callable
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

4 通过ExecutorService
步骤1:创建线程池:

  ExecutorService pool = Executors.newCachedThreadPool();

步骤2:通过Runnable对象或Callable对象将任务提交给ExecutorService对象:

  Future<Integer> submit(Callable<Integer> task);

10 Handler:
线程间通信 不能做跨进程通信

10 WindowManager相关

1 新建View子类的时候,需要传递context参数,这个参数可以通过this获取 Button btn = new Button(AdminActivity.this);
2 Activity可以通过getWindowManager()来获取WindowManager
3 WindowManager.LayoutParams可以用来设置宽高等数据
4 LP还可以设置FLAG,Type(Window层级,数字越大越优先展示)等

5 addView update remove等三个方法是ViewManager的。
WindowManager extends ViewManager
WindowManager 的子类 WMImpl 来实现,方法中全由WMGloble来完成、

11 Android 6.0 重大改变:
动态获取权限。安装时用户不同意的,在使用时还会有弹框。

7.0
DayDream
多窗口多任务
同一任务捆绑通知

12 临时变量: i++

13 final 引用不可变,但是被引用的地址存放的东西是可变的。
Static 实例共有 属于类

常量:
方法一采用接口(Interface)的中变量默认为static final的特性。

方法二采用了Java 5.0中引入的Enum类型。

方法三采用了在普通类中使用static final修饰变量的方法。

14 如何处理屏幕旋转和数据存储之间的关系?

15 ClassLoader Class.forName
java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象

16 策略模式

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

Price 含有一个Strategy接口的引用,并在构造函数中初始化这个引用。
Strategy接口有三个实现类,A B C
客户端的行为:
Strategy a = new StrategyA()
Price p = new Price(a);
p.calCount() 调用Strategy中的calCount方法,这个方法的具体实现为StrategyA()

从上面的示例可以看出,策略模式仅仅封装算法,提供新的算法插入到已有系统中,以及老算法从系统中“退休”的方法,策略模式并不决定在何时使用何种算法。在什么情况下使用什么算法是由客户端决定的。

原创粉丝点击