美文网首页
安卓面试知识点笔记

安卓面试知识点笔记

作者: 她的猫0932 | 来源:发表于2018-12-09 23:57 被阅读0次

    Activity生命周期

    1.activity的4种状态

    running/paused/stopped/killed


    activity生命周期图.png

    2.安卓进程优先级

    前台、可见、服务、后台、空

    Fragment

    1. Fragment为什么被称为第五组件

    • 有自己的生命周期,加载到activity里。
    • 更节省内存,ui切换更自然。

    2. Fragmnet 加载到Activity的方式

    1. 静态加载:添加Fragment到Activity的布局文件中
    2. 动态加载:动态再activity中添加fragment
                    FragmentTransaction transaction = manager.beginTransaction();  
                    Fragment1 fragment1 = new Fragment1();  
                    transaction.add(R.id.fragment_container, fragment1);  
                    transaction.commit();  
    

    3. FragmentPagerAdapter与FramentStatePagerAdapter的区别

    • FragmentPagerAdapter前者适合页面较少,只是把ui分离,没有回收资源
    • FramentStatePagerAdapter后者适合页面较多的情况。destroyItem()回收资源,回收内存。

    4. Fragment生命周期

    fragment生命周期图.png

    5. Fragment的通信

    1)在Fragment中调用Activity中的getActivity()
    2)在Activity中调用Fragment中的方法,接口回调
    3)在Fragment中调用Fragment中的方法findFragmentById

    6. Fragment的replace、add、remove

    • replace替换实例
    • add添加实例
    • remove移除实例

    Service

    1.Service是什么

    Service是一个一种可以在后台执行长时间运行,无界面的应用组件。
    运行在主线程,不能进行耗时操作

    2.Service和Thread的区别

    定义

    Thread是程序执行的最小单位,Service是安卓的一种运行机制。

    实际开发

    Thread作耗时操作,Service运行主线程

    应用场景

    Service音乐,导航

    3.Service启动方式

    1. startService

    1)定义一个类继承Service
    2)在Mainfest.xml文件中配置该Service
    3)使用Context的startService(Intent)方法启动该Service
    4)不再使用时,调用stopService(Intent)方法停止该服务

    2. bindService

    1)创建BindService服务端,继承自Service并在类中,创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用
    2)从onBind()回调方法返回此Binder实例
    3)在客户端中,从onServiceConnected()回调方法中接受Binder,并使用提供的方法调用绑定服务。

    Broadcast receiver

    1.广播的定义

    在安卓中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。

    2.广播的使用场景

    • 同一个app具有多个进程的不同组件之间的消息通信
    • 不同app之间的组件之间消息通信

    3.广播的种类

    1)Normal Broadcast:Context.sendBroadcast
    2)System Broadcast:Context.sendOrderedBroadcast
    3)Local Broadcast:只在自身app内传播

    4.实现广播-receiver

    1)静态注册:注册完成就一直运行
    2)动态注册:跟随activity的生命周期(要回收,不然会内存泄漏)
    区别:前者mainfest添加,app杀死后依然运行,后者代码添加,跟随activity的生命周期。

    5.内部实现机制

    1)自定义广播接受BroadcastReceiver,并复写onRecvice()
    2)通过Binder机制向AMS进行注册
    3)广播发送者通过Binder机制向AMS发送广播
    4)AMS查找符合相应条件(intentFilter/Permission)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是activity)相应的消息循环队列中
    5)消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法

    5.LocalBroadcastManager详解

    1)使用它发送的广播只在自身app中传播,因此不必担心泄漏隐私数据
    2)其他App无法对你的App发送该广播,因为你的App根本不可能接受到非自身的广播,因此不用担心有安全漏洞
    3)比系统的全局广播更加高效
    注册

    protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub
           super.onCreate(savedInstanceState);
            if(savedInstanceState!=null) { 
                if(mLocalBroadcastManager!=null && mBoradCast!=null) { 
                  mLocalBroadcastManager.unregisterReceiver(mBoradCast);
                  mLocalBroadcastManager=null; 
                  mBoradCast=null;
                  }
             }
         
         mLocalBroadcastManager=LocalBroadcastManager.getInstance(this); 
         mBoradCast = new MyBroadCast(); IntentFilter intentFilter = new IntentFilter(); 
         //重点在这里,本地注册,本地接收。
         mLocalBroadcastManager.registerReceiver(mBoradCast, intentFilter);
    }
    
    
    @Override 
    protected void onDestroy() { 
            super.onDestroy();
            if(mLocalBroadcastManager!=null && mBoradCast!=null) { 
               mLocalBroadcastManager.unregisterReceiver(mBoradCast); 
               mLocalBroadcastManager=null; 
              mBoradCast=null; 
            } 
    }
    

    *发送

    LocalBroadcastManager lcm=LocalBroadcastManager.getInstance(mContext); 
    lcm.sendBroadcast(new Intent(ACTION_LOCATION));//发送
    

    Binder详解

    1. 相关Linux的基础知识

    1.1 进程隔离/虚拟地址空间

    1.2 系统调用

    1.3 binder驱动

    2. Binder通信机制

    2.1 为什么要使用binder

    • android使用的Linux内核拥有非常多的跨进程通信机制
    • 性能
    • 安全(双方身份校验)

    2.2 binder通信机制

    • 通信录:ServiceManager
    • 通信基站:binder驱动


      binder通信机制.png
    binder交互.png

    2.3 到底什么是binder

    • 通常意义下,Binder指的是一种通信机制
    • 对于Server进程来说,Binder指的是Binder本地对象
    • 对于Client进程来说,Binder指的是Binder代理对象
    • 对于传输过程而已,Binder是可以进行跨进程传递的对象

    Handler详解

    什么是handler

    • 安卓消息机制的上层接口,可以用来更新ui
    • handler通过发送和处理Message和Runnable对象来关联对应线程的MessageQueue。
    1. 可以让对应的Message和Runnable在未来的某个时间点进行相应处理
    2. 让自己想要处理的耗时操作放在子线程,让更新ui的操作放在主线程

    handler的使用方法

    1. post(runnable)
    2. sendMessage(message)

    handler机制的原理

    handler.png

    handler发送消息,处理Looper对象。

    handler引起的内存泄漏以及解决办法

    原因:非静态内部类持有外部类的匿名引用,导致外部activity无法释放
    解决办法:handler内部持有外部activity的弱引用,并把handler改为静态内部类,mHandler.removeCallback()

    AsynkTask详解

    什么是AsynkTask

    本质上是一个封装了线程池和handler的异步框架,只能做一些耗时比较短的操作。

    AsynkTask的使用方法

    3个参数

    5个方法
    onPreExecute():做一些准备工作
    doInBackground():做耗时操作
    onProgressUpdate():显示进度条的变化
    onPostExecute():返回结果

    AsynkTask的机制原理

    1. AsynkTask的本质是一个静态的线程池,AsynkTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
    2. 线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
    3. 当任务状态发生改变之后,工作线程会向ui线程发送消息,AsynkTask内部的internalHandler响应这些消息,并调用相关的回调函数。

    AsynkTask的注意事项

    • 内存泄漏:非静态内部类持有外部类的匿名引用,导致外部activity无法释放。
    • 生命周期:onDestory()方法中调用AsynkTask.cancel()
    • 结果丢失:屏幕旋转,activity重新创建等,AsynkTask会持有之前的activity的引用。
    • 并行or串行

    HandlerThread的理解

    HandlerThread的产生背景

    • 开启Thread子线程进行耗时操作
    • 多次创建和销毁线程是很耗系统资源的

    HandlerThread的是什么

    handler+thread+looper
    是一个thread内部有looper

    HandlerThread的特点

    • 本质上是一个线程类,他继承了Thread
    • HandlerThread有自己的内部Looper对象,可以进行looper循环
    • 通过获取HandlerThread的looper对象传递给Handler对象,可以在handlerMessage方法中执行异步任务
    • 优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低
    • 与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。

    IntentService的理解

    IntentService是什么

    • 继承了Service,优先级比Service高。
    • 它内部通过HandlerThread和Handler实现异步操作
    • IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandlerIntent回调方法中执行,并且,每次只执行一个工作线程,执行完一个再执行第二个。

    如何使用IntentService

    相关文章

      网友评论

          本文标题:安卓面试知识点笔记

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