六、自定义View如何提供获取View属性的接口
a、attrs.xml定义declare-styelable
b、构造方法中用TypedArray获取值
c、xml使用,加apk/res-auto
七、art和Dalvik对比(绿色表示面试出现概率很大)
7.1、即时编译技术(Just In Time JIT)与预编译技术(Ahead Of Time AOT)
1、JIT(Just In Time)即时编译技术
a、解释执行逐条编译成机器码,执行速度仍比直接执行机器码慢
b、JIT技术在运行时将热方法编译成机器码,存储到代码缓存中,以后不再解释执行
2、AOT(Ahead Of Time)预编译技术
a、在安装时就直接编译成机器码,运行时直接运行机器码
7.1、对机器码的处理
1、dalvik下,每次运行时字节码通过JIT转换为机器码,效率低
2、ART下,第一次安装时通过AOT编译成机器码。启动和执行都会很快
3、ART下,机器码储存空间大,安装应用的时间变长
7.2、两者的联系
1、android 4.4用ART(Android
Runtime)替代Dalvik,开发者模式中“选择运行环境”
八、Dalvik虚拟机
8.1、Dalvik的特点
1、每个程序都有一个Dalvik
2、Dalvik是基于寄存器的,数据访问通过寄存器间直接传递;jvm基于栈,从栈上读写数据需要很多的指令指派和内存访问次数
3、Dalvik处理dex文件,执行的是Dalvik字节码。 Dalvik字节码由java字节码转换而来,并被打包到dex文件中,Dalvik解释dex文件执行Dalvik字节码
8.2、Android SDK中有个dx工具将Java字节码转换为Dalvik字节码
1、dx工具对java字节码重排序
2、将java类文件中的常量池分解,消除冗余信息,重新组成一个常量池,所有类文件共享一个常量池,相同字符串、常量在Dalvik中只出现一次,减少文件体积
八、Dalvik与jvm的区别
1、Dalvik基于寄存器,处理的是dex文件,Dalvik字节码,支持JIT
2、jvm基于栈,
3、java处理java字节码。
4、jvm本质上是软件,将Java字节码翻译为机器码
九、滑动冲突解决
1、onInterceptTouchEvent中ACTION_DOWN做标记,不拦截;在ACTION_MOVE中作条件判断,拦截。然后交给onTouchEvent事件
2、内部拦截,parent.requestDisallowInterceptTouchEvent
十、四大组件的生命周期
10.1、Activity的生命周期
1、正常启动:oncreate->onStart->onResume
2、back键退出:onPause->onStop->onDestory
2、透明Activity、对话框或者锁屏:onPause->onResume
3、非透明Activity、完全覆盖或者Home件回主屏:onPause->onSaveInstanceState->onStop->onRestart->onStart->onRestoreInstanceState->onResume
4、下拉通知栏,对生命周期时没有影响的
5、不走onStop的情景,在onCreate中调用finish
6、从A的Activity中点击button进入B Activity。再back键finish掉B Activity。A和B的完整生命周期,也就是A的onStop要在B的onResume之后同理finish掉B:
A.onCreate->A.onStart->A.oResume->A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop->B.onPause->A.onCreate->A.onStart->A.onResume->B.onStop->B.onDestroy
10.2、Activity几个函数的调用
1、onSaveInstanceState、onRestoreInstanceState调用时机
a、透明Activity、对话框或者锁屏的时候因系统资源不足杀死
b、屏幕方向改变
c、非透明Activity、完全覆盖或者Home件回主屏
d、长期待在后台资源不足时
PS:被回收,Fragment重叠就是这样造成的
ps:Activity的onSaveInstanceState时,收集实现了保存/恢复方法View的状态;在onRestoreInstanceState方法中,Activity将收集的状态发回View结构树具有相同id的View(做搜索的时候,EditText出现的问题)。
10.3、Activity的四种启动模式和应用场景
1、四种启动模式,在AndroidManifest的android:launchMode属性
a、standard:默认,每次都创建一个Activity实例放在任务栈
b、singleTop:如果这个Activity实例在任务栈顶,onNewIntent重用该实例;否则创建一个新实例放在任务栈顶
c、singleTask:任务栈中有这个Activity实例,onNewIntent重用该实例;并且这个实例之上的任务全部出栈
d、singleInstance:一个独立的任务栈存在这个Activity实例
2、应用场景
a、singleTop:消息推送要启动的Activity;登录成功要跳转的Activity;耗时操作返回的Activity
b、singleTask:浏览器、微博的入口主Activity;
c、singleInstance:呼叫来电界面;闹钟提醒;不可用于中间跳转页
3、什么是任务栈
1、每一个程序都有一个任务栈,这个程序的所有Activity都放在这个任务栈中
2、栈顶activity才可以和用户交互
3、退出程序时,任务栈的所有activity出栈,任务栈被销毁。
4、另外一种形式的启动模式,Intent标志
a、FLAG_ACTIVITY_NEW_TASK对应singleTask
b、FLAG_ACTIVITY_SINGLE_TOP对应singleTop
c、FLAG_ACTIVITY_CLEAR_TOP对应清除栈中Activity和其上面的Activity,重新创建这个Activity
5、不同进程的Activity可以放在同一个任务栈,如android:process=":remote"
6、用taskAffinity可以在一个程序中指定不同的栈,也可不同进程同一个栈
10.4、Service的生命周期
1、startService->onCreate(Service已创建跳过)
->onStartCommand->stopService/stopSelf->onDestroy
2、bindService->onCreate->onBind->unbindService->onUnbind->onDestroy
PS:做过的项目中,NetTrafficService采用startService和bindService同时使用。在bindService时使用不同Action,而在onBind中对不同的Action返回不同用途的接口。bindService和unbindService配对使用。
10.5、bindService几个点
1、indService的onBind执行一次和多个Client即组件(如Activity)绑定
2、bindService发生的事情
a、Client执行bindService
b、Service不存在,Service执行onCreate
c、没有执行过onBind,Service执行onBind
d、执行过onBind,直接获取上次已经获取到的IBinder实例。
e、onBind一次执行创建的IBinder实例,Anroid会将该IBinder存起来,对所有client共享
f、client的ServiceConnection执行onServiceConnected
3、Client销毁,比如Activity执行onDestroy,该Client就会自动解除与Service的绑定
4、UnBindService发生的事情
a、Client执行unbindService
b、Client与Service解除绑定状态
d、Service检测是否还有其他Client与其绑定
c、如果没有其他Client绑定,Service执行onUnbind、onDestroy
十一、Fragment的生命周期
11.1、生命周期
1、onAttach->Activity的onAttachFragment->onCreate->onCreateView->onActivityCreate->onStart->onResume
2、onPause->onStop->onDestroyView->onDestory->onDetach
11.2、Fragment的状态保存和恢复
1、Fragment的自身状态保存
1.1、Activity中对View已经有保存和恢复,在Fragment中就应该不再有。Fragment只保存和保存自身的成员变量
11.3、Fragment的传递数据
1、使用setArgument,在onCreate中getArgument取出
a、好处:内存重启之前,这样做可以让系统保存数据。同Activity的intent恢复机制
11.4、Fragment中存在的七大问题
11.5、getActivity空指针问题
1、原因:
a、onDetach造成
b、onSaveInstanceState保存Fragment造成:Activity回收Fragment不会回收,而是在onSaveInstanceState中保存在Bundle中,在Activity的onCreate中取出来恢复。恢复的Fragment使用getActivity会是null
2、解决方案:在onAttach中用mActivity=getActivity保存Activity的引用
11.6、Fragment重叠问题
1、原因:onSaveInstanceState时,保存了Fragment,而回收了Activity。onCreate取出了Fragment,又add一个Fragment
2、出现情况:
A、当使用add、show和hide组合方式操作,重新add一个Fragment
B、使用replace不会出现这个问题,每次replace都会执行Fragment的生命周期。在这些生命周期里如果拉取了数据,就会造成多次重复拉取
C、add是将一个Fragment添加到container;replace先remove掉相同id的Fragment,再add,其中remove会执行那个Fragment的onDetach。而add在只有第一次add的时候会,在Activity退出的时候执行onPause->onStop->onDestroyView->onDestroy->onDetch
D、根本原因是在Fragment的hide之后,Activity的onSaveInstanceState中的FragmentState没有对应的Fragment的mHidden状态
2、解决方案
a、重写Activity的onSaveInstanceState,调用super.onSavedInstanceState之前使用FragmentTransaction.remove删除所有的Fragment,FragmentTransaction.commitAllowingStateLoss。FragmentTransaction通过getFragmentManager().getFragmentTransaction
b、重写Activity的onAttachFragment,让新的Fragment指向原来未原来未销毁的Fragment
c、重写Activity的OnSaveInstanceState保存hidden状态,在重建之前Fragment的onCreate的判断saveInstanceState是否为null,调用FragmentTransaction.hide并FragmentTransaction.commit
d、在Activity的onCreate中重建Fragment之前调用savedInstanceState.remove(TAG)
e、重写onSaveInstanceState,不调用super.onSaveInstanceState
十二、Fragment与Activity间的通信
12.1、Fragment和Activity相互获得
1、Fragment获得Activity:getActivity
2、Activity获得Fragment:getFragmentManager.findFragmentById([fragment在Activity中的布局id])
12.2、Fragment与Fragment间通信
1、 通过Activity中转:getActivity().getFragmentManager().findFragmentById
2、使用接口
3、 使用广播
十三、ContentProvider
13.1、概念
1、Android四大组件,提供增删查改功能,必须在AndroidManifest中注册
2、将自己的数据通过URI共享出去
3、以数据库表的方式将数据暴露出去,外界通过URI方法
4、系统中联系人信息、短信信息、图片库和音频库都是通过ContentProvider展现
13.2、URI
1、URI由Scheme、authority、path、query和fragment组成
2、UriMacth类对Uri进行验证
13.3、ContentProvider、ContentResolver、ContentObsever的关系
1、ContentProvider对外提供数据
2、ContentObserver监听数据的改变状态
3、ContentResolver获取ContentProvider提供的数据,ContentResolver.registerContentObserver注册ContentObserver、ContentResolver.notifyChange发出通知ContentProvider
十四、Android数据存储方式
14.1、五大存储方法
1、File
2、SharedPreference
3、ContentProvider
4、SQLiteDataBase
5、网络