Service
Service默认在主线程中,哪怕是在主线程中开子线程启动Service也还是在主线程中
ANR
什么是ANR?Application Not Responding,应用程序无响应。
是什么引起的?通常在主线程执行以下操作: 1. 高耗时的操作,如图像变换 2. 磁盘读写,数据库读写操作 3. 大量的创建新对象
哪几种类型?
- KeyDispatchTimeout(5 seconds) --主要是类型按键或触摸事件在特定时间内无响应
- BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成
- ServiceTimeout(20 secends) --小概率事件 Service在特定的时间内无法处理完成
如何避免?
- UI线程尽量通过Handler来跟子Thread交互
- 在子线程中去处理耗时操作
Activity和Fragment的关系
Fragment必须依赖于Activity存在,Fragment的生命周期随着Activity的生命周期变化而变化
Application Context和Activity Context的区别
第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随application的一生,与activity的生命周期无关.
第二种中的context跟Activity的生命周期是相关的,但是对一个Application来说,Activity可以销毁几次,那么属于Activity的context就会销毁多次
在使用Context的时候要注意内存泄漏的问题
AlarmManager
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
第一个参数用来指定AlarmManager的工作类型(从何时开始,要不要唤醒CPU)。比如ELAPSED_REALTIME_WAKEUP 同样表示让定时任务的触发时间从系统开机开始算起,会唤醒 CPU。
第二个参数是指定触发时间,如果第一个参数是ELAPSED_REALTIME_WAKEUP,这里就用开机时间加上延迟执行的时间即可。
第三个可以传入一个PendingIntent去启动一个广播或者服务之类的。
WakeLock
WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态。
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);获取PowerManager实例
然后通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)
在manifest里面获取权限
动画
View Animation : tweened补间动画,通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果,有Alpha、Scale、Translate和Rotate四种效果。
Drawable Animation :frame帧动画,指定每一帧的内容和停留时间,然后播放动画。像是动画片
Property Animation :属性动画,就是在一定的时间内,按照一定的规律来改变对象的属性。弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了
Handler机制
Android的异步消息处理主要由四部分组成:Message、Handler、MessageQueue、Looper
Message:线程间传递的消息,他可以携带少量信息,比如int、Object
Handler:消息的处理者,主要用来发送消息和处理消息
MessageQueue:消息队列,主要用来存放所有通过Handler发送的消息,这部分的消息会一直存在消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象
Looper:是每个线程中MessageQueue的管家,调用Looper的loop方法后,就会进入到一个无限循环中,然后每当发现消息队列中存在一条消息就会将其取出,并传递到Handler的handleMessage()中进行处理。每个线程中也只会有一个Looper对象,这个源码中是在looper.prepare()中会去检查当前线程有没有looper,有则抛出异常,没有就new一个。
RxJava
优点:使逻辑简洁。异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
View和ViewGroup的关系
View是所有UI组件的基类,ViewGroup是容纳这些组件的容器,他本身也是View派生而来的。可以包含View,也可以包含ViewGroup