安卓面试知识点笔记

Activity生命周期

1.activity的4种状态

running/paused/stopped/killed


安卓面试知识点笔记_第1张图片
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生命周期

安卓面试知识点笔记_第2张图片
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驱动


    安卓面试知识点笔记_第3张图片
    binder通信机制.png
安卓面试知识点笔记_第4张图片
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机制的原理

安卓面试知识点笔记_第5张图片
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

你可能感兴趣的:(安卓面试知识点笔记)