美文网首页
春招笔记(五)--安卓第二部分

春招笔记(五)--安卓第二部分

作者: 松爱家的小秦 | 来源:发表于2019-03-09 12:08 被阅读0次

    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.热修复技术

    相关文章

      网友评论

          本文标题:春招笔记(五)--安卓第二部分

          本文链接:https://www.haomeiwen.com/subject/dbcspqtx.html