(一)Android基础知识点
四大组件是什么Activity、Service、BroadCastReceiver、ContentProvier
四大组件的生命周期和简单用法
1、Activity: Oncreat onstart onresume onpause onstop ondestroy
2、Service: 1、oncreat OnstartCommand ondestroy2、oncreat onbind onunbind ondestroy
3、BroadCastReveiver:注册到Onreceive()结束
4、ContentProvider 就是返回cursor的生命周期
Activity之间的通信方式
Intent
借助类的静态变量
借助全局变量/Application
借助外部工具借助SharedPreference使用Android数据库SQLite赤裸裸的使用FileAndroid剪切板
借助Service bindService回调
Activity各种情况下的生命周期
1>横竖屏
Activity1----->onCreate Activity1----->onStart Activity1----->onResume
模拟器中按下Ctrl+F11或者Ctrl+F12由竖屏切换到横屏:
Activity1----->onPause Activity1----->onSaveInstanceState Activity1----->onStop Activity1----->onDestroy Activity1----->onCreate Activity1----->onStart Activity1----->onRestoreInstanceState Activity1----->onResume
模拟器中按下Ctrl+F11或者Ctrl+F12由横屏切换到竖屏:
Activity1----->onPause Activity1----->onSaveInstanceState Activity1----->onStop Activity1----->onDestroy Activity1----->onCreate Activity1----->onStart Activity1----->onRestoreInstanceState Activity1----->onResume
设置android:configChanges="orientation|keyboardHidden|screenSize":
Oncreat、onstart 、onresume、onconfigurechange、onpause、onstop、ondestroy
2>分屏
分三种情况
当前显示自己的应用页面,长按多任务键时出现分屏
onMultiWindowModeChanged(true)->onPause-onStop->onDestroy->onCreate->onStart- >onResume->onPause
分屏时长按多任务键,全屏显示自己的应用时
onStop->onDestroy->onCreate->onStart->onResume>onPause>onMultiWindowModeChanged(false)->onResume
当前显示其他应用,按多任务键出现自己的应用时
onMultiWindowModeChanged(true)->onDestroy->onCreate->onStart->onResume
Activity与Fragment之间生命周期比较
Activity有的,Fragment都有Fragment多了onCreateView onActivityCreated、ondestView
Activity上有Dialog的时候按Home键时的生命周期
Onresume开始往下,执行如果弹出dialog会走onpause方法
两个Activity 之间跳转时必然会执行的是哪几个方法?
前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
Activity的四种启动模式对比
standard、singleTop、singleTask、singleInstance
1:基本启动模式,先进后出原则,每次跳到同一个activitiy是不同的实例,也就是重新创建Activity
2、SingleTop:栈顶启动模式,如果栈中没有这个实例,重新创建,如果有,分在栈顶和非栈顶
前者直接用栈顶实例,后者这时跟standard一样重新创建实例
3、singleTask:栈内复用模式,该模式启动Activity,会根据taskaffinity找到是否是一个名字
如果不存在这个名字,重新创建一个Activity实例到新创建的Task中
如果存在一样名字,再从栈中看是否有这个实例,有的话,将该实例之上的Activity 清理掉,再启动这个Activity。如果栈中没有该实例,重新创建,放入栈中
4、singleInstance:全局唯一模式,重新开辟一个栈,单独放该实例,如果启动时,已经有一个这个实例,会将该实例直接调度到前台,单例形式存在,比较野蛮。慎用
工具:
1>通过getClass.getSimplename\getHashCode\getTaskId查看实例在栈中变化,OnNewIntent()和OnCreate两个方法中打印查看
2>adb shell dumpsys activity activitys查看当前activity实例情况
PS:该功能跟activity生命周期一样,自己打印走一遍就知道
Acivity状态保存于恢复
1、onSaveInstanceState() onSaveInstanceState() 方法用来在Activity被强制销毁之前保存数据,通过bundle参数鞋带,Bundle传数据通过put...。
2、onRestoreInstanceState()onSaveInstanceState() 方法用来取得之前在onSaveInstanceState() 保存的值。,onCreate()函数也可以取得保存的值,从savedInstanceState中获取
fragment各种情况下的生命周期
Fragment状态保存startActivityForResult是哪个类的方法,在什么情况下使用?
没明白这个意思,如果想在Fragment中ONactivityforresult获取data,使用fragment.startactivityForResult。但在Activity中OnActivityForResult能获取,但是requestCode不对。相反,如果在activity.startactivityForResult,就只能在activity中OnactivityForResult中获取数据,fragment中获取不了
如何实现Fragment的滑动?
加手势或者使用fragmentpagerAdapter+viewpager
fragment之间传递数据的方式?
1、set方法,正常流水式使用set...()传递数据2、回调方式,回调一般用于反过来的数据传递,A跳到B,A需要B数据
3、全局方式保存,Applacation中、单例中、Activity中
4、EventBus,EventBus还是比较好用,在Activity、fragment、service、线程所以传递数据中发挥作用,是一种发布/订阅者模式,操作如下
a、EventBus.getDefault().register();在需要获取数据的地方注册,相当于订阅注册,订报纸
b、EventBus.getDefault().post(Data data)传递数据源,发布
c、@subscribe public void event(String data);这个方法订阅数据
d、最后注销订阅注册EventBus.getDefault().register()
Activity 怎么和Service 绑定?
怎么在Activity 中启动自己对应的Service?
service和activity怎么进行数据交互?
前言:先了解startService()跟bindService()区别1、startService()启动后,走一次Oncreate,而OnstandCommand()方法会根据你start的次数,如果不调用stopService(),这个service将一直在后台运行,直到被系统kill
2、bindService()启动后,走一次onCreate()方法,不走onStandCommand(),此时走onBind()方法,如果不调用unBindService停止该Service,会一直运行。不过如果当前实例被销毁,该service自动销毁
3、如果1和2步骤都走了,必须通过1方法停止该service
绑定:bindservice的实例中创建ServiceConnection对象,并实现两个方法onServiceDisconnnected()和onServiceConnnected(),后者返回Service中onBind()返回的Binder实例,需要在Service中创建一个继承Binder类,可以给该binder设置数据返回该对象,Binder对象实现了Ibinder接口,
public class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//接收从Service传回的对象,强制转换类型,Binder实现Ibinder接口所以可以强转
myBinder = (MyBinder)service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
4、class MyBinder extends Binder{....}
5、Service中onBind()方法
@Override
public IBinder onBind(Intent intent) {
final MyBinder myBinder = new MyBinder();
myBinder.set....
return myBinder;
}
谈谈你对ContentProvider的理解
说说ContentProvider、ContentResolver、ContentObserver 之间的关系
请描述一下广播BroadcastReceiver的理解
广播的分类
1、有序和无序(1).有序广播可以用priority来调整优先级 取值范围-1000~+1000,默认为0
(2).abortBroadcast()来终止该广播的传播,对更低优先级的屏蔽
(3).有序广播在传播数据中会发生比如setResultData(),getResultData(),在传播过程中,可以从新设置数据
广播使用的方式和场景
在manifest 和代码中如何注册和使用BroadcastReceiver?
1.在代码中注册: context.registerReceiver(receriver,filter);
2.在AndroidManifest中注册,使用这种方式注册时,即使程序已经退出,广播依然会响应(因为会被操作系统调用)。在AndroidManifest中注册时,可以通过指定exported属性,来控制该广播接收器是否可以接受来自其它应用程序的广播,
本地广播和全局广播有什么差别?
BroadcastReceiver,LocalBroadcastReceiver 区别
1、平时使用的都是全局广播
2、本地广播使用LocalBroadCastReceiver
使用LocalBroadcastManager有如下好处:
发送的广播只会在自己App内传播,不会泄露给其他App,确保隐私数据不会泄露
其他App也无法向你的App发送该广播,不用担心其他App会来搞破坏
比系统全局广播更加高效
和系统广播使用方式类似:
先通过LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); 获取实例
然后通过函数 registerReceiver来注册监听器
AlertDialog,popupWindow,Activity区别
(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。
(4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
其中最本质的差别就是:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。我们在写程序的过程中可以根据自己的需要选择使用Popupwindow或者是Dialog。
Application 和 Activity 的 Context 对象的区别
都是继承context,Application是应用整个生命周期,Context是对当前Activity、service的引用,也称为上下文。
Android属性动画特性
valueAnimation
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
ObjectAnimation 继承valueAnimation
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);
组合:ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
如何导入外部数据库?
LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。
谈谈对接口与回调的理解
回调的原理
写一个回调demo
介绍下SurfView
SurfaceView属于View的子类 它是专门为制作游戏而产生的,它的功能非常强大,最重要的是它支持OpenGL ES库,2D和3D的效果都可以实现。创建SurfaceView的时候需要实现SurfaceHolder.Callback接口,它可以用来监听SurfaceView的状态,比如:SurfaceView的改变 、SurfaceView的创建 、SurfaceView 销毁等,我们可以在相应的方法中做一些比如初始化的操作或者清空的操作等等。
1. SurfaceView允许其他线程更新视图对象(执行绘制方法)而View不允许这么做,它只允许UI线程更新视图对象。
2. SurfaceView是放在其他最底层的视图层次中,所有其他视图层都在它上面,所以在它之上可以添加一些层,而且它不能是透明的。
3. 它执行动画的效率比View高,而且你可以控制帧数。
4. SurfaceView在绘图时使用l了双缓冲机制,而View没有。(例子是借用CSDN)
public class MySurfaceView extends SurfaceView
implements SurfaceHolder.Callback, Runnable {
// SurfaceHolder
private SurfaceHolder mHolder;
// 用于绘图的Canvas
private Canvas mCanvas;
// 子线程标志位
private boolean mIsDrawing;
public MySurfaceView(Context context) {
super(context);
initView();
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private void initView() {
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
//mHolder.setFormat(PixelFormat.OPAQUE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsDrawing = true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsDrawing = false;
}
@Override
public void run() {
while (mIsDrawing) {
draw();
}
}
//绘图操作
private void draw() {
try {
mCanvas = mHolder.lockCanvas();
// draw sth绘制过程
mPath.lineTo(x,y);
//SurfaceView背景
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath,mPaint);
} catch (Exception e) {
} finally {
if (mCanvas != null)
mHolder.unlockCanvasAndPost(mCanvas);//保证每次都将绘图的内容提交
}
}
}
RecycleView的使用
序列化的作用,以及Android两种序列化的区别
Parcelable 比serializable性能好
区别SerializableParcelable
所属APIJAVA APIAndroid SDK API
原理序列化和反序列化过程需要大量的I/O操作序列化和反序列化过程不需要大量的I/O操作
开销开销大开销小
效率低很高
使用场景序列化到本地或者通过网络传输内存序列化
差值器
估值器
TimeInterpolator(时间插值器):
1、作用:根据时间流逝的百分比计算出当前属性值改变的百分比。
2、系统已有的插值器:①LinearInterpolator(线性插值器):匀速动画。 ②AccelerateDecelerateInterpolator(加速减速插值器):动画两头慢,中间快。 ③DecelerateInterpolator(减速插值器):动画越来越慢。
TypeEvaluator(类型估值算法,即估值器):
[if !supportLists]1. [endif]作用:根据当前属性改变的百分比来计算改变后的属性值。
[if !supportLists]2. [endif]系统已有的估值器:①IntEvaluator:针对整型属性 ②FloatEvaluator:针对浮点型属性 ③ArgbEvaluator:针对Color属性
[if !supportLists]3. [endif]可继承TypeEvaluator,重写evaluat方法返回是T对象
Android中数据存储方式
1、 使用SharedPreferences存储数据
2、文件存储数据
3、 SQLite数据库存储数据
4、使用ContentProvider存储数据
5、网络存储数据