不定期更新
Scroller,ScrollTo,ScrollBy区别
Scroller是实现的一种滚动效果,ScrollTo(int x,int y)滚动到某个点,只会相对于View初始位置运动一次,因为View的初始位置是固定的。ScrollBy(int x,int y)会相对于当前位置运动。这个行为是连续的。不过这里的点的坐标取值要注意下,我们认识的Android坐标系是X轴向右是正,Y轴向下是正。如果想让View正方向运动,这时的坐标点要取负值。。。
常见Android动画使用的类
- AnimatorInflater(属性动画 res/animator)
- AnimatorUtil (视图动画 res/anim)
- ViewAnimator (View过渡切换)
详细教程参考https://www.jianshu.com/p/2412d00a0ce4
退出登录清空所有旧的Activity
1 | Intent intent = new Intent(this, LoginActivity.class); |
解决线程同步问题
多线程要处理三个问题
- 原子性
- 可见性
- 有序性
volatile主要解决可见性和有序性
synchronized原子性
强引用,软引用,弱引用
- 强引用(即使内存不足oom,系统也不愿意释放)
- 软引用 (内存不足时,会释放)
- 弱引用 (不管内存状态,某个时刻某个内存区域遍历到就会释放)
点击APP Icon系统做了什么
launcher会向AMS发送startActivity,然后遍历有没有缓存的进程,如果没有会通知zygote fork一个APP进程,设置好后走ActivityThread 然后初始化Looper,Handler,等待AMS发送事件过来,最后调用组件生命周期方法直到界面显示。
zygote是由init进程创建,init是Linux应用起点。
View的坐标
1 | //获取view在父view的布局规则 |
事件分发机制
当点击View时,事件会从根父视图首先调用dispatchEvent,如果父view拦截事件,那么父视图会消费该事件,如果父视图设置了onTouchListener或onClickListener,会回调到这里。如果没设置,会回调到onTouchEvent。如果不拦截事件,事件会继续往下传,如果传到子视图,onTouchEvent返回true,子视图消费这个事件,否则事件会再传到父视图
Android Studio使用aar方式:
- 拷贝到:libs目录
- build.gradle 配置文件中更改为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15repositories {
flatDir {
dirs'libs'
}
}
dependencies {
compile(name:'genius', ext:'aar')
}
Java中使用kotlin
1.project build.gradle中
1 | buildscript { |
2.app build.gradle中
1 | apply plugin: 'kotlin-android' |
适配Android7.0及以上照片存储
(1)声明provider
1 | <provider |
(2)编写resource xml file
1 | <?xml version="1.0" encoding="utf-8"?> |
(3)使用FileProvider API
1 | File file = new File(Environment.getExternalStorageDirectory(), filename); |