Android 知识点总结

Android 知识点总结:

1 service 
   不是一个单独的进程,它和应用程序在同一个进程中,Service 也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR 
 

  生命周期:start模式  oncreate onstartCommond  ondestory 【startService不会重复执行onCreate回调,但每次都会执行onStartCommand回调。】
            bind模式   oncreate onbind  onunbind ondestory 【client可以通过IBinder接口获取Service实例,当没有任何client与Service绑定时,Service会自行销毁 ,多次】
            
  IntentService 自带一个工作线程 当多次启动IntentService,产生多个job,IntentService只能一个一个处理,也就是按照先后顺序进行处理。先将intent1传入onHandleIntent,让其完成job1,然后将intent2传入onHandleIntent,让其完成job2
  
  IntentService 内部实现了Handler & HandlerThread 开辟了工作线程 IntentService内部采用了HandleThread和Handler的实现,IntentService又比线程优先级高,相对而言不容易被系统杀死来保证服务运行。


2:handler Thread handlerThread
    
   handler 用于发送和处理message消息 实现其他子线程和主线程的交互
   Thread  Java中进程中执行的最小单位 
   HandlerThread 继承Thread的类 android没有对Thread进行任何封装 封装了继承于Thread的HandlerThread类    
   【HandlerThread对象start后可以获得其Looper对象,并且使用这个Looper对象实例Handler,之后Handler就可以运行在其他线程中了。】
   
   handler机制
   Andriod提供了 Handler  和  Looper  来满足线程间的通信。 Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换 (MessageExchange) 。 

1)Looper:  一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue( 消息队列 ) 和对消息进行循环。 

2)Handler:  你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 从 Message Queue 取出 所送来的消息。 

3) Message Queue( 消息队列 ): 用来存放线程放入的消息。 

4) Message:是线程间通讯的消息载体。两个码头之间运输货物,Message充当集装箱的功能,里面可以存放任何你想传递的消息。

3:重写和重载的区别
   
   重写:是继承关系 子类重写父类的方法
   重载:方法名相同 参数不同 参数个数不同 无关返回值
   
   
4:常用的网络请求框架
    1):OkHttp【只有当Call以异步请求的方式,才触发Dispatcher的调度工作】
         1: 初始化OKhttpClient 工厂生产者,负责生产calls    
         2:创建Request 请求体 heart 
         3: 执行Call方法 调度【execute同步 enqueue异步】
    2:Retrofit     
       注解的形式 基于okhttp的高度封装  封装了一些工厂类 例如:json解析 cook管理类等等

5:android 如何实现多进程       
如果客户端和服务端不再同一个应用,默认就是两个进程;如果在一个应用内开启多进程,在AndroidManifest.xml文件中的四大组件<activity> 、<service> 、<receiver> 和 <provider> 均支持 android:process属性来开启多进程。通过设置此属性,可以使每个组件均在各自的进程中运行,或者使一些组件共享一个进程,而其他组件则不共享。Android默认进程名是即是包名。
android:process的设置有两种:
1、android:process="xxx.xxx.xxxx.remote" 完整的命名方式,属于全局进程,其它应用通过ShareUID方式可以和它跑在同一个进程中。
2、android:process=":remote",“:”的含义是要在当前进程名前面加上包名,进程名以“:”开头是属于私有进程,其他应用不可访问。

多进程带来的问题
(1).静态成员和单例模式完全失效
(2).线程同步机制完全失效
(3).SharedPreference的可靠性下降
(4).Application会多次创建

进程间通信

1:intent
2: aidl
3:contenProvide
4:广播

6:RelativeLayout 和LinearLayout 性能对比
   从源码中我们似乎能看出,我们先前的测试结果中RelativeLayout不如LinearLayout快的根本原因是RelativeLayout需要对其子View进行两次measure过程。
   而LinearLayout则只需一次measure过程,所以显然会快于RelativeLayout,但是如果LinearLayout中有weight属性,则也需要进行两次measure,但即便如此,
   应该仍然会比RelativeLayout的情况好一点。
   
   减少view层级:viewSub  merge  include
   

7:eventBus  观察者模式实现 
   优点:它简化了Activity、Fragment、Service等组件之间的bai交互,很大程度上降低了它们之间的耦合
   缺点:要实现上述订阅/发布模型的功能,付出的代价就是对各个注册Bus的类进行反射。如果大量的使用的情况下,对应用的性能多少有点副影响。而且多了不利于代码维护
   
8:Android 数据库
   1:原生集成SaliteOpenHleper  实现onCreate  onUpdate 方法  通过SQLiteDatabase  进行数据库的增删改查
   2:litePal assets 添加litepal.xml 配置版本 数据库名 以及数据List<实体全包名    > 需要继承LitePalSupport 
   3:GreenDao @Entity 注解自动生成一些操作类Dao session
   4:数据库迁移:转为临时表,建立新表,把旧数据复制到新表,删除临时表

   
9:弱网优化
    
  1:一个高效的网络请求框架
  2:本地缓存部门数据
  3:根据网络请求不同分辨率的资源  
  
10 Activity
    oncrate onrestart onstart onresume  onpause  onstop ondestory  
    
    点击home:onpause onstop
    点击back:onpause onstop ondestory
    
    启动模式:
    staned
    singtop
    siginTask
    signIntance

11:Fragment 生命周期    
     
     onattch[建立关联]
     oncreate
     oncreateview【fragment加载布局】
     onactivityCreate【activity Oncreate执行完】
     
     onstart onresume onpause onstop
     
     ondestoryview【fragment被移除】 
     ondestory
     ondeach【解除关联】

12:sleep wait
    sleep: 没有释放锁  需要捕获异常
    wait :释放了锁  不需要捕获异常


13:onSaveinstance 1:按home键 2:启动新的activity 3:电话打来
    onreStoreinstatece 恢复数据
    
    
14:fouse Close
   nullpoint     indexout

15:Contentptovide
   1:继承SqliteOpenHelper 创建数据库
   2:继承ContentProvider 提供对外的authour 实现增删改查方法
   3:androidMefist.xml 注册
   4:另外一个App通过吧conentResult 通过URI 匹配 去执行操作
   
16:ANR application not response
    
    1:主线程 做了耗时  超过5s没有响应事件
    2:brocastRevice  10秒
    3:service 20秒
    
    分析log日志:too much work on main thread

17:AIDl android inteface definne launfuage
  
    

17:android 实现多线程的一些方式
    
   1:继承Thread 各个线程独立
   2:实现Runnable 接口 只是个辅助类 真正线程还是Thread ,多线程协作完成一件事情
   3:Handler 子线程和主线程沟通媒介
   4:AsyncTask 内部实现了线程池 +handler
   5:HandlerThread +handler 
   6:intentService
   7: 线程池

18: Android广播 BroadcastReceiver 
    
    1:normal sendBrocast
    2:有序     sendOrderBrocast
    注册:1动态注册   2:静态注册
    维度:Locale 本地广播  和全局广播
    
19:    Android View事件分发机制【三者优先级是onTouch->onTouchEvent->onClick】
   
   dispatchTouchEvent    事件分发 viewGroup 子view
   onInterceptTouchEvent 事件拦截  viewGroup
   onTouchEvent          事件消费viewGroup 子view
   
   传递顺序:传递过程都是从父View到子View ,不消费在原路往上传递 最后都不执行 执行activty的onTouchevent 方法
   解决滑动冲突:父view onInterceptTouchEvent 拦截方法做处理;或者子view dispatchTouchEvent 是否分发做处理
   
20:UDP TCP
   
  TCP:面向连接 三次握手 可靠性高 性能低【一对一】        serverSocket  socket
  UDP: 面向非链接 可靠性低 性能高 【一对多 多对多】       DataGramSocket 
  
  
21:android Parcelable与Serializable
    Parcelable 性能高 不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性  
    Serializable 性能低 会产生大量的临时变量 

22:android 动画
    
    帧动画    frame  多张图片
    补间动画  tween  xml 选中 平移 缩放 透明度
    属性动画  property  动画执行完viewframe 也改变
    
23:Android 性能优化
   
 1:启动优化  application 少做事情
 2:布局优化  减少布局层级
 3:图片优化  .9 webp图片 ,能使用shape 使用shape,三级缓存
 4:请求优化  统一的请求管理类
 5:数据优化  分页加载 缓存
 6:内存优化  避免内存泄漏和内存溢出(LeakCanary)
    
    
    JAVA 知识点总结
    
24:java的四种引用

强引用、软引用,弱引用、虚引用

引用类型    说明            使用场景
强引用(StrongReference)    不会自动回收,最难被GC回收的,宁可抛出异常也不回收强引用指向的对象    任何场景
软引用(SoftReference)        内存不足时,GC会回收软引用指向的对象    比较少使用,已被LruCache替代
弱引用(WeakReference)        不管内存足不足,只要GC了都能回收弱引用指向的对象    常用于避免内存泄漏
虚引用(PhantomReference)    随时都能回收,也称幽灵引用,相当于没有指向任何实例引用    跟踪对象是否被回收,很少使用

25:堆与栈的区别:

    1.栈内存存储的是局部变量而堆内存存储的是实体;

    2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

    3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

26:成员内部类、静态内部类、匿名内部类、局部内部类
    1:成员内部类的特征:
    作为外部类的一个成员存在,与外部类的属性、方法并列
    成员内部类持有外部类的引用
    成员内部类中不能定义static变量和方法
    
    2:静态内部类
    静态内部类不会持有外部类的引用
    静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
    
    3:匿名内部类
    使用new创建 ,没有具体位置
    
    4:局部内部类
    用在方法内部,作用范围仅限于该方法中
    根据情况决定持有外部类对象引用
    不能使用private,protected,public修饰符
    不能包含静态成员

27:==与equals的区别
   equals是判断两个变量或者实例指向同一个内存空间的值是不是相同
   而==是判断两个变量或者实例是不是指向同一个内存空间

28:Java反射机制Class.forName()
1,必须要有@hide修饰,否则无法反射
2,getField,getMethod只能反射public类型的数据,getDeclaredField,getDeclaredMethods可以反射任何类型的数据。
3,getField,getMethod可以反射父类的数据,而getDeclaredField,getDeclaredMethods只能获取当前类的数据。
4,对于private static final 这种方法或者变量反射时无法调用,需要在下面执行
method.setAccessible(true);

29:Java注解相关
 
   一般配合反射使用 例如:eventbus greenDao...
  

30:Java泛型

对于Java开发者来说,集合是泛型运用最多的地方

31:Java枚举
  一般定义类型使用

32:Java操作文件的基本API,RdomAccessFile

33:访问网络的基本API. Socket

34:Java异常有几种?什么是运行时异常,有什么特点?

   运行时异常:在程序运行的时候可能会发生的, 所以程序可以捕捉, 也可以不捕捉
   非运行时异常:异常从程序的角度来说是必须经过捕捉检查处理的, 否则不能通过编译. 如IOException、SQLException等

35:接口与抽象类的区别
    相同:
    1:关键字不同 ,都不能实例化
    2:子类需要实现其抽象方法
    不同:
    1:实现关键字不同 implement extends
    2:接口必须都要实现,抽象类可以选择性实现
    

36:什么导致线程阻塞

1.线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态...
2.线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象...
3.线程礼让,Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给...
4.线程自闭,join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()...
5.suspend() 和 resume() 方法:两个方法配套使用,suspend()...

37:ArrayMap对比HashMap
   1:查找效率 ArrayMap 是用二分法查找 ,hashMap是用hashcode查找,数据增加时map的效率更高
   2:扩容数量 当数据量比较大的时候,还是使用HashMap更合适,因为其扩容的次数要比ArrayMap少很多
   3:扩容效率 hashmap重新计算 ArrayMap是直接copy的 效率上arraymap更高
   4:内存消耗 以ArrayMap采用了一种独特的方式,能够重复的利用因为数据扩容而遗留下来的数组空间,方便下一个ArrayMap的使用。而HashMap没有这种设计

38:HashMap的实现原理 【链表和红黑树】
    基于哈希表的 Map 接口的实现。允许null键值对
    让其同步 方法:Map m = Collections.synchronizedMap(new HashMap(...));
    
38:equals()和hashCode()的区别和联系
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals

39:HashMap和Hashtable的区别
   HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

40:什么是HashSet
  HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,
  这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。
    
   
   
    

    

    
    
    
       
       
       
       
       
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值