题目来源:
https://www.jianshu.com/p/c70989bd5f29
四大组件的生命周期和简单用法
参考:https://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html
Activity
生命周期
Activity各种情况下的生命周期
创建A:
A:onCreate,onStart,onResume
从A转到B:
onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)
finish B回到A:
onPause(B)->onActivityResult(A)->onRestart(A)->onStart(A)->onResume(A)->onStop(B)->onDestroy(B)
如果B是透明的,略有不同
创建A:
A:onCreate,onStart,onResume
从A转到B:
onPause(A)->onCreate(B)->onStart(B)->onResume(B)
finish B回到A:
onPause(B)->onActivityResult(A)->onResume(A)->onStop(B)->onDestroy(B)
下拉状态栏是不是影响activity的生命周期
不影响
横竖屏切换的时候,Activity 各种情况下的生命周期
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
Activity之间的通信方式:
intent携带数据
直接修改静态变量SecondActivity.staticArgs
Application全局变量
广播,EventBus
SharedPreference,File,Sqlite
两个Activity 之间跳转时必然会执行的是哪几个方法?
onSaveInstanceState(A)->onPause(A)->onResume(B)
Activity上有Dialog的时候按Home键时的生命周期:
Dialog对Activity的生命周期没有影响,等同于Activity按下home键后的生命周期。
->onSaveInstanceState()->onPause->onStop()
再切回来:
->onRestart->onStart–>onRestoreInstanceState–>onResume–>
Activity状态保存于恢复
1.onSaveInstanceState()
2.onRestoreInstanceState()
3.onCreate()函数也可以取得保存的值
fragment各种情况下的生命周期
参考:
https://www.cnblogs.com/fajieyefu/p/6092465.html
onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
1.界面打开:
->onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume
2.按下Home键
->onPause->onStop
3.重新打开
->onStart->onResume
4.按下返回键
->onPause->onStop->onDestroyView->onDestroy->onDetach
Fragment被回收又重新创建:
被回收执行
onPause->onSaveInstanceState->onStop->onDestroyView->onDestroy->onDetach
重新创建:
onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume
懒加载:
setUserVisibleHint
如何实现Fragment的滑动?
viewPager+framgent
fragment之间传递数据的方式?
参考:
http://blog.csdn.net/csdnzouqi/article/details/51742261
http://blog.csdn.net/tianhe718/article/details/53035834
1.创建时传值:
Fragment f = new Fragment();
Bundle bundle= new Bundle();
bundle.putInt("tag",1);
setArgument(Bundle bundle);
取值:
getArgument.getInt("tag");
2.成员方法
3.接口回调
4.EventBus
推荐EventBus
怎么在Activity 中启动自己对应的Service,怎么进行数据交互?
startService
1.定义一个类继承 Service
2.Manifest文件声明
3.startService(Intent)
4.stopService(intent)
开启之后,Activity与Service没有什么关系。
生明周期:
onCreate->onStartCommand->onStart->onDestroy(),重复调用只走onStart,onStartCommand
bindService
1.定义一个类继承 Service
2.Manifest文件声明
3.bindService(Intent, ServiceConnection, int)
4.unbindService(ServiceConnection)
生命周期:
onCreate->onBind->onUnbind->onDestroy
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法。
Android Service与Activity之间通信的几种方式
1.bindService(Intent,ServiceConnection,int)
2.广播
3.EventBus
IntentService原理及作用是什么?
为了实现让Service能够进行耗时操作的功能
内部有一个HandlerThread,ServiceHandler进行耗时操作
说说Activity、Intent、Service 是什么关系
Activity与Service都是ContextWrapper的子类,Activity负责界面的显示与交互, Service负责后台任务的处理,intent是信使
谈谈你对ContentProvider的理解
实现应用间共享数据
请介绍下ContentProvider 是如何实现数据共享的?
ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制),Android系统为什么会设计ContentProvider?
说说ContentProvider、ContentResolver、ContentObserver 之间的关系
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理
ContentResolver通过Uri来操作不同的数据库表的数据
请描述一下广播BroadcastReceiver的理解
广播的分类
参考:
http://blog.csdn.net/carson_ho/article/details/53160580
1.无序广播 同时收到
发送:
Intent intent = new Intent();
intent.setAction("com.itheima.cctv.action.NEWS");
intent.putExtra("data", "我是一个无序的广播");
sendBroadcast(intent);
2.有序广播 优先级高的先收到,优先级别高的广播接收者可以修改广播的内容,甚至是终止广播的继续传输
发送:
Intent intent = new Intent();
intent.setAction("com.itheima.gov.action.POTATO");
//发送有序广播
sendOrderedBroadcast(
intent, //意图对象
null, //指定接收的权限, null ,无需权限也能收到广播
new MyReceiver(), // 最终结果接收者 1. 不用注册也可以, 2. 最终广播将会到达这里,即使中途有人终止了,也能收到。
null, //handler
1, //初始代码 code
"主席讲话:每人奖励10斤土豆", //初始数据
null); //额外的数据
修改广播:
setResultData
终止广播:
abortBroadcast();
3.系统广播(System Broadcast)
系统发出的广播,可以直接注册actoin进行监听
4.App应用内广播(Local Broadcast)
App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。
相比于全局广播(普通广播),App应用内广播优势体现在:安全性高 & 效率高
使用方式1:
注册广播时将exported属性设置为false,使得非本App内部发出的此广播不被接收;
在广播发送和接收时,增设相应权限permission,用于权限验证;
发送广播时指定该广播接收器所在的包名,此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。
使用方式2:
使用LocalBroadcastManager,只能动态注册,
如何通过广播拦截和abort一条短信?
abortBroadcast();
广播是否可以请求网络?
LaunchMode应用场景
AlertDialog,popupWindow区别
AlertDialog是非阻塞线程的,Popupwindow是阻塞线程的。
Application 和 Activity 的 Context 对象的区别
Application context作用于整个应用存活的时间,Activity context只作用在Activity存活的时间,如果Activity被销毁了,会发生内存泄漏。
Android属性动画特性
可以作用于View和非View对象,作用于 View时,View的属性确实发生了变化。
如何导入外部数据库?
参考:http://blog.csdn.net/HAndroidevelopcker/article/details/68493214
db放入assets目录,复制到SD卡,或者默认的数据库目录/data/data/包名/databases/。
LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。
参考:http://blog.csdn.net/teamlet/article/details/27108655
LinearLayout 应用在所放置的组件完全在一条直线上,要么是横向的要么是纵向的。
组件和组件之间没有复杂的位置关系,通过 orientation 设置方向(横向/纵向);通过 gravity 设置对齐方式。
RelativeLayout 适用于组件较多,并且组件之间位置关系复杂,需要组件之间通过彼此的位置互相约束来确定位置。
通过 RelativeLayout 确定的组件之间的位置,不会因为 RelativeLayout 位置的变化而改变。
FrameLayout 组件的位置只和 FrameLayout左上角有关系
谈谈对接口与回调的理解
参考:http://blog.csdn.net/qq379454816/article/details/51546638
我把一个接口声明为一个变量,那么我执行这个接口中的方法,接口没有实例它该怎么办呢?啊哈,这里自然又改出现java中的另一个特性---“多态”,这时java虚拟机自然会去找其子类,调用其子类中已经重载的该方法,这里就是接口回调的本质!!我们只需要给该变量指向其子类的地址就可以在调用的时候知道调用子类的方法。那么我们就可以在A类中创建接口的子类实例,在B类中创建一个接口的变量,把A类的地址传给B类的变量,在变量执行接口中的方法的时候就会调用A类中重写的方法,这就是接口回调的执行步骤。
注册之后并不立马执行,而在某个时机触发执行
介绍下SurfaceView
参考:http://blog.csdn.net/android_cmos/article/details/68955134
1. SurfaceView允许其他线程更新视图对象(执行绘制方法)而View不允许这么做,它只允许UI线程更新视图对象。
2. SurfaceView是放在其他最底层的视图层次中,所有其他视图层都在它上面,所以在它之上可以添加一些层,而且它不能是透明的。
3. 它执行动画的效率比View高,而且你可以控制帧数。
4. SurfaceView在绘图时使用l了双缓冲机制,而View没有。
差值器 Interpolator
参考:http://blog.csdn.net/carson_ho/article/details/72863901
一个接口,设置属性值从初始值过渡到结束值的变化规律 ,实现非线性运动的动画效果。
自定义插值器需要实现 Interpolator / TimeInterpolator接口 & 复写getInterpolation()
重写getInterpolation,对input值根据动画的进度(0%-100%)通过逻辑计算 计算出当前属性值改变的百分比
估值器 TypeEvaluator
参考:http://blog.csdn.net/carson_ho/article/details/72863901
一个接口,设置 属性值 从初始值过渡到结束值的变化具体数值 ,协助插值器 实现非线性运动的动画效果。也就是Interpolator决定变化趋势,TypeEvaluator决定具体的数值。
属性动画特有的属性
自定义估值器
根据 插值器计算出当前属性值改变的百分比 & 初始值 & 结束值 来计算 当前属性具体的数值
实现TypeEvaluator接口,重写evaluate
Android中数据存储方式
File、SharedPreference、SQLite、ContentProvider、网络
Android动画框架实现原理
参考:http://blog.csdn.net/yelbosh/article/details/7750500
Child要重画时会调用invalidate()通知Parent,一直向上到ViewRoot.
这个过程:
->invalidate
->invalidateInternal
->invalidateChild
->invalidateChildInParent
->ViewRootImpl.invalidateChildInParent(int[],Rect);
->ViewRootImpl.invalidateRectOnScreen(Rect);
->ViewRootImpl.scheduleTraversals();
->ViewRoot.doTraversals();
->performTraversals();
->performMeasure()
->measure()
->onMeasure()
->performLayout()
->layout
->onLayout()
->performDraw()
->draw
1.drawBackground,
2.如果需要,保存画布(canvas),为淡入淡出做准备
3.通过调用View.onDraw(canvas)绘制View本身的内容
4.通过 dispatchDraw(canvas)绘制自己的孩子,dispatchDraw->drawChild->child.draw(canvas) 这样的调用过程被用来保证每个子 View 的 draw 函数都被调用
5.如果需要,绘制淡入淡出相关的内容并恢复保存的画布所在的层(layer)
6.绘制修饰的内容(例如滚动条)onDrawScrollBars(canvas);
Android 动画就是通过 ParentView 来不断调整 ChildView 的画布坐标系来实现的,
如果 ParentView在dispatchDraw发现 ChildView 有动画,就会不断的调用 invalidate() 这个函数,这样就会导致自己会不断的重画,就会不断的调用 dispatchDraw 这个函数,这样就产生了动画的后续帧.
public void startAnimation(Animation animation) {
animation.setStartTime(Animation.START_ON_FIRST_FRAME);
setAnimation(animation); invalidate();
}
动画的具体实现
Animation动画Transformation顾名思义 :变化Animation 中主要定义了动画的一些属性比如开始时间、持续时间、是否重复播放等在Animation中有两个重要的函数:
1.getTransformation getTransformation 中 Animation 会根据动画的属性来产生一系列的差值点,然后将这些差值点传给 applyTransformation
2.applyTransformation 这个函数将根据这些点来生成不同的 Transformation
Transformation中包含一个矩阵和 alpha 值,矩阵是用来做平移、旋转和缩放动画的,当调用dispatchDraw时会调用getTransformation来得到当前的Transformation