1.Bitmap的使用
创建Bitmap的时候,Java不提供new Bitmap()的形式去创建,而是通过BitmapFactory中的静态方法去创建
2.什么是AIDL 以及如何使用
AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码。
设计AIDL这门语言的目的就是为了实现进程间通信。在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求
3.四大组件及生命周期;ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控制);Activity的四种启动模式对比;Activity状态保存于恢复;
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。
ContentProvider是根据URI来获取数据的,那它怎么区分不同的URI呢,因为无论是获取笔记列表还是获取一条笔记都是调用query方法,现在来实现这个功能。需要用到类UriMatcher,该类可以帮助我们识别URI类型
请介绍下ContentProvider 是如何实现数据共享的
ContentProvider 是应用程序之间共享数据的接口. 使用的时候首先自定义一个类继承 ContentProvider, 然后覆写 query、insert、update、delete 等方法. 因为其是四大组件之一因此必须在 AndroidManifest 文件中进行注册. 把自己的数据通过 uri 的形式共享出去
第三方可以通过 ContentResolver 来访问该 Provider
说 ContentProvider, ContentResolver, ContentObserver 之间的关系
ContentProvider 内容提供者,用于对外提供数据
ContentResolver.notifyChange(uri)发出消息
ContentResolver 内容解析者, 用于获取内容提供者提供的数据
ContentObserver 内容监听器, 可以监听数据的改变状态
ContentResolver.registerContentObserver()监听消息
4.Android开机过程
BootLoder引导,然后加载Linux内核.
0号进程init启动.加载init.rc配置文件,配置文件有个命令启动了zygote进程
zygote开始fork出SystemServer进程
SystemServer加载各种JNI库,然后init1,init2方法,init2方法中开启了新线程ServerThread.
在SystemServer中会创建一个socket客户端,后续AMS(ActivityManagerService)会通过此客户端和zygote通信
ServerThread的run方法中开启了AMS,还孵化新进程ServiceManager,加载注册了一溜的服务,最后一句话进入loop 死循环
run方法的SystemReady调用resumeTopActivityLocked打开锁屏界面
5.在manifest 和代码中如何注册和使用BroadcastReceiver;
在清单文件中注册广播接收者称为静态注册,在代码中注册称为动态注册。静态注册的广播接收者只要 app 在系
统中运行则一直可以接收到广播消息,动态注册的广播接收者当注册的 Activity 或者 Service 销毁了那么就接收不到
广播了。
静态注册:在清单文件中进行如下配置
<receiver android:name=".BroadcastReceiver1" >
<intent-filter>
<action android:name="android.intent.action.CALL" ></action>
</intent-filter>
</receiver>
动态注册:在代码中进行如下注册
receiver = new BroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(CALL_ACTION);
context.registerReceiver(receiver, intentFilter);
6.事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?
onTouchEvent是手机屏幕事件的处理方法,是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等。属于一个宏观的屏幕触摸监控。onTouchEvent方法是override 的Activity的方法。重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
onTouch()是OnTouchListener接口的方法,它是获取某一个控件的触摸事件,因此使用时,必须使用setOnTouchListener绑定到控件,然后才能鉴定该控件的触摸事件。当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。通过getAction()方法可以获取当前触摸事件的状态:
二者区别如下:
1、如果setOnTouchListener中的onTouch方法返回值是true(事件被消费)时,则onTouchEvent方法将不会被执行;
2、只有当setOnTouchListener中的onTouch方法返回值是false(事件未被消费,向下传递)时,onTouchEvent方法才被执行。
3、以上说的情况适用于View对象(事件会最先被最内层的View对象先响应)而不是ViewGroup对象(事件会最先被最外层的View对象先响应)。
综合来讲:
onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。
7.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系;
Android的线程间通信就靠Handler、Looper、Message、MessageQueue这四个麻瓜兄弟
当我们调用handler.sendMessage(msg)方法发送一个Message时,实际上这个Message是发送到与当前线程绑定的一个MessageQueue中,然后与当前线程绑定的Looper将会不断的从MessageQueue中取出新的Message,调用msg.target.dispathMessage(msg)方法将消息分发到与Message绑定的handler.handleMessage()方法中。
一个Thread对应多个Handler 一个Thread对应一个Looper和MessageQueue,Handler与Thread共享Looper和MessageQueue。 Message只是消息的载体,将会被发送到与线程绑定的唯一的MessageQueue中,并且被与线程绑定的唯一的Looper分发,被与其自身绑定的Handler消费。
8.Zygote和System进程的启动过程
进程是如何创建的
在Android 系统中,所有的应用程序进程,以及用来运行系统的关键服务的System进程都是有Zygote进程负责创建的,因此,我们将它称为进程孵化器,Zygote进程都是通过复制自身的方式来穿件System进程以及应用程序进程的。由于Zygote进程在启动时会在内部创建一个虚拟机实例,因此,通过复制Zygote进程而得到的System进程和应用进程可以快速在内部获得一个虚拟机实例拷贝。
Zygote进程又是如何启动的
Zygote进程是由Android系统的第一个进程init启动起来的,init进程是在内核加载完成之后就启动起来的,它在启动的过程中,会读取跟目录下的一个脚本文件init.rc ,以便可以将其他需要开机启动的进程也一起启动起来。
系统级别的服务创建
是在SystemServer 中的ServerThread 创建出来的
应用程序进程的创建
在Zygote中有使用到了socket
9.Handler机制及底层实现
new Handler的时候Handler就已经拿到了线程的Looper 。MessagQueue
handler发送消息:
把Handler保存到Message里。
把Message保存到messageQueue里。
ActivityThread.java主线程入口类
在main()方法中存入了Looper.prepareMainLooper();(这里已经创建了Looper,messagequeue)
然后不断地执行获取消息的方法:Looper.loop();去出message,然后调用handler的dispatchMessage(msg);
10.热修复技术
网友评论