Android面试题

2019-03-06  本文已影响0人  taijielan
自定义view

资料
自定义分为俩种,一种是组合类型的自定义view,还有一种是继承自View或者ViewGroup的自定义View,组合类型的自定义View 比较简单,仅仅需要将公用的内容合并为一个控件(如 :列表展示),好处是封装了控件,可以不用重复写xml文件,配置起来也方便。
用到的相关属性 :

  <declare-styleable name="MyView">
      <attr name="width_size" format="dimension"></attr>

  </declare-styleable>
 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyView);
        size = typedArray.getDimensionPixelSize(R.styleable.MyView_width_size,30);
        typedArray.recycle();//注意回收

注意:getMeasuredWidth()与getWidth()的区别。他们的值大部分时间都是相同的,但意义确是根本不一样的,
区别主要体现在下面几点:


动画:

插值器:interpolator,默认的插值器AccelerateDecelerateInterpolator
Android中共有3种动画,桢动画,补间动画,和属性动画。


Android 网络请求相关的api?
Android 中的多线程有哪些?

Thread ,Executors,Hanlder ,AsyncTask, HandlerThread,IntentService。

Hanlder的机制?

Android 的消息机制,也就是Handler的运行机制,Handler是靠Looper和MessageQueue来支撑的,Messagequeue就是消息队列,用来存储Message的,内部以单链表的方法插入和删除消息,Looper从名称上看是循环的意思,Messagequeue只是存储消息,但是不负责消息的处理,但是Looper就填补了这个功能,Looper以无限循环的方式不断从Messagequeue中轮询查看是否有新消息,如果有就处理,没有就一直等着。
Handler 不断将Msg压入到MsgQueue中,而Looper不断从MsgQueue中轮询Msg,然后 再将 dispatchMsg到对应的Handler中处理。

一个线程只有一个looper,(通过ThreadLocal控制),一个looper只能对应一个消息队列,(消息队列是在Looper创建时候同时创建的)一个消息队列可以有多个message,一个线程可以有多个hanlder。
Handler:主要用于发送消息。
Looper:主要用于轮询消息队列。
MsgQueue:主要存储消息 (链表结构 插入和删除有优势,数组在查询上有优势)。
Msg:要处理的任务请求。

Looper.looper ()方法为什么没有让主线程卡死?

ThreadLocal:并不是真的线程,只是以线程为作用域,存储当前线程中数据副本,looper就是靠ThreadLocal存储的。
ActivityThread:也是UI线程,默认会自动创建Looper


Android中为什么不允许子线程访问UI线程?

Android的UI线程是单线程的非安全的,如果多线程访问UI线程会使界面处于不可知的状态。如果加上锁会导致逻辑复杂,还有就是加上锁会导致UI线程执行效率低,因为加上锁会导致线程堵塞。

关于AsyncTask。
其他:

AsyncTask在Android1.6之前是并行的,而在Android3.0之后是串行的.

线程池

corePoolSize:核心线程数。
maximumPoolSize:最大线程数。
keepAliveTime:当线程数量大于核心线程的时候,空余线程等待新任务执行的最大时间,否则会自动销毁。
unit:时间单位。
workQueue:线程池中的任务队列。

Java中的锁有哪些?

synchronized ReentrantLock.

进程和线程

线程:是CPU的调度的最小单元,同时线程也是一种有限的系统资源。
进程:指一个执行单元,在PC或者移动设备上指一个应用或者一个程序。

Android AIDL ,IPC

AIDL:Android Interface define Language
IPC: inner process community 进程间通讯
Aidl 是一种IPC的一种,Bindler也是IPC的一种,Aidl定义的接口实现了IBinder

Android中为什么需要AIDL?
Android跨进程通讯的方式?
Binder

Binder是Android系统进程间(IPC)通讯方式之一,底层基于client-server的通讯方式,服务器端通过保存Binder实体对象,client端通过指针引用来调用。这里说的server是提供网络连接,音视频转码,解码的进程server,Client是指向这些Server发起请求的应用程序。Android中用的比较多的Binder是Service。Android Framwork层面来说Binder的主要用处是ServiceManger连接各种Manager(ActivityManger,WindowManger)和其他响应的ManagerService的桥梁。

aidl(其实非必需的,可以手写出来 )

服务端:通过创建一个Service来监听客户端的连接请求,创建AIDL文件,将暴露给客户端调用的接口在这个AIDL文件中声明,在Service中实现具体的AIDL接口。
客户端:绑定这个Service,绑定成功后,通过服务端返回的binder对象生成AIDL的类型,这样就可以调用AIDL中的方法了。
通过定义aidl接口,编译器自动生成跨进程通信的java接口。通过aidl传递的对象必须是序列化的实现parcelable或者Serializable
需要注意的是:

AIDL支持的数据类型?

八种基本数据类型(double,long, int,float,short,boolean,byte,char)

List ,Map

String ,CharSequence

Parcelable以及AIDL

sqlite
public class SqliteDataBaseHelper extends SQLiteOpenHelper {
    public static final String BOOK_TABLE = "book";
    public static final String PERSON_TABLE = "person";
    public static final String CREATEPERSONTABLE = "CREATE TABLE IF NOT EXIST" + PERSON_TABLE + "(_id INTEGEr PRIMARY KEY," + "name TEXT," + "sex TEXT)";
    public static final String CREATEBOOKTABLE = "CREATE TABLE IF NOT EXIST " + BOOK_TABLE + "(_id INTEGER PRIMARY KEY, " + "name TEXT)";

    public static final String databaseName = "contentprovider.db";

    public SqliteDataBaseHelper(Context context) {
        super(context, databaseName, null, 1);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATEBOOKTABLE);
        db.execSQL(CREATEPERSONTABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

insert into person (name,sex) values (valuse1,valuse2);
delete from person where name = value1
update person set sex ="女" where name = "value1"
select name from person

getX(),getRawX(),getY(),getRawY();
scrollTo 与scrollBy的区别

scrollTo 是滑动的指定的距离。
scrollBy 是在原来的基础上滑动指定的距离。
scrollTo与scrollBy是滑动的view的内容,并不是互动view本身

Android中想让一个view移动,有哪些方法?
Android 事件分发机制?

*onDisppatchTouchEvent:返回true表示消费当前事件,这个事件不会逆向传递了,直接结束了,如果返回false将不交给自己的TouchEvent处理了,如果有上级view,则交给上级view的TouchEvent处理,返回super表示向下传递,直到被消费掉。

//不希望父布局拦截事件
getParent().requestDisallowInterceptTouchEvent(true);


Android 中finish()方法可能再onStop,onPause()方法之前调用。
Activity由于意外销毁到重新创建加载数据的方法:

onSaveInstanceState (Bundle bundle),onRestoreInstanceState(Bundle bundle)

Android横竖屏切换时,生命周期方法?
Activity中onCreat()和onDestory()配对,标志Activity的创建和销毁,onStart()和onPause()表示Activity是否可见,onResume()和onStop()表示Activity是否在前台。

Android的启动模式?

理解前台栈和后台栈:前台栈是用户看见的,后台栈是用户看不到。

onCreate中的Bundle 或onRestoreInstanceState中的Bundle有什么区别?

onCreate中的需要进行非空判断,而onRestoreInstanceState如果被调用,里面的Bundle是一定有值的。

Service 的onCreate,onStartCommand(),onDestory()方法都运行在UI线程
Service的启动方式有几种,以及生命周期方法有哪些?
onStartCommand(Intent intent, int flags, int startId) 的返回值?

返回值的作用主要是当服务被kill之后,确认是否需要重新启动

ContentProvider对底层数据的存储没有要求,可以是Sqlite,也可以试文件,还可以是其他的任何类型。

Android中Window有哪些?

Activity,Toast,Dialog 等,

Android中Activity,View已经Window之间的关系?

开发者口中Activity可以作为一个页面,实际可以将Activity理解为一种特殊的View,一种可以让用户可以看的到视图,Window表示是对视图的一种抽象(本身Window也是抽象类),从它的定义看出它是一种顶级的视图外观和行为。如果想讲一个Actiivty在手机中显示出来,通过在ActivityThread.handleResumeActivity()调用r.activity.makeVisible(),将Activity和Window关联起来。通过Window->WindowMangerImpl->WindowMangeGlobal->ViewRootImpl 将Activity绘制出来。

Activity中子线程不能更新UI吗?

答案是能更新UI,不过是种特殊情况,在ViewRootImpl创建出来之前更新UI就行了。

gradle 打包流程?

大概分为以下几个步骤
1、使用aapt工具将res资源文件生成R.java文件
2、使用aidl工具将aidl文件生成对应java文件
3、使用javac命令编译工程源代码和上面两步生成的文件,生成class文件
4、通过dex工具将class文件和第三方jar包打成dex文件
5、用aapt工具将res下的资源文件编译成二进制文件,然后将其和上一步中的dex文件以及assets中的文件通过apkbuilder工具打包成apk文件
6、通过jarsigner对apk进行签名
7、利用zipalign工具对apk进行字节对齐优化操作

ScrollTo,与ScrollBy的区别?

scrollBy内部调用了scrollTo,它是基于当前位置的相对滑动;而scrollTo是绝对滑动,因此如果利用相同输入参数多次调用scrollTo()方法,由于View初始位置是不变只会出现一次View滚动的效果而不是多次。
引申:两者都只能对view内容进行滑动,而不能使view本身滑动,且非平滑,可使用Scroller有过渡滑动的效果

Android和Fragment的交互

Bunlder、接口回调,广播、Eventbus、

Actiivty的启动模式

standard(标准)总是会创建一个新的activity。
singleTop(栈顶)注意onNewIntent()方法的使用 ,可用通知栏,和搜索界面来举例。 如果启动的activity位与栈顶,则不会重复创建,回调onNewIntent()方法。如果不是位于栈顶,则会调用oncreate方法重复创建,和standard类似。
singleTask(栈复用) 整个栈内只会存在一个实例,
singleInstance(单例) 作为栈复用的加强版,每次创建activity都会创建一个新的任务栈,并保存该activity的实例,并保证没有其他activty进入。

BroadcastReceiverLocalBroadcastReceiver有什么区别。

BroadcastReceiver是针对应用间、应用和系统间、应用内部的一种通信方式。内部实现通过binder机制实现。
LocalBroadcastReceiver是针对应用内部之间的的一种通信方式,应用外收不到,效率比较高。内部的实现是通过handler

上一篇 下一篇

猜你喜欢

热点阅读