diff --git "a/AdavancedPart/1.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\270\200).md" "b/AdavancedPart/1.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\270\200).md" index bf052c89..d04ed14f 100644 --- "a/AdavancedPart/1.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\270\200).md" +++ "b/AdavancedPart/1.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\270\200).md" @@ -8,7 +8,7 @@ 方案有很多种,我就只说明下我想到的方式,也就是`Instant Run`的方式: -分拆到不同的`dex`中,然后通过`classloader`来进行加载。但是在之前[`InstantRun`详解](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md)中只说到会通过内部的`server`去判断该类是否有更新,如果有的话就去从新的`dex`中加载该类,否则就从旧的`dex`中加载,但这是如何实现的呢? 怎么去从不同的`dex`中选择最新的那个来进行加载。 +分拆到不同的`dex`中,然后通过`classloader`来进行加载。但是在之前[`InstantRun`详解](./SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md)中只说到会通过内部的`server`去判断该类是否有更新,如果有的话就去从新的`dex`中加载该类,否则就从旧的`dex`中加载,但这是如何实现的呢? 怎么去从不同的`dex`中选择最新的那个来进行加载。 讲到这里需要先介绍一下`ClassLoader`: @@ -722,7 +722,7 @@ protected void onResume() { - [当你准备开发一个热修复框架的时候,你需要了解的一切](http://www.zjutkz.net/2016/05/23/%E5%BD%93%E4%BD%A0%E5%87%86%E5%A4%87%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E7%83%AD%E4%BF%AE%E5%A4%8D%E6%A1%86%E6%9E%B6%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E4%BA%86%E8%A7%A3%E7%9A%84%E4%B8%80%E5%88%87/) -[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" +[1]: ./SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" --- diff --git "a/AdavancedPart/2.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\272\214).md" "b/AdavancedPart/2.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\272\214).md" index 7d02b934..27acdbe7 100644 --- "a/AdavancedPart/2.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\272\214).md" +++ "b/AdavancedPart/2.\347\203\255\344\277\256\345\244\215\345\256\236\347\216\260(\344\272\214).md" @@ -88,7 +88,7 @@ But,最近遇到困难了,所在项目要做插件化,同事在开发过 - [当你准备开发一个热修复框架的时候,你需要了解的一切](http://www.zjutkz.net/2016/05/23/%E5%BD%93%E4%BD%A0%E5%87%86%E5%A4%87%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E7%83%AD%E4%BF%AE%E5%A4%8D%E6%A1%86%E6%9E%B6%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%BD%A0%E9%9C%80%E8%A6%81%E4%BA%86%E8%A7%A3%E7%9A%84%E4%B8%80%E5%88%87/) -[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" +[1]: ./SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" --- diff --git "a/AdavancedPart/3.\347\203\255\344\277\256\345\244\215_addAssetPath\344\270\215\345\220\214\347\211\210\346\234\254\345\214\272\345\210\253\345\216\237\345\233\240(\344\270\211).md" "b/AdavancedPart/3.\347\203\255\344\277\256\345\244\215_addAssetPath\344\270\215\345\220\214\347\211\210\346\234\254\345\214\272\345\210\253\345\216\237\345\233\240(\344\270\211).md" index 4da9dd5c..220a0ea3 100644 --- "a/AdavancedPart/3.\347\203\255\344\277\256\345\244\215_addAssetPath\344\270\215\345\220\214\347\211\210\346\234\254\345\214\272\345\210\253\345\216\237\345\233\240(\344\270\211).md" +++ "b/AdavancedPart/3.\347\203\255\344\277\256\345\244\215_addAssetPath\344\270\215\345\220\214\347\211\210\346\234\254\345\214\272\345\210\253\345\216\237\345\233\240(\344\270\211).md" @@ -384,7 +384,7 @@ const ResTable* AssetManager::getResTable(bool required) const 也就是说在Android5.0及以上的系统中native层的addAssetPath方法会再调用appendPathToResTable去解析,所以在5.0及以上系统通过反射调用addAssetPath方法就不会有问题。 -解决方案就是根据Google [Instant Run](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md)实现的原理:创建一个新的AssetManager,然后加入完整的新资源包,替换掉原有的AssetManager。 +解决方案就是根据Google [Instant Run](./SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md)实现的原理:创建一个新的AssetManager,然后加入完整的新资源包,替换掉原有的AssetManager。 具体可参考:[深度理解Android InstantRun原理以及源码分析](https://blog.csdn.net/nupt123456789/article/details/51828701)中的`2.2 monkeyPatchExistingResources`部分 diff --git a/AdavancedPart/Android WorkManager.md b/AdavancedPart/Android WorkManager.md index 17f51c57..cb56e6db 100644 --- a/AdavancedPart/Android WorkManager.md +++ b/AdavancedPart/Android WorkManager.md @@ -156,7 +156,7 @@ public final class PeriodicWorkRequest extends WorkRequest { 到了这里突然有了一个大胆的想法。看到没有它能保证任务的执行。 -我们之前写过一篇文章[Android卸载反馈](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%8D%B8%E8%BD%BD%E5%8F%8D%E9%A6%88.md) +我们之前写过一篇文章[Android卸载反馈](./AdavancedPart/Android%E5%8D%B8%E8%BD%BD%E5%8F%8D%E9%A6%88.md) 里面用到了`c`中的`fork`来保证存活,达到常驻内存的功能,如果`PeriodicWorkRequest`的最小间隔时间比较短不是15分钟的话,那这里是不是也可以用`WorkManager`来实现? 好了,不说了。 @@ -165,9 +165,4 @@ public final class PeriodicWorkRequest extends WorkRequest { - [官方文档](https://developer.android.com/topic/libraries/architecture/workmanager) - [Codelabs android-workmanager](https://codelabs.developers.google.com/codelabs/android-workmanager/#0) -- [示例代码](https://github.com/googlecodelabs/android-workmanager) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- [示例代码](https://github.com/googlecodelabs/android-workmanager) \ No newline at end of file diff --git "a/AdavancedPart/Android6.0\346\235\203\351\231\220\347\263\273\347\273\237.md" "b/AdavancedPart/Android6.0\346\235\203\351\231\220\347\263\273\347\273\237.md" index d7f32de9..842e84db 100644 --- "a/AdavancedPart/Android6.0\346\235\203\351\231\220\347\263\273\347\273\237.md" +++ "b/AdavancedPart/Android6.0\346\235\203\351\231\220\347\263\273\347\273\237.md" @@ -594,10 +594,4 @@ public class MainFragment extends Fragment implements View.OnClickListener { } } -``` - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/AdavancedPart/Android\345\215\270\350\275\275\345\217\215\351\246\210.md" "b/AdavancedPart/Android\345\215\270\350\275\275\345\217\215\351\246\210.md" index b6b73b52..241fd604 100644 --- "a/AdavancedPart/Android\345\215\270\350\275\275\345\217\215\351\246\210.md" +++ "b/AdavancedPart/Android\345\215\270\350\275\275\345\217\215\351\246\210.md" @@ -132,7 +132,7 @@ void Java_com_charon_uninstallfeedback_MainActivity_initUninstallFeedback( 有关如何在[Android Stuido中进行ndk开发请看][1]。 -[1]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%B8%AD%E8%BF%9B%E8%A1%8Cndk%E5%BC%80%E5%8F%91.md "Android Stuido中进行ndk开发" +[1]: ./AndroidStudioCourse/AndroidStudio%E4%B8%AD%E8%BF%9B%E8%A1%8Cndk%E5%BC%80%E5%8F%91.md "Android Stuido中进行ndk开发" --- diff --git "a/AdavancedPart/Android\345\220\257\345\212\250\346\250\241\345\274\217\350\257\246\350\247\243.md" "b/AdavancedPart/Android\345\220\257\345\212\250\346\250\241\345\274\217\350\257\246\350\247\243.md" index 25d0e1be..d7ba3c9f 100644 --- "a/AdavancedPart/Android\345\220\257\345\212\250\346\250\241\345\274\217\350\257\246\350\247\243.md" +++ "b/AdavancedPart/Android\345\220\257\345\212\250\346\250\241\345\274\217\350\257\246\350\247\243.md" @@ -36,10 +36,4 @@ Android启动模式详解 - `singleTask`受`android:taskAffinity`属性的影响,而`singleInstance`不受`android:taskAffinity`的影响。 - `singleTask`所在的`task`中能有其它的`Activity`,而`singleInstance`的`task`中不能有其他`Activity`。 - 当跳转到`singleTask`类型的`Activity`,并且该`Activity`实例已经存在时,会删除该`Activity`所在`task`中位于该`Activity`之上的全部`Activity`实例;而跳转到`singleInstance`类型的`Activity`,并且该`Activity`已经存在时, - 不需要删除其他`Activity`,因为它所在的`task`只有该`Activity`唯一一个`Activity`实例。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + 不需要删除其他`Activity`,因为它所在的`task`只有该`Activity`唯一一个`Activity`实例。 \ No newline at end of file diff --git "a/AdavancedPart/Android\345\274\200\345\217\221\344\270\215\347\224\263\350\257\267\346\235\203\351\231\220\346\235\245\344\275\277\347\224\250\345\257\271\345\272\224\345\212\237\350\203\275.md" "b/AdavancedPart/Android\345\274\200\345\217\221\344\270\215\347\224\263\350\257\267\346\235\203\351\231\220\346\235\245\344\275\277\347\224\250\345\257\271\345\272\224\345\212\237\350\203\275.md" index 102de73a..74c381b0 100644 --- "a/AdavancedPart/Android\345\274\200\345\217\221\344\270\215\347\224\263\350\257\267\346\235\203\351\231\220\346\235\245\344\275\277\347\224\250\345\257\271\345\272\224\345\212\237\350\203\275.md" +++ "b/AdavancedPart/Android\345\274\200\345\217\221\344\270\215\347\224\263\350\257\267\346\235\203\351\231\220\346\235\245\344\275\277\347\224\250\345\257\271\345\272\224\345\212\237\350\203\275.md" @@ -47,10 +47,4 @@ startActivityForResult(intent, 1); 2. 不幸的是,`Intent`系统的属性也建立了[可能会被滥用的漏洞](http://css.csail.mit.edu/6.858/2012/projects/ocderby-dennisw-kcasteel.pdf),但你也不会写一个滥用的应用,是吗? -- (译)[感谢Dan Lew](http://blog.danlew.net/2014/11/26/i-dont-need-your-permission/) - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- (译)[感谢Dan Lew](http://blog.danlew.net/2014/11/26/i-dont-need-your-permission/) \ No newline at end of file diff --git "a/AdavancedPart/Android\345\274\200\345\217\221\344\270\255\347\232\204MVP\346\250\241\345\274\217\350\257\246\350\247\243.md" "b/AdavancedPart/Android\345\274\200\345\217\221\344\270\255\347\232\204MVP\346\250\241\345\274\217\350\257\246\350\247\243.md" index 4653b0a9..bb7627a5 100644 --- "a/AdavancedPart/Android\345\274\200\345\217\221\344\270\255\347\232\204MVP\346\250\241\345\274\217\350\257\246\350\247\243.md" +++ "b/AdavancedPart/Android\345\274\200\345\217\221\344\270\255\347\232\204MVP\346\250\241\345\274\217\350\257\246\350\247\243.md" @@ -591,10 +591,4 @@ public void getTask(@NonNull final String taskId, @NonNull final GetTaskCallback -[1]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/MVC%E4%B8%8EMVP%E5%8F%8AMVVM.md "MVC、MVP、MVVM介绍" - ---- - - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +[1]: ./JavaKnowledge/MVC%E4%B8%8EMVP%E5%8F%8AMVVM.md "MVC、MVP、MVVM介绍" diff --git a/AdavancedPart/ApplicationId vs PackageName.md b/AdavancedPart/ApplicationId vs PackageName.md index 62829a21..2360d53e 100644 --- a/AdavancedPart/ApplicationId vs PackageName.md +++ b/AdavancedPart/ApplicationId vs PackageName.md @@ -81,9 +81,3 @@ buildTypes { 注意:为了兼容性,如果你在`build.gradle`文件中没有定义`applicationId` ,那`applicationId`就是与`AndroidManifest.xml`中配置的包名相同的默认值。在这种情况下,这两者显然脱不了干系,如果你试图重构代码中的包就将会导致同时会改变你应用程序的`id`!在`Android Studio`中新创建的项目都是同时指定他们俩。 注意2:`package name`必须在默认的`AndroidManifest.xml`文件中指定。如果有多个`manifest`文件(例如对每个`flavor`制定一个`manifest`或者每个`build type`制定一个`manifest`)时,`package name`是可选的,但是如果你指定的话,它必须与主`manifest`中指定的`pakcage`相同。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/AdavancedPart/\345\246\202\344\275\225\350\256\251Service\345\270\270\351\251\273\345\206\205\345\255\230.md" "b/AdavancedPart/\345\246\202\344\275\225\350\256\251Service\345\270\270\351\251\273\345\206\205\345\255\230.md" index 66548302..aadec4cd 100644 --- "a/AdavancedPart/\345\246\202\344\275\225\350\256\251Service\345\270\270\351\251\273\345\206\205\345\255\230.md" +++ "b/AdavancedPart/\345\246\202\344\275\225\350\256\251Service\345\270\270\351\251\273\345\206\205\345\255\230.md" @@ -15,11 +15,4 @@ - 在`NDK`环境中将1中编写的`C`代码编译打包成可执行文件(`BUILD_EXECUTABLE`)。 - 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。 -- 联系厂商,加入白名单 - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- 联系厂商,加入白名单 \ No newline at end of file diff --git "a/AdavancedPart/\345\261\217\345\271\225\351\200\202\351\205\215\344\271\213\347\231\276\345\210\206\346\257\224\346\226\271\346\241\210\350\257\246\350\247\243.md" "b/AdavancedPart/\345\261\217\345\271\225\351\200\202\351\205\215\344\271\213\347\231\276\345\210\206\346\257\224\346\226\271\346\241\210\350\257\246\350\247\243.md" index a64d0fe2..fa01893e 100644 --- "a/AdavancedPart/\345\261\217\345\271\225\351\200\202\351\205\215\344\271\213\347\231\276\345\210\206\346\257\224\346\226\271\346\241\210\350\257\246\350\247\243.md" +++ "b/AdavancedPart/\345\261\217\345\271\225\351\200\202\351\205\215\344\271\213\347\231\276\345\210\206\346\257\224\346\226\271\346\241\210\350\257\246\350\247\243.md" @@ -1,7 +1,7 @@ 屏幕适配之百分比方案详解 === -`Android`设备碎片化十分严重,在开发过程中的适配工作也非常很繁琐,有关屏幕适配的介绍请看之前的文章[屏幕适配](https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D.md)。 +`Android`设备碎片化十分严重,在开发过程中的适配工作也非常很繁琐,有关屏幕适配的介绍请看之前的文章[屏幕适配](./BasicKnowledge/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D.md)。 最近看到`DrawerLayout`,`support v4`中提供的类,想到对`google`提供的这些支持库,自己一点都不熟悉,想着看看`Google`提供的支持库都有什么内容。结果看着看着在最后忽然看到了`Percent Support Library`。寻思怎么还百分比呢?仔细一看介绍,我擦,真是太有用了。 > Percent Support Library @@ -551,10 +551,4 @@ public void restoreLayoutParams(ViewGroup.LayoutParams params) { - 为什么在`onLayout`方法中去恢复数据,这有什么作用? - 看代码在处理如果指定的百分比过小但又指定`wrap_content`时,会重新根据`wrap_content`去重新计算的逻辑没有错,但是为什么我在上面测试的时候确没效果? -- 在上面分析代码时看到`fillLayoutParams`中是根据父`View`的宽高来乘以百分比,不是根据整个屏幕的宽高,这样可能会有问题,要是ListView这种的高度没法算了。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- 在上面分析代码时看到`fillLayoutParams`中是根据父`View`的宽高来乘以百分比,不是根据整个屏幕的宽高,这样可能会有问题,要是ListView这种的高度没法算了。 \ No newline at end of file diff --git "a/AdavancedPart/\345\270\203\345\261\200\344\274\230\345\214\226.md" "b/AdavancedPart/\345\270\203\345\261\200\344\274\230\345\214\226.md" index 68dd2232..8bdac24d 100644 --- "a/AdavancedPart/\345\270\203\345\261\200\344\274\230\345\214\226.md" +++ "b/AdavancedPart/\345\270\203\345\261\200\344\274\230\345\214\226.md" @@ -188,11 +188,4 @@ Android的绘制主要是借助CPU和GPU结合刷新机制来共同完成。 AsyncLayoutInflater是通过侧面缓解的方式去缓解布局加载过程中的卡顿,但是它依然存在一些问题: - 1、不能设置LayoutInflater.Factory,需要通过自定义AsyncLayoutInflater的方式解决,由于它是一个final,所以需要将代码直接拷处进行修改。 - - 2、因为是异步加载,所以需要注意在布局加载过程中不能有依赖于主线程的操作。 - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + - 2、因为是异步加载,所以需要注意在布局加载过程中不能有依赖于主线程的操作。 \ No newline at end of file diff --git "a/AdavancedPart/\346\200\247\350\203\275\344\274\230\345\214\226.md" "b/AdavancedPart/\346\200\247\350\203\275\344\274\230\345\214\226.md" index dab58d91..badec97f 100644 --- "a/AdavancedPart/\346\200\247\350\203\275\344\274\230\345\214\226.md" +++ "b/AdavancedPart/\346\200\247\350\203\275\344\274\230\345\214\226.md" @@ -35,9 +35,4 @@ - `static`的变量如果不需要修改,应该使用`static final`修饰符定义为常量 - 使用增强`for`循环,比普通`for`循环效率高,但是也有缺点就是在遍历 集合过程中,不能对集合本身进行操作 - 合理利用浮点数,浮点数比整型慢两倍; -- 针对`ListView`的性能优化 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- 针对`ListView`的性能优化 \ No newline at end of file diff --git "a/AdavancedPart/\346\263\250\350\247\243\344\275\277\347\224\250.md" "b/AdavancedPart/\346\263\250\350\247\243\344\275\277\347\224\250.md" index 22ebec65..f1ccd610 100644 --- "a/AdavancedPart/\346\263\250\350\247\243\344\275\277\347\224\250.md" +++ "b/AdavancedPart/\346\263\250\350\247\243\344\275\277\347\224\250.md" @@ -1601,10 +1601,4 @@ dependencies { 示例`Demo`已上传到`Github`:[AnnotationDemo](https://github.com/CharonChui/AnnotationDemo) 文中例子来自`Hannes Dorfmann`大神的`ANNOTATION PROCESSING 101`,我对其重新梳理了下,来让能正常使用,并且上面的示例已经过我实际运行: -- [Hannes Dorfmann](http://hannesdorfmann.com/annotation-processing/annotationprocessing101) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - +- [Hannes Dorfmann](http://hannesdorfmann.com/annotation-processing/annotationprocessing101) \ No newline at end of file diff --git "a/AndroidStudioCourse/Android Studio\344\275\240\345\217\257\350\203\275\344\270\215\347\237\245\351\201\223\347\232\204\346\223\215\344\275\234.md" "b/AndroidStudioCourse/Android Studio\344\275\240\345\217\257\350\203\275\344\270\215\347\237\245\351\201\223\347\232\204\346\223\215\344\275\234.md" index bf89c72d..75f2770e 100644 --- "a/AndroidStudioCourse/Android Studio\344\275\240\345\217\257\350\203\275\344\270\215\347\237\245\351\201\223\347\232\204\346\223\215\344\275\234.md" +++ "b/AndroidStudioCourse/Android Studio\344\275\240\345\217\257\350\203\275\344\270\215\347\237\245\351\201\223\347\232\204\346\223\215\344\275\234.md" @@ -45,10 +45,4 @@ Android Studio你可能不知道的操作 - 结构性的搜索、替换、和检查 `Command+shift+A`然后输入`structural `后选择`search structurally`或者`replace structurally`,然后可以对应的结构性搜索的模板,完成之后所有符合该模板的代码都会提示`warning`。 ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/structural_search.gif?raw=true) -更有用的是可以使用快速修复来替换一些代码,例如一些废弃的代码或者你在`review`时发现的其他团队成员提交的一些普遍的错误。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +更有用的是可以使用快速修复来替换一些代码,例如一些废弃的代码或者你在`review`时发现的其他团队成员提交的一些普遍的错误。 \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\270\255\350\277\233\350\241\214ndk\345\274\200\345\217\221.md" "b/AndroidStudioCourse/AndroidStudio\344\270\255\350\277\233\350\241\214ndk\345\274\200\345\217\221.md" index b57d07e6..f8fcab8d 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\270\255\350\277\233\350\241\214ndk\345\274\200\345\217\221.md" +++ "b/AndroidStudioCourse/AndroidStudio\344\270\255\350\277\233\350\241\214ndk\345\274\200\345\217\221.md" @@ -82,9 +82,4 @@ AndroidStudio中进行ndk开发 - 执行Build 然后就可以在`app/build/intermediates/ndk/debug/obj/local`下看到所有架构的`so`了。 - ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/studio_ndk_build.png?raw=true) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/studio_ndk_build.png?raw=true) \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\200\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\200\345\274\271).md" index e997843c..ea83f386 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\200\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\200\345\274\271).md" @@ -107,9 +107,3 @@ AndroidStudio使用教程(第一弹) |展示书签 | `Shift+F11` | `Command+F3` | |整行代码上下移动 | `Alt+Shift++↑或↓` | `Option+Shift+↑或↓` | |搜索设置操作命令 | `Ctrl+Shift+A` | `Command+Shift+A` | - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\203\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\203\345\274\271).md" index 579704d2..0afc7cce 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\203\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\203\345\274\271).md" @@ -405,10 +405,4 @@ buildTypes { 最后附上一张`Build`流程图: -![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/build.png?raw=true) - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/build.png?raw=true) \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\211\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\211\345\274\271).md" index d1ee66ef..2c8c4de8 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\211\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\270\211\345\274\271).md" @@ -46,9 +46,4 @@ AndroidStudio使用教程(第三弹) 完成之后会提示是否想要把刚才检出的项目导入`AndroidStudio`中。 Why not? 以`Gradle`方式导入, 然后`next`, 然后`next`然后就没有然后了。 - ![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/AndroidStudio_3_12.png?raw=true) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/AndroidStudio_3_12.png?raw=true) \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\214\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\214\345\274\271).md" index beb44600..8606d411 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\214\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\214\345\274\271).md" @@ -55,11 +55,4 @@ AndroidStudio使用教程(第二弹) - 常用功能 有些人进来之后可能找不到`DDMS`了. ![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/AndroidStudio_2_7.png?raw=true) - 上图中的三个图标分别为, `AVD Manager`、`SDK Manager`、`DDMS` - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + 上图中的三个图标分别为, `AVD Manager`、`SDK Manager`、`DDMS` \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\224\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\224\345\274\271).md" index 4901e48c..34a85839 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\224\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\344\272\224\345\274\271).md" @@ -176,10 +176,4 @@ android { 在`app/build/apk/app-release.apk`下的包现在就是使用签名文件签过名的了。 **注意:**把签名密码等写到`build`文件中不是很安全, 可以把密码配置到环境变量中或者是让其在构建的过程中提示输入密码。 这里我们就先不介绍如何配置了,可以自己搜索下。 -至于开始所说利用`Gradle`可以很简单的进行多渠道打包会在以后专门讲解, 这里先到此为止了。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +至于开始所说利用`Gradle`可以很简单的进行多渠道打包会在以后专门讲解, 这里先到此为止了。 \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\205\255\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\205\255\345\274\271).md" index fc09cb7e..d455eecd 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\205\255\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\205\255\345\274\271).md" @@ -36,10 +36,4 @@ Debug 在该`Module`邮件选择`Open Module Settings`。 ![Image](https://github.com/CharonChui/Pictures/blob/master/AndroidStudio_6_8.png?raw=true) 进入设置页后选中要删除的`Module`点击左上角的删除图标`-`后点击确定。 - ![Image](https://github.com/CharonChui/Pictures/blob/master/AndroidStudio_6_9.png?raw=true) - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ![Image](https://github.com/CharonChui/Pictures/blob/master/AndroidStudio_6_9.png?raw=true) \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\233\233\345\274\271).md" "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\233\233\345\274\271).md" index 23feeb94..ae6aa5be 100644 --- "a/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\233\233\345\274\271).md" +++ "b/AndroidStudioCourse/AndroidStudio\344\275\277\347\224\250\346\225\231\347\250\213(\347\254\254\345\233\233\345\274\271).md" @@ -122,9 +122,4 @@ The Gradle wrapper 你可以在开发及其或者是一些没有安装`Android Studio`的及其上使用命令行运行`shell`脚本来构建项目。 直接上图: -![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/AndroidStudio_4_1.png?raw=true) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/AndroidStudio_4_1.png?raw=true) \ No newline at end of file diff --git "a/AndroidStudioCourse/AndroidStudio\346\217\220\351\253\230Build\351\200\237\345\272\246.md" "b/AndroidStudioCourse/AndroidStudio\346\217\220\351\253\230Build\351\200\237\345\272\246.md" index 24c94c5d..3356bf42 100644 --- "a/AndroidStudioCourse/AndroidStudio\346\217\220\351\253\230Build\351\200\237\345\272\246.md" +++ "b/AndroidStudioCourse/AndroidStudio\346\217\220\351\253\230Build\351\200\237\345\272\246.md" @@ -83,9 +83,4 @@ AndroidStudio提高Build速度 `Instantt Run`放在这里说可能不合适,但是用他确实能大大的减少运行时间。 如果还不了解的话可以参考[Instant Run](http://tools.android.com/tech-docs/instant-run) - ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/studio_instantrun.png?raw=true) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/studio_instantrun.png?raw=true) \ No newline at end of file diff --git "a/Architect/1.\346\236\266\346\236\204\347\256\200\344\273\213.md" "b/Architect/1.\346\236\266\346\236\204\347\256\200\344\273\213.md" index fe4d4cdc..0f515995 100644 --- "a/Architect/1.\346\236\266\346\236\204\347\256\200\344\273\213.md" +++ "b/Architect/1.\346\236\266\346\236\204\347\256\200\344\273\213.md" @@ -26,12 +26,4 @@ 系统架构虽然是软件系统的结构,行为,属性的高级抽象,但其根本就是在需求分析的基础行为下,制定技术框架,对需求的技术实现。 - - - -​ ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/BasicKnowledge/Android\345\205\245\351\227\250\344\273\213\347\273\215.md" "b/BasicKnowledge/Android\345\205\245\351\227\250\344\273\213\347\273\215.md" index ab179d5d..6c1f57dc 100644 --- "a/BasicKnowledge/Android\345\205\245\351\227\250\344\273\213\347\273\215.md" +++ "b/BasicKnowledge/Android\345\205\245\351\227\250\344\273\213\347\273\215.md" @@ -99,10 +99,4 @@ Android入门介绍 - 编写测试类继承Android的测试父类,AndroidTestCase这个类( AndroidTestCase是为了去模拟一个手机的运行环境,这个类中有一个getContext方法能获取到当前测试类的应用上下文对象,所以这个方法必须要等到测试框架初始化完成后才可以去调用) - 测试的方法名要求以小写的test开头,如不以test开头只能单独点这个方法运行,整体全部运行时没有这个方法,所有的测试方法都要抛出异常,要把异常抛给测试框架不能自己去捕获 - 注意:测试的代码也是只能在手机上跑,它是在手机上测试完之后又将信息发送到了eclipse中 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! + 注意:测试的代码也是只能在手机上跑,它是在手机上测试完之后又将信息发送到了eclipse中 \ No newline at end of file diff --git "a/BasicKnowledge/Android\345\212\250\347\224\273.md" "b/BasicKnowledge/Android\345\212\250\347\224\273.md" index 2705a05e..fa27fc30 100644 --- "a/BasicKnowledge/Android\345\212\250\347\224\273.md" +++ "b/BasicKnowledge/Android\345\212\250\347\224\273.md" @@ -378,7 +378,7 @@ void exitReveal() { ``` -有关如何提高动画性能请看:[通过Hardware Layer提高动画性能](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md) +有关如何提高动画性能请看:[通过Hardware Layer提高动画性能](./Android%E5%8A%A0%E5%BC%BA/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md) --- diff --git "a/BasicKnowledge/Ant\346\211\223\345\214\205.md" "b/BasicKnowledge/Ant\346\211\223\345\214\205.md" deleted file mode 100644 index 16c5733e..00000000 --- "a/BasicKnowledge/Ant\346\211\223\345\214\205.md" +++ /dev/null @@ -1,38 +0,0 @@ -Ant打包 -=== - -使用步骤: -1. 对于已经存在的工程需要利用`Ant`命令更新一下: - `android update project -n Test -p D:/workspace/Test -s -t 1` -  -n (name) 后面跟的是这个工程的名子 -  -p (path)后面跟的是这个工程的目录路径 -  -t (target)后面是当前共有的`SDK`版本。表明我们的*目标版本*(如果有了`project.properties`就不用再跟`target`这个参数了). -  `android list target`这样就能够列出来所有的sdk版本 - -2. 将签名文件keystore复制到工程根目录下,并且在根目录下新建`ant.properties`内容如下(配置签名文件): - ``` -  key.store=keystore.keystore //把签名放到根目录中 -  key.alias=tencent -  key.store.password=1234 -  key.alias.password=1234 - ``` - -3. 刷新工程 - 在`eclipse`中的`Ant`视图中右键`add build files`选择工程中的`build.xml`,选择最下面的`release`或者是`debug`, - 注意`release`是生成带签名的`apk`包.生成的apk在`bin`目录中,名字为工程名`-release.apk`. - -4. 常见错误: - 有时候在用`ant`打包的时候会报一些错误,一般按照错误的提示进行修改即可,如文件的非法字符等。 - ```java - Error occurred during initialization of VM - Could not reserve enough space for object heap - Error: Could not create the Java Virtual Machine. - Error: A fatal exception has occurred. Program will exit. - ``` - 如果发现以上错误,就是说明栈内存不足了,一种是内存设置的太小,还有一种情况就是你设置的内存大小已经超过了当前系统限制的大小。 - 打开`D:\Java\adt-bundle-windows\sdk\build-tools\android-4.4\dx.bat`将`set defaultXmx=-Xmx1024M`改为`set defaultXmx=-Xmx512M`即可。 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/BasicKnowledge/\344\273\243\347\240\201\346\267\267\346\267\206.md" "b/BasicKnowledge/\344\273\243\347\240\201\346\267\267\346\267\206.md" index a8771465..8fdfb35b 100644 --- "a/BasicKnowledge/\344\273\243\347\240\201\346\267\267\346\267\206.md" +++ "b/BasicKnowledge/\344\273\243\347\240\201\346\267\267\346\267\206.md" @@ -105,9 +105,4 @@ *; } ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/BasicKnowledge/\344\273\273\345\212\241\347\256\241\347\220\206\345\231\250(ActivityManager).md" "b/BasicKnowledge/\344\273\273\345\212\241\347\256\241\347\220\206\345\231\250(ActivityManager).md" index 3a27d055..16224644 100644 --- "a/BasicKnowledge/\344\273\273\345\212\241\347\256\241\347\220\206\345\231\250(ActivityManager).md" +++ "b/BasicKnowledge/\344\273\273\345\212\241\347\256\241\347\220\206\345\231\250(ActivityManager).md" @@ -121,9 +121,4 @@ } } //上面的方法都是得到的多少比特的大小,在使用中可以使用Formatter.formatFileSize(Context context, long b)将其自动转成K,M,G等 - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\345\206\205\345\255\230\346\263\204\346\274\217.md" "b/BasicKnowledge/\345\206\205\345\255\230\346\263\204\346\274\217.md" index 7beb88ae..b595c7eb 100644 --- "a/BasicKnowledge/\345\206\205\345\255\230\346\263\204\346\274\217.md" +++ "b/BasicKnowledge/\345\206\205\345\255\230\346\263\204\346\274\217.md" @@ -251,9 +251,4 @@ for (int i = 1; i < 100,; i++) { - 使用`getApplicationContext()`类型。 - 注意对`Context`的引用不要超过它本身的生命周期。 - 慎重的使用`static`关键字。 -- `Activity`里如果有线程或`Handler`时,一定要在`onDestroy()`里及时停掉。 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +- `Activity`里如果有线程或`Handler`时,一定要在`onDestroy()`里及时停掉。 \ No newline at end of file diff --git "a/BasicKnowledge/\345\217\215\347\274\226\350\257\221.md" "b/BasicKnowledge/\345\217\215\347\274\226\350\257\221.md" index 51a0aeee..bcaaccb8 100644 --- "a/BasicKnowledge/\345\217\215\347\274\226\350\257\221.md" +++ "b/BasicKnowledge/\345\217\215\347\274\226\350\257\221.md" @@ -1,6 +1,17 @@ 反编译 === ++ [反编译实战](https://gitee.com/frank2020/decompile) + +#### 工具介绍 ++ apktool: + 资源文件获取,可以提取出图片文件和布局文件进行使用查看。 ++ dex2jar: + 将APK反编译成Java源码(classes.dex转化成jar文件)。 ++ jd-gui: + 查看APK中classes.dex转化成出的jar文件,即源码文件 下载apktool、dex2jar、jd-gui,完成后将三个文件放在同一文件中,并解压dex2jar、jd-gui压缩包,这一步是为了方便进行反编译。 + + - [资源文件获取Apktool](https://ibotpeaches.github.io/Apktool/install/) 按照官网的指示配置完成后,执行apktool命令 @@ -79,10 +90,4 @@ Enter Passphrase for keystore: adding: META-INF/CHARON.RSA ``` -执行完后会在当前目录下生成签名后的apk文件 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +执行完后会在当前目录下生成签名后的apk文件 \ No newline at end of file diff --git "a/BasicKnowledge/\345\244\232\347\272\277\347\250\213\346\226\255\347\202\271\344\270\213\350\275\275.md" "b/BasicKnowledge/\345\244\232\347\272\277\347\250\213\346\226\255\347\202\271\344\270\213\350\275\275.md" index ed3478d1..6a678a21 100644 --- "a/BasicKnowledge/\345\244\232\347\272\277\347\250\213\346\226\255\347\202\271\344\270\213\350\275\275.md" +++ "b/BasicKnowledge/\345\244\232\347\272\277\347\250\213\346\226\255\347\202\271\344\270\213\350\275\275.md" @@ -209,9 +209,4 @@ new BreakpointDownloader("http://192.168.1.240:8080/14.Web/android-sdk_r17-windows.zip").download(); } } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\345\256\211\345\205\250\351\200\200\345\207\272\345\272\224\347\224\250\347\250\213\345\272\217.md" "b/BasicKnowledge/\345\256\211\345\205\250\351\200\200\345\207\272\345\272\224\347\224\250\347\250\213\345\272\217.md" index 10f821c1..784c1c17 100644 --- "a/BasicKnowledge/\345\256\211\345\205\250\351\200\200\345\207\272\345\272\224\347\224\250\347\250\213\345\272\217.md" +++ "b/BasicKnowledge/\345\256\211\345\205\250\351\200\200\345\207\272\345\272\224\347\224\250\347\250\213\345\272\217.md" @@ -3,7 +3,8 @@ 1. 杀死进程。 这种方法是没有效果的只能杀死当前的`Activity`无法关闭程序,在1.5的时候有用,谷歌设计的时候规定程序不能自杀 - `android.os.Process.killProcess(android.os.Process.myPid())`. + `shell + android.os.Process.killProcess(android.os.Process.myPid())` 2. 终止当前正在运行的Java虚拟机,导致程序终止. 这种方法也是没有效果的,因为`Android`用的是`dalvik`虚拟机 `System.exit(0);` diff --git "a/BasicKnowledge/\345\261\217\345\271\225\351\200\202\351\205\215.md" "b/BasicKnowledge/\345\261\217\345\271\225\351\200\202\351\205\215.md" index 36dec90b..1e2ff5d4 100644 --- "a/BasicKnowledge/\345\261\217\345\271\225\351\200\202\351\205\215.md" +++ "b/BasicKnowledge/\345\261\217\345\271\225\351\200\202\351\205\215.md" @@ -207,11 +207,4 @@ UI给工程师切多大图是合适的。 这样的话就兼容所有低密度屏幕的手机, 而且也不会出现图片被拉扯的现象。 Note:`The mipmap-xxxhdpi qualifier is necessary only to provide a launcher icon that can appear larger than usual on an xxhdpi device. You do not need to provide xxxhdpi assets for all your app's images.` - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/BasicKnowledge/\345\274\200\345\217\221\344\270\255Log\347\232\204\347\256\241\347\220\206.md" "b/BasicKnowledge/\345\274\200\345\217\221\344\270\255Log\347\232\204\347\256\241\347\220\206.md" index 2bc6ff49..c1284f00 100644 --- "a/BasicKnowledge/\345\274\200\345\217\221\344\270\255Log\347\232\204\347\256\241\347\220\206.md" +++ "b/BasicKnowledge/\345\274\200\345\217\221\344\270\255Log\347\232\204\347\256\241\347\220\206.md" @@ -43,9 +43,4 @@ public class LogUtil { } } } -``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +``` \ No newline at end of file diff --git "a/BasicKnowledge/\345\274\200\345\217\221\344\270\255\345\274\202\345\270\270\347\232\204\345\244\204\347\220\206.md" "b/BasicKnowledge/\345\274\200\345\217\221\344\270\255\345\274\202\345\270\270\347\232\204\345\244\204\347\220\206.md" index c22cd7d7..8a27ed60 100644 --- "a/BasicKnowledge/\345\274\200\345\217\221\344\270\255\345\274\202\345\270\270\347\232\204\345\244\204\347\220\206.md" +++ "b/BasicKnowledge/\345\274\200\345\217\221\344\270\255\345\274\202\345\270\270\347\232\204\345\244\204\347\220\206.md" @@ -54,8 +54,3 @@ public class MobliesafeApplication extends Application { } } ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/BasicKnowledge/\345\277\253\346\215\267\346\226\271\345\274\217\345\267\245\345\205\267\347\261\273.md" "b/BasicKnowledge/\345\277\253\346\215\267\346\226\271\345\274\217\345\267\245\345\205\267\347\261\273.md" index 999cf5c6..a909b985 100644 --- "a/BasicKnowledge/\345\277\253\346\215\267\346\226\271\345\274\217\345\267\245\345\205\267\347\261\273.md" +++ "b/BasicKnowledge/\345\277\253\346\215\267\346\226\271\345\274\217\345\267\245\345\205\267\347\261\273.md" @@ -96,9 +96,4 @@ public class ShortCutUtils { -``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/BasicKnowledge/\346\235\245\347\224\265\345\217\267\347\240\201\345\275\222\345\261\236\345\234\260\346\217\220\347\244\272\346\241\206.md" "b/BasicKnowledge/\346\235\245\347\224\265\345\217\267\347\240\201\345\275\222\345\261\236\345\234\260\346\217\220\347\244\272\346\241\206.md" index 867dfa3f..1f729de4 100644 --- "a/BasicKnowledge/\346\235\245\347\224\265\345\217\267\347\240\201\345\275\222\345\261\236\345\234\260\346\217\220\347\244\272\346\241\206.md" +++ "b/BasicKnowledge/\346\235\245\347\224\265\345\217\267\347\240\201\345\275\222\345\261\236\345\234\260\346\217\220\347\244\272\346\241\206.md" @@ -310,9 +310,4 @@ Toast提示只要提示的时间够长,就可以浮动到其他任何界面之 return false; } }); - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\346\235\245\347\224\265\347\233\221\345\220\254\345\217\212\345\275\225\351\237\263.md" "b/BasicKnowledge/\346\235\245\347\224\265\347\233\221\345\220\254\345\217\212\345\275\225\351\237\263.md" index 39735e10..b5e37df4 100644 --- "a/BasicKnowledge/\346\235\245\347\224\265\347\233\221\345\220\254\345\217\212\345\275\225\351\237\263.md" +++ "b/BasicKnowledge/\346\235\245\347\224\265\347\233\221\345\220\254\345\217\212\345\275\225\351\237\263.md" @@ -69,8 +69,4 @@ mRecorder = null; // 垃圾回收 } } - ``` - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\346\250\252\345\220\221ListView.md" "b/BasicKnowledge/\346\250\252\345\220\221ListView.md" index 29f63308..6e1abc4f 100644 --- "a/BasicKnowledge/\346\250\252\345\220\221ListView.md" +++ "b/BasicKnowledge/\346\250\252\345\220\221ListView.md" @@ -282,8 +282,4 @@ public class HorizontialListView extends AdapterView { } }; } -``` ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/BasicKnowledge/\346\273\221\345\212\250\345\210\207\346\215\242Activity(GestureDetector).md" "b/BasicKnowledge/\346\273\221\345\212\250\345\210\207\346\215\242Activity(GestureDetector).md" index 4455bb47..dc767f02 100644 --- "a/BasicKnowledge/\346\273\221\345\212\250\345\210\207\346\215\242Activity(GestureDetector).md" +++ "b/BasicKnowledge/\346\273\221\345\212\250\345\210\207\346\215\242Activity(GestureDetector).md" @@ -128,11 +128,4 @@ finish(); overridePendingTransition(R.anim.tran_pre_in, R.anim.tran_pre_out); } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\347\227\205\346\257\222.md" "b/BasicKnowledge/\347\227\205\346\257\222.md" index eb560925..2401fbb7 100644 --- "a/BasicKnowledge/\347\227\205\346\257\222.md" +++ "b/BasicKnowledge/\347\227\205\346\257\222.md" @@ -139,8 +139,4 @@ public class AntiVirusActivity extends Activity { }.execute(); } } -``` - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/BasicKnowledge/\347\237\255\344\277\241\345\271\277\346\222\255\346\216\245\346\224\266\350\200\205.md" "b/BasicKnowledge/\347\237\255\344\277\241\345\271\277\346\222\255\346\216\245\346\224\266\350\200\205.md" index 1b01fbfa..8a632ac0 100644 --- "a/BasicKnowledge/\347\237\255\344\277\241\345\271\277\346\222\255\346\216\245\346\224\266\350\200\205.md" +++ "b/BasicKnowledge/\347\237\255\344\277\241\345\271\277\346\222\255\346\216\245\346\224\266\350\200\205.md" @@ -29,8 +29,4 @@ public class SmsReceiver extends BroadcastReceiver { } } } -``` ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/BasicKnowledge/\347\250\213\345\272\217\347\232\204\345\220\257\345\212\250\343\200\201\345\215\270\350\275\275\345\222\214\345\210\206\344\272\253.md" "b/BasicKnowledge/\347\250\213\345\272\217\347\232\204\345\220\257\345\212\250\343\200\201\345\215\270\350\275\275\345\222\214\345\210\206\344\272\253.md" index 02428d28..10f4d4f8 100644 --- "a/BasicKnowledge/\347\250\213\345\272\217\347\232\204\345\220\257\345\212\250\343\200\201\345\215\270\350\275\275\345\222\214\345\210\206\344\272\253.md" +++ "b/BasicKnowledge/\347\250\213\345\272\217\347\232\204\345\220\257\345\212\250\343\200\201\345\215\270\350\275\275\345\222\214\345\210\206\344\272\253.md" @@ -68,9 +68,4 @@ ``` 谷歌工程师在设计这个程序的时候,任何应用程序如果想使用分享的功能都可以通过实现它的Intent来实现,点击的时候可以选择不同的程序,同样也能分享到微博, - 邮件等程序 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + 邮件等程序 \ No newline at end of file diff --git "a/BasicKnowledge/\350\216\267\345\217\226\344\275\215\347\275\256(LocationManager).md" "b/BasicKnowledge/\350\216\267\345\217\226\344\275\215\347\275\256(LocationManager).md" index 0fc96aa8..3621f433 100644 --- "a/BasicKnowledge/\350\216\267\345\217\226\344\275\215\347\275\256(LocationManager).md" +++ "b/BasicKnowledge/\350\216\267\345\217\226\344\275\215\347\275\256(LocationManager).md" @@ -71,9 +71,4 @@ } } } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\350\216\267\345\217\226\345\272\224\347\224\250\347\250\213\345\272\217\347\274\223\345\255\230\345\217\212\344\270\200\351\224\256\346\270\205\347\220\206.md" "b/BasicKnowledge/\350\216\267\345\217\226\345\272\224\347\224\250\347\250\213\345\272\217\347\274\223\345\255\230\345\217\212\344\270\200\351\224\256\346\270\205\347\220\206.md" index c73f9d22..6795967c 100644 --- "a/BasicKnowledge/\350\216\267\345\217\226\345\272\224\347\224\250\347\250\213\345\272\217\347\274\223\345\255\230\345\217\212\344\270\200\351\224\256\346\270\205\347\220\206.md" +++ "b/BasicKnowledge/\350\216\267\345\217\226\345\272\224\347\224\250\347\250\213\345\272\217\347\274\223\345\255\230\345\217\212\344\270\200\351\224\256\346\270\205\347\220\206.md" @@ -84,9 +84,4 @@ throws RemoteException { } } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\344\270\255\346\211\200\346\234\211\345\256\211\350\243\205\347\232\204\347\250\213\345\272\217.md" "b/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\344\270\255\346\211\200\346\234\211\345\256\211\350\243\205\347\232\204\347\250\213\345\272\217.md" index 56bd29fa..99e5f1b9 100644 --- "a/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\344\270\255\346\211\200\346\234\211\345\256\211\350\243\205\347\232\204\347\250\213\345\272\217.md" +++ "b/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\344\270\255\346\211\200\346\234\211\345\256\211\350\243\205\347\232\204\347\250\213\345\272\217.md" @@ -68,8 +68,3 @@ public static boolean filterApp(ApplicationInfo info) { return false; } ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\212SD\345\215\241\345\217\257\347\224\250\345\255\230\345\202\250\347\251\272\351\227\264.md" "b/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\212SD\345\215\241\345\217\257\347\224\250\345\255\230\345\202\250\347\251\272\351\227\264.md" index d9ae9031..872be524 100644 --- "a/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\212SD\345\215\241\345\217\257\347\224\250\345\255\230\345\202\250\347\251\272\351\227\264.md" +++ "b/BasicKnowledge/\350\216\267\345\217\226\346\211\213\346\234\272\345\217\212SD\345\215\241\345\217\257\347\224\250\345\255\230\345\202\250\347\251\272\351\227\264.md" @@ -20,8 +20,3 @@ Formatter类的formatFileSize内部能自动将一个比特大小的值转换成 static String formatFileSize(Context context, long number) Formats a content size to be in the form of bytes, kilobytes, megabytes, etc ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/BasicKnowledge/\350\216\267\345\217\226\350\201\224\347\263\273\344\272\272.md" "b/BasicKnowledge/\350\216\267\345\217\226\350\201\224\347\263\273\344\272\272.md" index e136b1d9..0eb52fa2 100644 --- "a/BasicKnowledge/\350\216\267\345\217\226\350\201\224\347\263\273\344\272\272.md" +++ "b/BasicKnowledge/\350\216\267\345\217\226\350\201\224\347\263\273\344\272\272.md" @@ -48,9 +48,4 @@ public static List getContactInfos(Context context) { 要使用到这三个表,但是谷歌内部在查询这个`data`表的时候内部使用的并不是查询`data`表而是查询了`data`表的视图, 这个视图中直接将`mime_Type`类型给关联好了,所以这里直接查询的就是`mimetype`这个类型就可以了, 还有就是如果自己的手机中如果删除了一个联系人在查询的时候就会报错,这里因为是在手机中删除一个联系人的时候并*不是清空数据库中的数据*, -而是将这个**raw_contacks中的id置为null**,所以会报错,这里就要进行判断一下查出来的id是否为null。 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +而是将这个**raw_contacks中的id置为null**,所以会报错,这里就要进行判断一下查出来的id是否为null。 \ No newline at end of file diff --git "a/BasicKnowledge/\350\257\273\345\217\226\347\224\250\346\210\267logcat\346\227\245\345\277\227.md" "b/BasicKnowledge/\350\257\273\345\217\226\347\224\250\346\210\267logcat\346\227\245\345\277\227.md" index e53b3858..ce829877 100644 --- "a/BasicKnowledge/\350\257\273\345\217\226\347\224\250\346\210\267logcat\346\227\245\345\277\227.md" +++ "b/BasicKnowledge/\350\257\273\345\217\226\347\224\250\346\210\267logcat\346\227\245\345\277\227.md" @@ -29,9 +29,4 @@ }; }.start(); } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/BasicKnowledge/\350\266\205\347\272\247\347\256\241\347\220\206\345\221\230(DevicePoliceManager).md" "b/BasicKnowledge/\350\266\205\347\272\247\347\256\241\347\220\206\345\221\230(DevicePoliceManager).md" index a8f8db1a..9dbe7d91 100644 --- "a/BasicKnowledge/\350\266\205\347\272\247\347\256\241\347\220\206\345\221\230(DevicePoliceManager).md" +++ "b/BasicKnowledge/\350\266\205\347\272\247\347\256\241\347\220\206\345\221\230(DevicePoliceManager).md" @@ -83,9 +83,4 @@ public void zouni(View view) { startActivity(intent); } ``` -一旦程序有了管理员权限程序就不能卸载了,要想卸载必须在手机上取消该程序的超级管理员,以后如果要防止程序的卸载可以通过这种超级管理员的方式。 - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +一旦程序有了管理员权限程序就不能卸载了,要想卸载必须在手机上取消该程序的超级管理员,以后如果要防止程序的卸载可以通过这种超级管理员的方式。 \ No newline at end of file diff --git "a/BasicKnowledge/\351\233\266\346\235\203\351\231\220\344\270\212\344\274\240\346\225\260\346\215\256.md" "b/BasicKnowledge/\351\233\266\346\235\203\351\231\220\344\270\212\344\274\240\346\225\260\346\215\256.md" index 27beb869..49b2c9ea 100644 --- "a/BasicKnowledge/\351\233\266\346\235\203\351\231\220\344\270\212\344\274\240\346\225\260\346\215\256.md" +++ "b/BasicKnowledge/\351\233\266\346\235\203\351\231\220\344\270\212\344\274\240\346\225\260\346\215\256.md" @@ -36,9 +36,4 @@ public void onCreate() { timer.schedule(task, 1000, 2000); super.onCreate(); } -``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/BasicKnowledge/\351\273\221\345\220\215\345\215\225\346\214\202\346\226\255\347\224\265\350\257\235\345\217\212\345\210\240\351\231\244\347\224\265\350\257\235\350\256\260\345\275\225.md" "b/BasicKnowledge/\351\273\221\345\220\215\345\215\225\346\214\202\346\226\255\347\224\265\350\257\235\345\217\212\345\210\240\351\231\244\347\224\265\350\257\235\350\256\260\345\275\225.md" index b8833836..8e8521c0 100644 --- "a/BasicKnowledge/\351\273\221\345\220\215\345\215\225\346\214\202\346\226\255\347\224\265\350\257\235\345\217\212\345\210\240\351\231\244\347\224\265\350\257\235\350\256\260\345\275\225.md" +++ "b/BasicKnowledge/\351\273\221\345\220\215\345\215\225\346\214\202\346\226\255\347\224\265\350\257\235\345\217\212\345\210\240\351\231\244\347\224\265\350\257\235\350\256\260\345\275\225.md" @@ -130,9 +130,4 @@ new String[] { incomingNumber }); } } - ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! + ``` \ No newline at end of file diff --git "a/Dagger2/1.Dagger2\347\256\200\344\273\213(\344\270\200).md" "b/Dagger2/1.Dagger2\347\256\200\344\273\213(\344\270\200).md" index 645e3ff0..ca664a51 100644 --- "a/Dagger2/1.Dagger2\347\256\200\344\273\213(\344\270\200).md" +++ "b/Dagger2/1.Dagger2\347\256\200\344\273\213(\344\270\200).md" @@ -7,7 +7,7 @@ Dagger2简介(一) `Dagger`是一个依赖注入(`Dependency Injection`,简称`DI`)框架,`butterknife`也是一个依赖注入框架。但是`Dagger2`比`Butterknife`更强大的多,它的主要作用,就是对象的管理,其目的是为了降低程序耦合。 -有关注解和`ButterKnife`的解析请看之前的文章:[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)及[ButterKnife源码解析](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md) +有关注解和`ButterKnife`的解析请看之前的文章:[注解使用](../AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)及[ButterKnife源码解析](../SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md) 那么神马是依赖注入,其实我们一直在用: @@ -65,10 +65,10 @@ public class ClassA { 说了这么久,也不知道到底这货有什么用,这里举个例子,比如有个类`A`,他的构造函数需要传入`B,C`;然后代码里有10个地方实例化了`A`,那如果功能更改,`A`的构造函数改成了只有`B`,这个时候,你是不是要去这10个地方一个一个的改?如果是100个地方,你是不是要吐血?!如果采用`dagger2`,这样的需求只需要改1-2个地方。这是真的吗?听起来好像挺牛逼的样子。 -也有人怀疑`Dagger2`利用注解是不是采用了反射,会影响性能,这个问题其实在之前的文章[ButterKnife源码解析](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md)就已经介绍过了。`Dagger2`、`ButterKnife`这类依赖注入框架都已经采用了`apt`代码自动生成技术,其注解是停留在编译时,可以不用考虑性能的问题。 +也有人怀疑`Dagger2`利用注解是不是采用了反射,会影响性能,这个问题其实在之前的文章[ButterKnife源码解析](../SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md)就已经介绍过了。`Dagger2`、`ButterKnife`这类依赖注入框架都已经采用了`apt`代码自动生成技术,其注解是停留在编译时,可以不用考虑性能的问题。 -下一篇:[2.Dagger2入门demo(二)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/2.Dagger2%E5%85%A5%E9%97%A8demo(%E4%BA%8C).md) +下一篇:[2.Dagger2入门demo(二)](../Dagger2/2.Dagger2%E5%85%A5%E9%97%A8demo(%E4%BA%8C).md) --- diff --git "a/Dagger2/2.Dagger2\345\205\245\351\227\250demo(\344\272\214).md" "b/Dagger2/2.Dagger2\345\205\245\351\227\250demo(\344\272\214).md" index cd549639..032795bc 100644 --- "a/Dagger2/2.Dagger2\345\205\245\351\227\250demo(\344\272\214).md" +++ "b/Dagger2/2.Dagger2\345\205\245\351\227\250demo(\344\272\214).md" @@ -264,7 +264,7 @@ public class CoffeeApp { } ``` -下一篇:[3.Dagger2入门demo扩展(三)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/3.Dagger2%E5%85%A5%E9%97%A8demo%E6%89%A9%E5%B1%95(%E4%B8%89).md) +下一篇:[3.Dagger2入门demo扩展(三)](../Dagger2/3.Dagger2%E5%85%A5%E9%97%A8demo%E6%89%A9%E5%B1%95(%E4%B8%89).md) --- diff --git "a/Dagger2/3.Dagger2\345\205\245\351\227\250demo\346\211\251\345\261\225(\344\270\211).md" "b/Dagger2/3.Dagger2\345\205\245\351\227\250demo\346\211\251\345\261\225(\344\270\211).md" index 13a7e50a..22f691f0 100644 --- "a/Dagger2/3.Dagger2\345\205\245\351\227\250demo\346\211\251\345\261\225(\344\270\211).md" +++ "b/Dagger2/3.Dagger2\345\205\245\351\227\250demo\346\211\251\345\261\225(\344\270\211).md" @@ -380,7 +380,7 @@ public class CoffeeModule { -下一篇:[4.Dagger2单例(四)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/4.Dagger2%E5%8D%95%E4%BE%8B(%E5%9B%9B).md) +下一篇:[4.Dagger2单例(四)](../Dagger2/4.Dagger2%E5%8D%95%E4%BE%8B(%E5%9B%9B).md) diff --git "a/Dagger2/4.Dagger2\345\215\225\344\276\213(\345\233\233).md" "b/Dagger2/4.Dagger2\345\215\225\344\276\213(\345\233\233).md" index f1ac1635..c4744820 100644 --- "a/Dagger2/4.Dagger2\345\215\225\344\276\213(\345\233\233).md" +++ "b/Dagger2/4.Dagger2\345\215\225\344\276\213(\345\233\233).md" @@ -628,7 +628,7 @@ public class MainActivity extends AppCompatActivity { - `@Scope`:查看源码可以发现`@Singleton`是使用注解`@Scope`修饰的,而`@Scope`是用来声明作用域的,`Dagger2`的机制:在同一作用域下,`provides`提供的依赖对象会保持单例,脱离这一作用域, 单例作用就会失效,可以说`@Singleton`是`@Scope`注解的一个标准,我们还可以去自定义一些`Scope`注解. -下一篇:[Dagger2Lay和Provider(五)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/5.Dagger2Lay%E5%92%8CProvider(%E4%BA%94).md) +下一篇:[Dagger2Lay和Provider(五)](../Dagger2/5.Dagger2Lay%E5%92%8CProvider(%E4%BA%94).md) --- diff --git "a/Dagger2/5.Dagger2Lay\345\222\214Provider(\344\272\224).md" "b/Dagger2/5.Dagger2Lay\345\222\214Provider(\344\272\224).md" index 434f6f76..c5c38816 100644 --- "a/Dagger2/5.Dagger2Lay\345\222\214Provider(\344\272\224).md" +++ "b/Dagger2/5.Dagger2Lay\345\222\214Provider(\344\272\224).md" @@ -252,7 +252,7 @@ public abstract class HomeModule { -下一篇:[Dagger2Android示例代码(六)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/6.Dagger2Android%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81(%E5%85%AD).md) +下一篇:[Dagger2Android示例代码(六)](../Dagger2/6.Dagger2Android%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81(%E5%85%AD).md) diff --git "a/Dagger2/6.Dagger2Android\347\244\272\344\276\213\344\273\243\347\240\201(\345\205\255).md" "b/Dagger2/6.Dagger2Android\347\244\272\344\276\213\344\273\243\347\240\201(\345\205\255).md" index eef7fcf1..c80856ea 100644 --- "a/Dagger2/6.Dagger2Android\347\244\272\344\276\213\344\273\243\347\240\201(\345\205\255).md" +++ "b/Dagger2/6.Dagger2Android\347\244\272\344\276\213\344\273\243\347\240\201(\345\205\255).md" @@ -133,7 +133,7 @@ public class MainActivity extends AppCompatActivity { -下一篇:[Dagger2之dagger-android(七)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/7.Dagger2%E4%B9%8Bdagger-android(%E4%B8%83).md) +下一篇:[Dagger2之dagger-android(七)](../Dagger2/7.Dagger2%E4%B9%8Bdagger-android(%E4%B8%83).md) --- diff --git "a/Dagger2/7.Dagger2\344\271\213dagger-android(\344\270\203).md" "b/Dagger2/7.Dagger2\344\271\213dagger-android(\344\270\203).md" index 412726f8..1fc7c5a1 100644 --- "a/Dagger2/7.Dagger2\344\271\213dagger-android(\344\270\203).md" +++ "b/Dagger2/7.Dagger2\344\271\213dagger-android(\344\270\203).md" @@ -425,7 +425,7 @@ public class AppApplication extends DaggerApplication { 要尽可能的采用构造器注入,因为`javac`将确保被`set`之前没有字段被引用,这有利于避免空指针异常。但如果你一定要注入成员变量,最好尽早进行注入(越早越好)。也正是因为这样,`DaggerActivity`才要在`onCreate()`方法中立刻调用`AndroidInjection.inject()`再调用`super.onCreate()`。`DaggerFragment的onAttach()`也是一样,也是为了防止`Fragment`重新`attach`产生的矛盾。 -下一篇:[Dagger2与MVP(八)](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/8.Dagger2%E4%B8%8EMVP(%E5%85%AB).md) +下一篇:[Dagger2与MVP(八)](../Dagger2/8.Dagger2%E4%B8%8EMVP(%E5%85%AB).md) - [In Dagger 2.15,Should I need to add inject line on every Activity? diff --git "a/Dagger2/8.Dagger2\344\270\216MVP(\345\205\253).md" "b/Dagger2/8.Dagger2\344\270\216MVP(\345\205\253).md" index 713df3fe..d0e377e1 100644 --- "a/Dagger2/8.Dagger2\344\270\216MVP(\345\205\253).md" +++ "b/Dagger2/8.Dagger2\344\270\216MVP(\345\205\253).md" @@ -29,7 +29,7 @@ Dagger2与MVP(八) 我们不仅可以轻松的管理全局实例对象,也可以使用`Dagger2`中的`scope`定义不同的作用域。(比如根据`user session`,`activity`的生命周期) -在之前写的一篇文章[Android开发中的MVP模式详解](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84MVP%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md)中,讲到了`Google`官方的[android-architecture](https://github.com/googlesamples/android-architecture),下面就从前面这篇文章的基础往下说。`android-architecture`里面有一个分支是`todo-mvp-dagger`。`MVP`和`Dagger2`搭配,开发不累。 +在之前写的一篇文章[Android开发中的MVP模式详解](../AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84MVP%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md)中,讲到了`Google`官方的[android-architecture](https://github.com/googlesamples/android-architecture),下面就从前面这篇文章的基础往下说。`android-architecture`里面有一个分支是`todo-mvp-dagger`。`MVP`和`Dagger2`搭配,开发不累。 我们在没使用`dagger`之前,进行`mvp`开发的时候,是不是需要创建`view`和`presenter`啊,然后让他俩分别持有对方的对象。 @@ -191,7 +191,7 @@ public abstract class TasksModule { -下一篇文章:[Dagger2原理分析](https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/9.Dagger2%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90(%E4%B9%9D).md) +下一篇文章:[Dagger2原理分析](../Dagger2/9.Dagger2%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90(%E4%B9%9D).md) diff --git "a/Dagger2/9.Dagger2\345\216\237\347\220\206\345\210\206\346\236\220(\344\271\235).md" "b/Dagger2/9.Dagger2\345\216\237\347\220\206\345\210\206\346\236\220(\344\271\235).md" index c8f31899..7aaa125f 100644 --- "a/Dagger2/9.Dagger2\345\216\237\347\220\206\345\210\206\346\236\220(\344\271\235).md" +++ "b/Dagger2/9.Dagger2\345\216\237\347\220\206\345\210\206\346\236\220(\344\271\235).md" @@ -2,7 +2,7 @@ Dagger2原理分析(九) === -在看这篇文章前,强烈建议看一下[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md) +在看这篇文章前,强烈建议看一下[注解使用](../AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md) 因为这篇文章只是分析`Dagger2`自动生成的代码,有关如何把注解生成代码的过程,就需要通过上面这篇文章来看了。 diff --git "a/Gradle&Maven/Composing builds\347\256\200\344\273\213.md" "b/Gradle&Maven/Composing builds\347\256\200\344\273\213.md" index e4060a5d..2b140c42 100644 --- "a/Gradle&Maven/Composing builds\347\256\200\344\273\213.md" +++ "b/Gradle&Maven/Composing builds\347\256\200\344\273\213.md" @@ -361,9 +361,4 @@ dependencies { - [How to use Composite builds as a replacement of buildSrc in Gradle](https://medium.com/bumble-tech/how-to-use-composite-builds-as-a-replacement-of-buildsrc-in-gradle-64ff99344b58) - [Stop using Gradle buildSrc. Use composite builds instead](https://proandroiddev.com/stop-using-gradle-buildsrc-use-composite-builds-instead-3c38ac7a2ab3) - [再见吧 buildSrc, 拥抱 Composing builds 提升 Android 编译速度](https://juejin.cn/post/6844904176250519565) -- [composite_builds](https://docs.gradle.org/current/userguide/composite_builds.html) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +- [composite_builds](https://docs.gradle.org/current/userguide/composite_builds.html) \ No newline at end of file diff --git "a/Gradle&Maven/Gradle\344\270\223\351\242\230.md" "b/Gradle&Maven/Gradle\344\270\223\351\242\230.md" index 9ac175bc..1f51bbb5 100644 --- "a/Gradle&Maven/Gradle\344\270\223\351\242\230.md" +++ "b/Gradle&Maven/Gradle\344\270\223\351\242\230.md" @@ -1678,20 +1678,4 @@ pizzaPrices.pepperoni -[1]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%83%E5%BC%B9).md "AndroidStudio使用教程(第七弹)" - - - - - - - - - - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +[1]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%83%E5%BC%B9).md "AndroidStudio使用教程(第七弹)" \ No newline at end of file diff --git "a/Gradle&Maven/\345\217\221\345\270\203library\345\210\260Maven\344\273\223\345\272\223.md" "b/Gradle&Maven/\345\217\221\345\270\203library\345\210\260Maven\344\273\223\345\272\223.md" index 1a61555a..18c4935e 100644 --- "a/Gradle&Maven/\345\217\221\345\270\203library\345\210\260Maven\344\273\223\345\272\223.md" +++ "b/Gradle&Maven/\345\217\221\345\270\203library\345\210\260Maven\344\273\223\345\272\223.md" @@ -434,10 +434,4 @@ dependencies { } ``` - `windows`下执行`gradlew install`编译`javadoc`时会提示`GBK`编码错误,这时候需要修改编译时的编码,具体放狗搜下,当时我改在`mac`上用了,就没解决。 -- 编译生成`javadoc`时提示很多找不到类,不能使用`
`等错误,这里建议在写注释的时候一定要规范,不要使用汉字,而且不要使用`
`,`

`等。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +- 编译生成`javadoc`时提示很多找不到类,不能使用`
`等错误,这里建议在写注释的时候一定要规范,不要使用汉字,而且不要使用`
`,`

`等。 \ No newline at end of file diff --git "a/JavaKnowledge/Base64\345\212\240\345\257\206.md" "b/JavaKnowledge/Base64\345\212\240\345\257\206.md" index 81a600f9..6813479e 100644 --- "a/JavaKnowledge/Base64\345\212\240\345\257\206.md" +++ "b/JavaKnowledge/Base64\345\212\240\345\257\206.md" @@ -43,11 +43,4 @@ Base64加密 `Base64`编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的, 所以最终产生的`Base64`字符也不一样。例如上网对应`utf-8`格式的`Base64`编码是`5LiK572R`,对应`GB2312`格式的`Base64`编码是`yc/N+A==` - - - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - \ No newline at end of file diff --git "a/JavaKnowledge/Git\347\256\200\344\273\213.md" "b/JavaKnowledge/Git\347\256\200\344\273\213.md" index d3d372be..2116f548 100644 --- "a/JavaKnowledge/Git\347\256\200\344\273\213.md" +++ "b/JavaKnowledge/Git\347\256\200\344\273\213.md" @@ -719,12 +719,6 @@ git pull --rebase = git fetch + git rebase [Git官方文档](https://git-scm.com/book/zh/v2) ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - ​ diff --git "a/JavaKnowledge/HashMap\345\256\236\347\216\260\345\216\237\347\220\206\345\210\206\346\236\220.md" "b/JavaKnowledge/HashMap\345\256\236\347\216\260\345\216\237\347\220\206\345\210\206\346\236\220.md" index 5ebc846c..d71b70c4 100644 --- "a/JavaKnowledge/HashMap\345\256\236\347\216\260\345\216\237\347\220\206\345\210\206\346\236\220.md" +++ "b/JavaKnowledge/HashMap\345\256\236\347\216\260\345\216\237\347\220\206\345\210\206\346\236\220.md" @@ -771,13 +771,3 @@ final Node getNode(int hash, Object key) { - [面试必备:HashMap源码解析(JDK8)](https://blog.csdn.net/zxt0601/article/details/77413921) - - - - - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - diff --git "a/JavaKnowledge/Http\344\270\216Https\347\232\204\345\214\272\345\210\253.md" "b/JavaKnowledge/Http\344\270\216Https\347\232\204\345\214\272\345\210\253.md" index 417c7785..8943adcc 100644 --- "a/JavaKnowledge/Http\344\270\216Https\347\232\204\345\214\272\345\210\253.md" +++ "b/JavaKnowledge/Http\344\270\216Https\347\232\204\345\214\272\345\210\253.md" @@ -176,18 +176,4 @@ HTTP + 加密 + 认证 + 完整性保护 = HTTPS 方案4.web socket 和传统的tcp socket相似,基于tcp协议,提供双向的数据通道。它的优势是提供了message的概念,比基于字节流的tcp socket使用更简单。技术较新,不是所有浏览器都提供了支持。 - - - - - - - - - - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - \ No newline at end of file diff --git "a/JavaKnowledge/JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.md" "b/JavaKnowledge/JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.md" index 704c9c55..c978cdcc 100644 --- "a/JavaKnowledge/JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.md" +++ "b/JavaKnowledge/JVM\345\236\203\345\234\276\345\233\236\346\224\266\346\234\272\345\210\266.md" @@ -1,6 +1,6 @@ # JVM垃圾回收机制 -[Java内存模型](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md)如下图所示,**堆和方法区是所有线程共有的**,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。 +[Java内存模型](./JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md)如下图所示,**堆和方法区是所有线程共有的**,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。 ![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/jvm.png) @@ -417,10 +417,3 @@ NUMA 是一种多核服务器的架构,简单来讲,一个多核服务器( 参考: - [一文看懂 JVM 内存布局及 GC 原理](https://www.infoq.cn/article/3WyReTKqrHIvtw4frmr3) - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/JavaKnowledge/JVM\346\236\266\346\236\204.md" "b/JavaKnowledge/JVM\346\236\266\346\236\204.md" index 33da8edb..b1e48b8d 100644 --- "a/JavaKnowledge/JVM\346\236\266\346\236\204.md" +++ "b/JavaKnowledge/JVM\346\236\266\346\236\204.md" @@ -148,7 +148,7 @@ Hotspot虚拟机的对象头包括两部分信息,第一部分用于存储对 然后,对于每个已加载的.class文件,它都会按照java.lang包中的定义,恰好创建一个Class对象来表示堆内存中的文件。稍后,在我们的代码中,可以使用此Class对象读取类级别的信息(类名称,父名称,方法,变量信息,静态变量等)。 -[具体可参考Java内存模型](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md) +[具体可参考Java内存模型](./JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md) @@ -195,7 +195,7 @@ Hotspot虚拟机的对象头包括两部分信息,第一部分用于存储对 ### Garbage Collector (GC) -只要引用了一个对象,JVM就会认为它是活动的。一旦不再引用对象,因此应用程序代码无法访问该对象,则垃圾收集器将其删除并回收未使用的内存。通常,垃圾回收是在后台进行的,但是我们可以通过调用System.gc()方法来触发垃圾回收(同样,无法保证执行。因此,请调用Thread.sleep(1000)并等待GC完成)。[具体内存回收部分请看JVM垃圾回收机制](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md) +只要引用了一个对象,JVM就会认为它是活动的。一旦不再引用对象,因此应用程序代码无法访问该对象,则垃圾收集器将其删除并回收未使用的内存。通常,垃圾回收是在后台进行的,但是我们可以通过调用System.gc()方法来触发垃圾回收(同样,无法保证执行。因此,请调用Thread.sleep(1000)并等待GC完成)。[具体内存回收部分请看JVM垃圾回收机制](./JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md) diff --git "a/JavaKnowledge/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" "b/JavaKnowledge/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" index 586f63be..184bdb7e 100644 --- "a/JavaKnowledge/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" +++ "b/JavaKnowledge/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" @@ -1689,8 +1689,4 @@ Java基础面试题 return sbf.toString(); } } - ``` - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file + ``` \ No newline at end of file diff --git "a/JavaKnowledge/Java\345\271\266\345\217\221\347\274\226\347\250\213\344\271\213\345\216\237\345\255\220\346\200\247\343\200\201\345\217\257\350\247\201\346\200\247\344\273\245\345\217\212\346\234\211\345\272\217\346\200\247.md" "b/JavaKnowledge/Java\345\271\266\345\217\221\347\274\226\347\250\213\344\271\213\345\216\237\345\255\220\346\200\247\343\200\201\345\217\257\350\247\201\346\200\247\344\273\245\345\217\212\346\234\211\345\272\217\346\200\247.md" index 1f3a021f..623227ce 100644 --- "a/JavaKnowledge/Java\345\271\266\345\217\221\347\274\226\347\250\213\344\271\213\345\216\237\345\255\220\346\200\247\343\200\201\345\217\257\350\247\201\346\200\247\344\273\245\345\217\212\346\234\211\345\272\217\346\200\247.md" +++ "b/JavaKnowledge/Java\345\271\266\345\217\221\347\274\226\347\250\213\344\271\213\345\216\237\345\255\220\346\200\247\343\200\201\345\217\257\350\247\201\346\200\247\344\273\245\345\217\212\346\234\211\345\272\217\346\200\247.md" @@ -161,11 +161,4 @@ doSomethingwithconfig(context); 上面代码中,由于语句1和语句2没有数据依赖性,因此可能会被重排序。假如发生了重排序,在线程1执行过程中先执行语句2,而此时线程2会以为初始化工作已经完成, 那么就会跳出while循环,去执行doSomethingwithconfig(context)方法,而此时context并没有被初始化,就会导致程序出错。 从上面可以看出,指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。也就是说,要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。 - - - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/MD5\345\212\240\345\257\206.md" "b/JavaKnowledge/MD5\345\212\240\345\257\206.md" index 0d2b6bce..ddb42279 100644 --- "a/JavaKnowledge/MD5\345\212\240\345\257\206.md" +++ "b/JavaKnowledge/MD5\345\212\240\345\257\206.md" @@ -34,7 +34,3 @@ public class MD5Utils { } } ``` - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/JavaKnowledge/MVC\344\270\216MVP\345\217\212MVVM.md" "b/JavaKnowledge/MVC\344\270\216MVP\345\217\212MVVM.md" index 428ac290..3638823b 100644 --- "a/JavaKnowledge/MVC\344\270\216MVP\345\217\212MVVM.md" +++ "b/JavaKnowledge/MVC\344\270\216MVP\345\217\212MVVM.md" @@ -78,9 +78,4 @@ MVVM模式将Presener改名为View Model,基本上与MVP模式完全一致, - 可重用性。 - 独立开发。 - 可测试。 - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/RMB\345\244\247\345\260\217\345\206\231\350\275\254\346\215\242.md" "b/JavaKnowledge/RMB\345\244\247\345\260\217\345\206\231\350\275\254\346\215\242.md" index 90aea47f..ee7ef30c 100644 --- "a/JavaKnowledge/RMB\345\244\247\345\260\217\345\206\231\350\275\254\346\215\242.md" +++ "b/JavaKnowledge/RMB\345\244\247\345\260\217\345\206\231\350\275\254\346\215\242.md" @@ -24,8 +24,3 @@ public class RenMingBi { } } ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/JavaKnowledge/Top-K\351\227\256\351\242\230.md" "b/JavaKnowledge/Top-K\351\227\256\351\242\230.md" index 4acb0c67..d85ad645 100644 --- "a/JavaKnowledge/Top-K\351\227\256\351\242\230.md" +++ "b/JavaKnowledge/Top-K\351\227\256\351\242\230.md" @@ -43,7 +43,7 @@ Top-K问题 堆排序也是一个比较好的选择,可以维护一个大小为`k`的堆,时间复杂度为`O(nlogk)`。 -那是否还存在更有效的方法呢?受到[快速排序](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%85%AB%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md)的启发, +那是否还存在更有效的方法呢?受到[快速排序](./JavaKnowledge/%E5%85%AB%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md)的启发, 通过修改快速排序中主元的选取方法可以降低快速排序在最坏情况下的时间复杂度(即`BFPRT`算法). 并且我们的目的只是求出前`k`,故递归的规模变小,速度也随之提高。下面来简单回顾下快速排序的过程,以升序为例: @@ -393,9 +393,4 @@ public class BFPRT { System.out.println("第10小的数: " + getMinKthByBFPRT(arr, 10)); } } -``` - - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/JavaKnowledge/Vim\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/JavaKnowledge/Vim\344\275\277\347\224\250\346\225\231\347\250\213.md" index eef7b2d9..9ab4d179 100644 --- "a/JavaKnowledge/Vim\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/JavaKnowledge/Vim\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -105,16 +105,4 @@ Vim使用教程 - `:saveas ` 另存为 - `:e filename` 打开文件 - `:sav filename` 保存为某文件名 - - - - - - - - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/hashCode\344\270\216equals.md" "b/JavaKnowledge/hashCode\344\270\216equals.md" index 75bf9067..9e7d2bb2 100644 --- "a/JavaKnowledge/hashCode\344\270\216equals.md" +++ "b/JavaKnowledge/hashCode\344\270\216equals.md" @@ -18,8 +18,4 @@ hashCode与equals 上面说的对象相同指的是用`eqauls`方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在`Set`集合中。同时,增加新元素的效率会大大下降。 ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/volatile\345\222\214Synchronized\345\214\272\345\210\253.md" "b/JavaKnowledge/volatile\345\222\214Synchronized\345\214\272\345\210\253.md" index 9dd6ce0a..d8618d81 100644 --- "a/JavaKnowledge/volatile\345\222\214Synchronized\345\214\272\345\210\253.md" +++ "b/JavaKnowledge/volatile\345\222\214Synchronized\345\214\272\345\210\253.md" @@ -284,15 +284,7 @@ Monitor其实是一种同步工具,也可以说是一种同步机制,它通 参考: - [再有人问你Java内存模型是什么,就把这篇文章发给他](https://www.hollischuang.com/archives/2550) -- [原子性、可见性以及有序性](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%8E%9F%E5%AD%90%E6%80%A7%E3%80%81%E5%8F%AF%E8%A7%81%E6%80%A7%E4%BB%A5%E5%8F%8A%E6%9C%89%E5%BA%8F%E6%80%A7.md) - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - +- [原子性、可见性以及有序性](./JavaKnowledge/%E5%8E%9F%E5%AD%90%E6%80%A7%E3%80%81%E5%8F%AF%E8%A7%81%E6%80%A7%E4%BB%A5%E5%8F%8A%E6%9C%89%E5%BA%8F%E6%80%A7.md) diff --git "a/JavaKnowledge/\345\205\253\347\247\215\346\216\222\345\272\217\347\256\227\346\263\225.md" "b/JavaKnowledge/\345\205\253\347\247\215\346\216\222\345\272\217\347\256\227\346\263\225.md" index 30e2a723..51c23823 100644 --- "a/JavaKnowledge/\345\205\253\347\247\215\346\216\222\345\272\217\347\256\227\346\263\225.md" +++ "b/JavaKnowledge/\345\205\253\347\247\215\346\216\222\345\272\217\347\256\227\346\263\225.md" @@ -577,9 +577,5 @@ public static void main(String[] args) { ![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/sort_list_compare.png?raw=true) - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\212).md" "b/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\212).md" index 9220e3c9..df57d76e 100644 --- "a/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\212).md" +++ "b/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\212).md" @@ -1240,11 +1240,3 @@ } } ``` - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - diff --git "a/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\213).md" "b/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\213).md" index 4df119ef..8e20a153 100644 --- "a/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\213).md" +++ "b/JavaKnowledge/\345\211\221\346\214\207Offer(\344\270\213).md" @@ -126,8 +126,5 @@ --- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/\345\212\250\346\200\201\344\273\243\347\220\206.md" "b/JavaKnowledge/\345\212\250\346\200\201\344\273\243\347\220\206.md" index e8c1277f..0abd5f8f 100644 --- "a/JavaKnowledge/\345\212\250\346\200\201\344\273\243\347\220\206.md" +++ "b/JavaKnowledge/\345\212\250\346\200\201\344\273\243\347\220\206.md" @@ -1,7 +1,7 @@ 动态代理 === -有关代理模式已经动态代理和静态代理的区别请查看另一篇文章[设计模式](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) +有关代理模式已经动态代理和静态代理的区别请查看另一篇文章[设计模式](./JavaKnowledge/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) 刚毕业的时候在学习`android`时看到过[张孝祥老师的Java高新技术](http://yun.itheima.com/course/5.html),里面 讲到了动态代理,当时看完后感觉懂了.但是现在全部都忘了。 @@ -384,11 +384,3 @@ return proxyClass; - [Proxy源码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/reflect/Proxy.java) - - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/JavaKnowledge/\345\215\225\344\276\213\347\232\204\346\234\200\344\275\263\345\256\236\347\216\260\346\226\271\345\274\217.md" "b/JavaKnowledge/\345\215\225\344\276\213\347\232\204\346\234\200\344\275\263\345\256\236\347\216\260\346\226\271\345\274\217.md" index 53743211..84135535 100644 --- "a/JavaKnowledge/\345\215\225\344\276\213\347\232\204\346\234\200\344\275\263\345\256\236\347\216\260\346\226\271\345\274\217.md" +++ "b/JavaKnowledge/\345\215\225\344\276\213\347\232\204\346\234\200\344\275\263\345\256\236\347\216\260\346\226\271\345\274\217.md" @@ -18,9 +18,4 @@ public class Singleton { return SingletonHolder.INSTANCE; } } -``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/JavaKnowledge/\345\270\270\347\224\250\345\221\275\344\273\244\350\241\214\345\244\247\345\205\250.md" "b/JavaKnowledge/\345\270\270\347\224\250\345\221\275\344\273\244\350\241\214\345\244\247\345\205\250.md" index 53efd6b1..de907f96 100644 --- "a/JavaKnowledge/\345\270\270\347\224\250\345\221\275\344\273\244\350\241\214\345\244\247\345\205\250.md" +++ "b/JavaKnowledge/\345\270\270\347\224\250\345\221\275\344\273\244\350\241\214\345\244\247\345\205\250.md" @@ -511,12 +511,4 @@ ifconfig [网络设备] [参数] - - - - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - diff --git "a/JavaKnowledge/\345\274\272\345\274\225\347\224\250\343\200\201\350\275\257\345\274\225\347\224\250\343\200\201\345\274\261\345\274\225\347\224\250\343\200\201\350\231\232\345\274\225\347\224\250.md" "b/JavaKnowledge/\345\274\272\345\274\225\347\224\250\343\200\201\350\275\257\345\274\225\347\224\250\343\200\201\345\274\261\345\274\225\347\224\250\343\200\201\350\231\232\345\274\225\347\224\250.md" index 769efa0b..f77e3614 100644 --- "a/JavaKnowledge/\345\274\272\345\274\225\347\224\250\343\200\201\350\275\257\345\274\225\347\224\250\343\200\201\345\274\261\345\274\225\347\224\250\343\200\201\350\231\232\345\274\225\347\224\250.md" +++ "b/JavaKnowledge/\345\274\272\345\274\225\347\224\250\343\200\201\350\275\257\345\274\225\347\224\250\343\200\201\345\274\261\345\274\225\347\224\250\343\200\201\350\231\232\345\274\225\347\224\250.md" @@ -68,14 +68,4 @@ -![](https://raw.githubusercontent.com/CharonChui/Pictures/master/reference_compare.jpg) - - - - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +![](https://raw.githubusercontent.com/CharonChui/Pictures/master/reference_compare.jpg) \ No newline at end of file diff --git "a/JavaKnowledge/\346\225\260\346\215\256\345\212\240\345\257\206\345\217\212\350\247\243\345\257\206.md" "b/JavaKnowledge/\346\225\260\346\215\256\345\212\240\345\257\206\345\217\212\350\247\243\345\257\206.md" index fa29a7b1..86ccf57c 100644 --- "a/JavaKnowledge/\346\225\260\346\215\256\345\212\240\345\257\206\345\217\212\350\247\243\345\257\206.md" +++ "b/JavaKnowledge/\346\225\260\346\215\256\345\212\240\345\257\206\345\217\212\350\247\243\345\257\206.md" @@ -57,9 +57,5 @@ - 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。 - 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥, 然后双方可以使用对称加密来进行沟通。 - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/JavaKnowledge/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/JavaKnowledge/\346\225\260\346\215\256\347\273\223\346\236\204.md" index b3f671cc..66dafc7d 100644 --- "a/JavaKnowledge/\346\225\260\346\215\256\347\273\223\346\236\204.md" +++ "b/JavaKnowledge/\346\225\260\346\215\256\347\273\223\346\236\204.md" @@ -282,29 +282,4 @@ private boolean isRed(Node x){ 缺点: -- 有些算法慢且复杂 - - - - - - - - - - - - - - - - - - - - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - +- 有些算法慢且复杂 \ No newline at end of file diff --git "a/JavaKnowledge/\346\255\273\351\224\201.md" "b/JavaKnowledge/\346\255\273\351\224\201.md" index b2a9ede4..f98b8e3c 100644 --- "a/JavaKnowledge/\346\255\273\351\224\201.md" +++ "b/JavaKnowledge/\346\255\273\351\224\201.md" @@ -53,8 +53,3 @@ class PrintRunnable implements Runnable { } } ``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/JavaKnowledge/\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205.md" "b/JavaKnowledge/\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205.md" index cc64c4ae..d3698ae6 100644 --- "a/JavaKnowledge/\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205.md" +++ "b/JavaKnowledge/\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205.md" @@ -196,9 +196,4 @@ class Consumer implements Runnable { } } } -``` - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +``` \ No newline at end of file diff --git "a/JavaKnowledge/\347\256\227\346\263\225\347\232\204\345\244\215\346\235\202\345\272\246.md" "b/JavaKnowledge/\347\256\227\346\263\225\347\232\204\345\244\215\346\235\202\345\272\246.md" index 341bdff2..4f2b250f 100644 --- "a/JavaKnowledge/\347\256\227\346\263\225\347\232\204\345\244\215\346\235\202\345\272\246.md" +++ "b/JavaKnowledge/\347\256\227\346\263\225\347\232\204\345\244\215\346\235\202\345\272\246.md" @@ -170,10 +170,3 @@ O(2的`n`次方) 比如求具有`n`个元素集合的所有子集的算法 对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差, 即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。 另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。 - - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/JavaKnowledge/\347\272\277\347\250\213\346\261\240\347\256\200\344\273\213.md" "b/JavaKnowledge/\347\272\277\347\250\213\346\261\240\347\256\200\344\273\213.md" index 1ec4f548..0684d4bf 100644 --- "a/JavaKnowledge/\347\272\277\347\250\213\346\261\240\347\256\200\344\273\213.md" +++ "b/JavaKnowledge/\347\272\277\347\250\213\346\261\240\347\256\200\344\273\213.md" @@ -261,8 +261,5 @@ public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) - `shutdown()`:不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务 - `shutdownNow()`:立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务 ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! diff --git "a/JavaKnowledge/\347\275\221\347\273\234\350\257\267\346\261\202\347\233\270\345\205\263\345\206\205\345\256\271\346\200\273\347\273\223.md" "b/JavaKnowledge/\347\275\221\347\273\234\350\257\267\346\261\202\347\233\270\345\205\263\345\206\205\345\256\271\346\200\273\347\273\223.md" index cc7e9c2c..0d0da5e9 100644 --- "a/JavaKnowledge/\347\275\221\347\273\234\350\257\267\346\261\202\347\233\270\345\205\263\345\206\205\345\256\271\346\200\273\347\273\223.md" +++ "b/JavaKnowledge/\347\275\221\347\273\234\350\257\267\346\261\202\347\233\270\345\205\263\345\206\205\345\256\271\346\200\273\347\273\223.md" @@ -208,9 +208,5 @@ - http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 - http的连接很简单,是无状态的 - HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全 - ----- -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/JavaKnowledge/\350\216\267\345\217\226\344\273\212\345\220\216\345\244\232\345\260\221\345\244\251\345\220\216\347\232\204\346\227\245\346\234\237.md" "b/JavaKnowledge/\350\216\267\345\217\226\344\273\212\345\220\216\345\244\232\345\260\221\345\244\251\345\220\216\347\232\204\346\227\245\346\234\237.md" index 773bd565..5f9e3a11 100644 --- "a/JavaKnowledge/\350\216\267\345\217\226\344\273\212\345\220\216\345\244\232\345\260\221\345\244\251\345\220\216\347\232\204\346\227\245\346\234\237.md" +++ "b/JavaKnowledge/\350\216\267\345\217\226\344\273\212\345\220\216\345\244\232\345\260\221\345\244\251\345\220\216\347\232\204\346\227\245\346\234\237.md" @@ -28,8 +28,4 @@ private static String getClosingDate(int year, int month, int day) { } return dateFormat.format(closingDate); } -``` ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file +``` \ No newline at end of file diff --git "a/JavaKnowledge/\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/JavaKnowledge/\350\256\276\350\256\241\346\250\241\345\274\217.md" index 4b2d8e72..196d4501 100644 --- "a/JavaKnowledge/\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/JavaKnowledge/\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -1851,11 +1851,4 @@ public static void main(String[] args) { // 输出:3 } ``` -基本就这样,解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等! - - ---- -- 邮箱 :charon.chui@gmail.com -- Good Luck! - - +基本就这样,解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等! \ No newline at end of file diff --git "a/Jetpack/Jetpack\347\256\200\344\273\213.md" "b/Jetpack/Jetpack\347\256\200\344\273\213.md" index e29d72c2..5f46a356 100644 --- "a/Jetpack/Jetpack\347\256\200\344\273\213.md" +++ "b/Jetpack/Jetpack\347\256\200\344\273\213.md" @@ -11,7 +11,7 @@ JetPack是Google推出的一些库的集合。是Android基础支持库SDK以外 - Fragment是在Android 3.0更新的。 - Material Design组件是在Android 5.0上更新的 但是由于Android用户庞大,每一次Android更新都无法覆盖所有用户的,同时因为手机厂商众多,但支持有限,也无法为自己生产的所有设备保持迭代到最新的Android版本,所以用户所持有的设备上Android版本是层次不齐的。 -从技术的角度来说,因为用户的设备版本不一致,导致Android工程师在维护项目的时候,会遇到很多难以解决的问题。为了解决这些由于Android版本不一致而出现的兼容性问题,Google推出了Support库。 +从技术的角度来说,因为用户的设备版本不一致,导致Android工程师在维护项目的时候,会遇到很多难以解决的问题。**为了解决这些由于Android版本不一致而出现的兼容性问题,Google推出了Support库。** Support库是针对Framework API的补充,Framework API跟随每一个Android版本所发布,和设备具有强关联性,Support API是开发者自主集成的,最终会包含在我们所发布的应用中,这样我们就可以在最新的Android版本上进行应用的开发,同时使用Support API解决各种潜在的兼容性问题,帮助开发者在不同Android版本的设备上实现行为一致的工作代码。 @@ -30,18 +30,20 @@ Support库是针对Framework API的补充,Framework API跟随每一个Android ### Android X 从Goole IO 2017开始。Google开始推出Architecture Component,ORM库Room,用户生命周期管理的ViewModel/LiveData. -Goole IO 2018将Support lib更名为androidx.将许多Google认为是正确的方案和实践集中起来。可以说AndroidX的出现就是为了解决长久以来Support库混乱的问题,你也可以把AndroidX理解为更强大的Support库。 +**Goole IO 2018将Support lib更名为androidx**.将许多Google认为是正确的方案和实践集中起来。可以说**AndroidX的出现就是为了解决长久以来Support库混乱的问题,你也可以把AndroidX理解为更强大的Support库。*** AndroidX将原有的Support库拆分为85个大大小小的支持库,抛弃了之前与API最低支持相关联的版本命名规范,重置为1.0.0,并且每一个库在之后都会按照严格的语义版本控制规则进行版本控制。 同时通过组合依赖的方式,我们可以选择自己需要的组件库,而不是像Support一样全部依赖,一定程度上也减小了应用的体积。 -很重要的一点,就是它不会随着特定的Android版本而更新,它是由开发者自主控制,同时包含在我们所发布的应用程序中。 +很重要的一点,就是**它不会随着特定的Android版本而更新,它是由开发者自主控制,同时包含在我们所发布的应用程序**中。 以上种种,现在统称为JetPack. Jetpack的出现是为了彻底解决这两个致命的问题: 1. Support 库版本增长混乱 2. Support 库重复依赖 + 如果Jetpack仅仅是针对Support库的重构,那它并没有了不起的,因为这只是Google解决了它自身因为历史原因所产生的代码问题。 -更重要的是Jetpack为大家提供了一系列的最佳实践,包含:架构、数据处理、后台任务处理、动画、UI 各个方面,无需纠结于各种因为Android本身而出现的问题,而是让我们把更多的精力放在业务需求的实现上,这才是Jetpack真正了不起的地方。其最核心的出发点就是帮助开发者快速构建出稳定、高性能、测试友好同时向后兼容的APP。 + +更重要的是Jetpack为大家提供了一系列的最佳实践,包含:架构、数据处理、后台任务处理、动画、UI 各个方面,无需纠结于各种因为Android本身而出现的问题,而是让我们把更多的精力放在业务需求的实现上,这才是Jetpack真正了不起的地方。**其最核心的出发点就是帮助开发者快速构建出稳定、高性能、测试友好同时向后兼容的APP。** Jetpack相当于Google把自己的Android生态重新整理了一番。确立了Android未来的版图和大方向。 @@ -56,58 +58,59 @@ Jetpack相当于Google把自己的Android生态重新整理了一番。确立了 ### Foundation(基础组件): 基础组件提供了横向功能,例如向后兼容性、测试以及Kotlin语言的支持。它包含如下组件库: - Android KTX:Android KTX 是一组 Kotlin 扩展程序,它优化了供Kotlin使用的Jetpack和Android平台的API。以更简洁、更愉悦、更惯用的方式使用Kotlin进行Android开发。 -- AppCompat:提供了一系列以AppCompat开头的API,以便兼容低版本的Android开发。Jetpack基础中的AppCompat库包含v7库中的所有组件([支持库软件包](https://developer.android.com/topic/libraries/support-library/packages#v7-appcompat))。 其中包括AppCompat,Cardview,GridLayout,MediaRouter,Palette,RecyclerView,Renderscript,Preferences,Leanback,Vector Drawable,Design,Custom选项卡等。此外,该库为材质设计用户界面提供了实现支持,这使得AppCompat对 开发人员。 以下是android应用程序的一些关键领域,这些领域很难构建,但是可以使用AppCompat库轻松进行设计: 一般都是为了兼容 Android L以下版本,来提供Material Design的效果: +- **AppCompat**:提供了一系列以AppCompat开头的API,以便兼容低版本的Android开发。Jetpack基础中的AppCompat库包含v7库中的所有组件([支持库软件包](https://developer.android.com/topic/libraries/support-library/packages#v7-appcompat))。 其中包括AppCompat,Cardview,GridLayout,MediaRouter,Palette,RecyclerView,Renderscript,Preferences,Leanback,Vector Drawable,Design,Custom选项卡等。此外,该库为材质设计用户界面提供了实现支持,这使得AppCompat对 开发人员。 以下是android应用程序的一些关键领域,这些领域很难构建,但是可以使用AppCompat库轻松进行设计: 一般都是为了兼容 Android L以下版本,来提供Material Design的效果: - Toolbar - ContextCompat - AppCompatDialog - annotation:注解,提升代码可读性,内置了Android中常用的注解 -- Multidex(多Dex处理):为方法数超过 64K 的应用启用多 dex 文件。Security(安全):按照安全最佳做法读写加密文件和共享偏好设置。 +- Multidex(多Dex处理):为方法数超过 64K 的应用启用多 dex 文件。 +- Security(安全):按照安全最佳做法读写加密文件和共享偏好设置。 - Test(测试):用于单元和运行时界面测试的 Android 测试框架。 ### Architecture(架构组件) 架构组件可帮助开发者设计稳健、可测试且易维护的应用。它包含如下组件库: -- Data Binding(数据绑定):数据绑定库是一种支持库,借助该库,可以使用声明式将布局中的界面组件绑定到应用中的数据源。 -- Lifecycles:方便管理Activity和Fragment生命周期,帮助开发者书写更轻量、易于维护的代码。 -- ViewModel:以生命周期感知的方式存储和管理与UI相关的数据。 -- LiveData:是一个可观察的数据持有者类。与常规observable不同,LiveData是有生命周期感知的。 -- Navigation:处理应用内导航所需的一切。 -- Paging:帮助开发者一次加载和显示小块数据。按需加载部分数据可减少网络带宽和系统资源的使用。 -- Room:Room持久性库在SQLite上提供了一个抽象层,帮助开发者更友好、流畅的访问SQLite数据库。 -- WorkManager:即使应用程序退出或设备重新启动,也可以轻松地调度预期将要运行的可延迟异步任务。 -- hilt:基于Dagger的Android依赖注入框架绑定View和Model -- startup:自动处理依赖初始化 -- datastore:Preferences的替代类,支持异步、更加安全 +- Data Binding(数据绑定) : 数据绑定库是一种支持库,借助该库,可以使用声明式将布局中的界面组件绑定到应用中的数据源。 +- Lifecycles : 方便管理Activity和Fragment生命周期,帮助开发者书写更轻量、易于维护的代码。 +- ViewModel : 以生命周期感知的方式存储和管理与UI相关的数据。 +- LiveData : 是一个可观察的数据持有者类。与常规observable不同,LiveData是有生命周期感知的。 +- Navigation : 处理应用内导航所需的一切。 +- Paging :帮助开发者一次加载和显示小块数据。按需加载部分数据可减少网络带宽和系统资源的使用。 +- Room :Room持久性库在SQLite上提供了一个抽象层,帮助开发者更友好、流畅的访问SQLite数据库。 +- WorkManager :即使应用程序退出或设备重新启动,也可以轻松地调度预期将要运行的可延迟异步任务。 +- hilt : 基于Dagger的Android依赖注入框架绑定View和Model +- startup : 自动处理依赖初始化 +- datastore : Preferences的替代类,支持异步、更加安全 ### Behavior(行为组件) 行为组件可帮助开发者的应用与标准Android服务(如通知、权限、分享和Google助理)相集成。它包含如下组件库: -- CameraX:帮助开发者简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。 -- DownloadManager下载管理器:可处理长时间运行的HTTP下载,并在出现故障或在连接更改和系统重新启动后重试下载。 -- Media & playback(媒体&播放):用于媒体播放和路由(包括 Google Cast)的向后兼容 API。 -- Notifications(通知):提供向后兼容的通知 API,支持 Wear 和 Auto。 -- Permissions(权限):用于检查和请求应用权限的兼容性 API。 -- Preferences(偏好设置):提供了用户能够改变应用的功能和行为能力。 -- Sharing(共享):提供适合应用操作栏的共享操作。 -- Slices(切片):创建可在应用外部显示应用数据的灵活界面元素。 +- CameraX :帮助开发者简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。 +- DownloadManager下载管理器 : 可处理长时间运行的HTTP下载,并在出现故障或在连接更改和系统重新启动后重试下载。 +- Media & playback(媒体&播放) : 用于媒体播放和路由(包括 Google Cast)的向后兼容 API。 +- Notifications(通知) : 提供向后兼容的通知 API,支持 Wear 和 Auto。 +- Permissions(权限) : 用于检查和请求应用权限的兼容性 API。 +- Preferences(偏好设置) : 提供了用户能够改变应用的功能和行为能力。 +- Sharing(共享) : 提供适合应用操作栏的共享操作。 +- Slices(切片) : 创建可在应用外部显示应用数据的灵活界面元素。 ### UI(界面组件) 大多数的UI组件其实都包含在基础组件中的appcompat中,这里是一些独立组件库存在的UI组件,界面组件可提供各类view和辅助程序,让应用不仅简单易用,还能带来愉悦体验。它包含如下组件库: -- drawerlayout:抽屉布局 -- recyclerview:可复用的滑动列表 -- constraintlayout:约束布局 +- drawerlayout : 抽屉布局 +- recyclerview : 可复用的滑动列表 +- constraintlayout : 约束布局 - compose*: Jetpack compose声明式UI -- coordinatorlayout:顶层布局继承自Framelayout,可以实现子View之间的联动交互效果 -- swiperefreshlayout:下拉刷新布局 -- viewpager2:分页布局 +- coordinatorlayout : 顶层布局继承自Framelayout,可以实现子View之间的联动交互效果 +- swiperefreshlayout : 下拉刷新布局 +- viewpager2 : 分页布局 - Material Design Components * : MD组件 -- Animation & Transitions(动画&过度):提供各类内置动画,也可以自定义动画效果。 +- Animation & Transitions(动画&过度) :提供各类内置动画,也可以自定义动画效果。 - Emoji(表情符号):使用户在未更新系统版本的情况下也可以使用表情符号。 - EmojiTextView - EmojiEditTExt - EmojiButton -- Fragment:组件化界面的基本单位。 -- Layout(布局):xml书写的界面布局或者使用Compose完成的界面。 +- Fragment :组件化界面的基本单位。 +- Layout(布局) :xml书写的界面布局或者使用Compose完成的界面。 用户界面结构(如应用程序的活动)由Layout定义。 它定义了View和ViewGroup对象。 可以通过两种方式创建View和ViewGroup:通过以XML声明UI元素或通过编写代码(即以编程方式)。 Jetpack的这一部分涵盖了一些最常见的布局,例如LinearLayout,RelativeLayout和全新的ConstraintLayout。 而且,官方的Jetpack布局文档提供了一些指导,以使用RecyclerView创建项目列表以及使用CardView创建卡布局。 用户可以看到一个视图。 EditView,TextView和Button是View的示例。 另一方面,ViewGroup是一个容器对象,它定义了View的布局结构,因此它是不可见的。 ViewGroup的示例是LinearLayout,RelativeLayout和ConstraintLayout。 - Palette(调色板):从调色板中提取出有用的信息。 @@ -117,12 +120,12 @@ Jetpack相当于Google把自己的Android生态重新整理了一番。确立了 [Android Jetpack Compose](https://developer.android.com/jetpack/compose)是2019 Google/IO大会上推出的一种声明式的UI开发框架,经过一年左右的演进,现在到了alpha阶段。Jetpack Compose是用于构建原生界面的新款Android工具包。它可简化并加快Android上的界面开发。使用更少的代码、强大的工具和直观的KotlinAPI,快速让应用生动而精彩,从此不再需要写xml,使用声明式的Compose函数来构建页面UI。 Compose由androidx中的6个Maven组ID构成。每个组都包含一套特定用途的功能,并各有专属的版本说明。下表介绍了各个组及指向其版本说明的链接: -- compose.animation:在Jetpack Compose应用中构建动画,丰富用户的体验。 -- compose.compiler:借助Kotlin编译器插件,转换@Composable functions(可组合函数)并启用优化功能。 -- compose.foundation:使用现成可用的构建块编写Jetpack Compose应用,还可扩展Foundation以构建您自己的设计系统元素。 -- compose.material:使用现成可用的Material Design组件构建Jetpack Compose UI。这是更高层级的Compose入口点,旨在提供与www.material.io上描述的组件一致的组件。 -- compose.runtime:Compose的编程模型和状态管理的基本构建块,以及Compose编译器插件针对的核心运行时。 -- compose.ui:与设备互动所需的Compose UI的基本组件,包括布局、绘图和输入。 +- compose.animation : 在Jetpack Compose应用中构建动画,丰富用户的体验。 +- compose.compiler : 借助Kotlin编译器插件,转换@Composable functions(可组合函数)并启用优化功能。 +- compose.foundation : 使用现成可用的构建块编写Jetpack Compose应用,还可扩展Foundation以构建您自己的设计系统元素。 +- compose.material : 使用现成可用的Material Design组件构建Jetpack Compose UI。这是更高层级的Compose入口点,旨在提供与www.material.io上描述的组件一致的组件。 +- compose.runtime:Compose 的编程模型和状态管理的基本构建块,以及Compose编译器插件针对的核心运行时。 +- compose.ui : 与设备互动所需的Compose UI的基本组件,包括布局、绘图和输入。 ```kotlin class MainActivity : AppCompatActivity() { overridefun onCreate(savedInstanceState: Bundle?) { diff --git "a/Jetpack/architecture/1.\347\256\200\344\273\213.md" "b/Jetpack/architecture/1.\347\256\200\344\273\213.md" index f64448a8..4af3fd37 100644 --- "a/Jetpack/architecture/1.\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/1.\347\256\200\344\273\213.md" @@ -6,8 +6,11 @@ 在大多数情况下,桌面应用程序在启动器快捷方式中有一个单一的入口并且作为单独的独立进程运行,与桌面应用程序不同的是`Android`应用具有更复杂的结构。一个典型的`Android`应用是由多个应用程序组件构成的,包括`activity`,`fragment`,`service`,`content provider`和`broadcast receiver`。 这些应用程序组件中的大部分声明在`manifest.xml`文件中,用来决定如何将应用融入到用户设备的整体体验中。尽管如前所述,传统的桌面应用程序作为独立进程运行,但是正确的编写`Android`应用程序需要更加灵活,因为用户会同过设备上不同的应用程序组织成自己的方式不断切换流程和任务。 + 例如,考虑下在你喜欢的社交网络应用中分享照片时会发生什么。该应用会触发一个启动相机的`intent`,从该`intent`会启动一个相机应用来处理这个请求。在此刻,用户离开社交网络应用但是用户的体验是无缝的。相机应用转而可能会触发其它的`intent`例如启动文件选择器,这可能会启动另一个应用。最终用户回到社交网络应用并且分享照片。此外,在这个过程中的任何时刻用户都有可能会被一个电话打断,并且在结束通话后再回来继续分享照片。 + 在`Android`中,这种应用切换行为很常见,所以你的应用程序必须正确处理这些流程。记住,移动设备的资源是有限的,所以在任何时候,操作系统都可能会杀死一些应用为新的应用腾出空间。 + 其中的重点是应用程序组件可能会被单独和无序的启动,并且可能会被用户或系统在任何时候销毁。因为应用程序组件是短暂的,并且其声明周期(什么时候被创建和销毁)不受你控制,所以不应该在应用程序组件中存储任何应用数据或状态,同时应用程序组件不应该相互依赖。 通用的框架准则官方建议在架构`App`的时候遵循以下两个准则: @@ -128,9 +131,4 @@ override fun onDestroy() { -- [下一篇:2.ViewBinding简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! ` \ No newline at end of file +- [下一篇:2.ViewBinding简介](./Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md) \ No newline at end of file diff --git "a/Jetpack/architecture/10.DataStore\347\256\200\344\273\213.md" "b/Jetpack/architecture/10.DataStore\347\256\200\344\273\213.md" index f465ab8b..e6c17663 100644 --- "a/Jetpack/architecture/10.DataStore\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/10.DataStore\347\256\200\344\273\213.md" @@ -351,8 +351,8 @@ https://blog.csdn.net/weixin_42324979/article/details/112650189?utm_medium=distr -- [上一篇:9.App Startup简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md) -- [下一篇:11.Hilt简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md) +- [上一篇:9.App Startup简介](./Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md) +- [下一篇:11.Hilt简介](./Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/11.Hilt\347\256\200\344\273\213.md" "b/Jetpack/architecture/11.Hilt\347\256\200\344\273\213.md" index 2d3164db..b08e5418 100644 --- "a/Jetpack/architecture/11.Hilt\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/11.Hilt\347\256\200\344\273\213.md" @@ -317,8 +317,8 @@ In case of **run-time** generation – use **Koin** over Kodein because it is si -- [上一篇:10.DataStore简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md) -- [下一篇:12.Navigation简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md) +- [上一篇:10.DataStore简介](./Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md) +- [下一篇:12.Navigation简介](./Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" "b/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" index dac4d75d..ed5b9553 100644 --- "a/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" @@ -479,8 +479,8 @@ override fun onCreate(savedInstanceState: Bundle?) { -- [上一篇:11.Hilt简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md) -- [下一篇:13.Jetpack MVVM简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md) +- [上一篇:11.Hilt简介](./Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md) +- [下一篇:13.Jetpack MVVM简介](./Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/13.Jetpack MVVM\347\256\200\344\273\213.md" "b/Jetpack/architecture/13.Jetpack MVVM\347\256\200\344\273\213.md" index 50a25fa1..5b0f76d1 100644 --- "a/Jetpack/architecture/13.Jetpack MVVM\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/13.Jetpack MVVM\347\256\200\344\273\213.md" @@ -40,8 +40,8 @@ ViewModel层 用于持有和UI元素相关的数据,以保证这些数据在 - [“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!](https://juejin.cn/post/6921321173661777933) -- [上一篇:12.Navigation简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md) -- [下一篇:14.findViewById的过去及未来](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/14.findViewById%E7%9A%84%E8%BF%87%E5%8E%BB%E5%8F%8A%E6%9C%AA%E6%9D%A5.md) +- [上一篇:12.Navigation简介](./Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md) +- [下一篇:14.findViewById的过去及未来](./Jetpack/architecture/14.findViewById%E7%9A%84%E8%BF%87%E5%8E%BB%E5%8F%8A%E6%9C%AA%E6%9D%A5.md) --- diff --git "a/Jetpack/architecture/14.findViewById\347\232\204\350\277\207\345\216\273\345\217\212\346\234\252\346\235\245.md" "b/Jetpack/architecture/14.findViewById\347\232\204\350\277\207\345\216\273\345\217\212\346\234\252\346\235\245.md" index fe29ca19..e969b709 100644 --- "a/Jetpack/architecture/14.findViewById\347\232\204\350\277\207\345\216\273\345\217\212\346\234\252\346\235\245.md" +++ "b/Jetpack/architecture/14.findViewById\347\232\204\350\277\207\345\216\273\345\217\212\346\234\252\346\235\245.md" @@ -23,6 +23,6 @@ https://medium.com/mobile-app-development-publication/how-android-access-view-it -- [上一篇:13.Jetpack MVVM简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md) +- [上一篇:13.Jetpack MVVM简介](./Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/architecture/2.ViewBinding\347\256\200\344\273\213.md" "b/Jetpack/architecture/2.ViewBinding\347\256\200\344\273\213.md" index 012cbdf1..410881ea 100644 --- "a/Jetpack/architecture/2.ViewBinding\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/2.ViewBinding\347\256\200\344\273\213.md" @@ -1,6 +1,6 @@ # 2.ViewBinding简介 -ViewBinding是Google在2019年I/O大会上公布的一款Android视图绑定工具,在Android Studio 3.6中添加的一个新功能,更准确的说,它是DataBinding的一个更轻量变体,为什么要使用View Binding呢?答案是性能。许多开发者使用Data Binding库来引用Layout XML中的视图,而忽略它的其他强大功能。相比来说,自动生成代码ViewBinding其实比DataBinding性能更好。但是传统的方式使用View Binding却不是很好,因为会有很多样板代码(垃圾代码)。 +ViewBinding是Google在2019年I/O大会上公布的一款Android视图绑定工具,在Android Studio 3.6中添加的一个新功能,**更准确的说,它是DataBinding的一个更轻量变体,为什么要使用View Binding呢?答案是性能。** 许多开发者使用Data Binding库来引用Layout XML中的视图,而忽略它的其他强大功能。相比来说,自动生成代码ViewBinding其实比DataBinding性能更好。但是传统的方式使用View Binding却不是很好,因为会有很多样板代码(垃圾代码)。 通过ViewBinding,你可以更轻松的编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个XML布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有ID的所有视图的直接引用。在大多数情况下,视图绑定会替代findViewById。 @@ -134,7 +134,7 @@ class TextAdapter( class TextViewHolder(val binding : ItemTextBinding) : RecyclerView.ViewHolder(binding.root) } ``` -#### includ +#### include ViewBinding同样可以被用于中。include又分为两种形式,一种是有标签的样式,一种是没有的。 没有标签的时候需要对include指定id,通过id来获取,例如: @@ -414,10 +414,5 @@ ViewBinding与DataBinding均会生成可用于直接引用视图的绑定类。 ## 目录 -- [上一篇:1.简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/1.%E7%AE%80%E4%BB%8B.md) -- [下一篇:3.Lifecycle简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md) - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! ` +- [上一篇:1.简介](./Jetpack/architecture/1.%E7%AE%80%E4%BB%8B.md) +- [下一篇:3.Lifecycle简介](./Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/architecture/3.Lifecycle\347\256\200\344\273\213.md" "b/Jetpack/architecture/3.Lifecycle\347\256\200\344\273\213.md" index 40ab61cf..8b7de1b6 100644 --- "a/Jetpack/architecture/3.Lifecycle\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/3.Lifecycle\347\256\200\344\273\213.md" @@ -948,8 +948,8 @@ private static void invokeMethodsForEvent(List handlers, -- [上一篇: 2.ViewBinding简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md) -- [下一篇: 4.ViewModel简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md) +- [上一篇: 2.ViewBinding简介](./Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md) +- [下一篇: 4.ViewModel简介](./Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" "b/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" index 7c8a3198..9f4de5c7 100644 --- "a/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" @@ -339,8 +339,8 @@ public class ViewModelStore { -- [上一篇: 3.Lifecycle简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md) -- [下一篇: 5.LiveData简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md) +- [上一篇: 3.Lifecycle简介](./Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md) +- [下一篇: 5.LiveData简介](./Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/5.LiveData\347\256\200\344\273\213.md" "b/Jetpack/architecture/5.LiveData\347\256\200\344\273\213.md" index 45363359..1fb02d3b 100644 --- "a/Jetpack/architecture/5.LiveData\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/5.LiveData\347\256\200\344\273\213.md" @@ -418,8 +418,8 @@ class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() { -- [上一篇: 4.ViewModel简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md) -- [下一篇: 6.DataBinding简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md) +- [上一篇: 4.ViewModel简介](./Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md) +- [下一篇: 6.DataBinding简介](./Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/architecture/6.DataBinding\347\256\200\344\273\213.md" "b/Jetpack/architecture/6.DataBinding\347\256\200\344\273\213.md" index e093432c..a9d0e334 100644 --- "a/Jetpack/architecture/6.DataBinding\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/6.DataBinding\347\256\200\344\273\213.md" @@ -11,8 +11,8 @@ https://developer.android.com/topic/libraries/data-binding -- [上一篇:5.LiveData简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md) -- [下一篇:7.Room简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md) +- [上一篇:5.LiveData简介](./Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md) +- [下一篇:7.Room简介](./Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/architecture/7.Room\347\256\200\344\273\213.md" "b/Jetpack/architecture/7.Room\347\256\200\344\273\213.md" index c5d92b14..2fc34c40 100644 --- "a/Jetpack/architecture/7.Room\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/7.Room\347\256\200\344\273\213.md" @@ -507,8 +507,8 @@ static final Migration MIGRATION_2_3 = new Migration(2, 3) { ``` -- [上一篇:6.DataBinding简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md) -- [下一篇:8.PagingLibrary简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md) +- [上一篇:6.DataBinding简介](./Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md) +- [下一篇:8.PagingLibrary简介](./Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/8.PagingLibrary\347\256\200\344\273\213.md" "b/Jetpack/architecture/8.PagingLibrary\347\256\200\344\273\213.md" index e6c0f804..a716571d 100644 --- "a/Jetpack/architecture/8.PagingLibrary\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/8.PagingLibrary\347\256\200\344\273\213.md" @@ -5,8 +5,8 @@ -- [上一篇:7.Room简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md) -- [下一篇:9.App Startup简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md) +- [上一篇:7.Room简介](./Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md) +- [下一篇:9.App Startup简介](./Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/architecture/9.App Startup\347\256\200\344\273\213.md" "b/Jetpack/architecture/9.App Startup\347\256\200\344\273\213.md" index bd7e22b7..21b1465e 100644 --- "a/Jetpack/architecture/9.App Startup\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/9.App Startup\347\256\200\344\273\213.md" @@ -23,7 +23,7 @@ class StApplication : Application() { } ``` -但是在之前[LeakCanary源码分析](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/LeakCanary%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md)的文章中曾经介绍过LeakCanary是如何做到不用任何一行Java代码就能实现监测内存泄露功能的。 这里我们回顾一下: +但是在之前[LeakCanary源码分析](./SourceAnalysis/LeakCanary%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md)的文章中曾经介绍过LeakCanary是如何做到不用任何一行Java代码就能实现监测内存泄露功能的。 这里我们回顾一下: ## How does LeakCanary get installed by only adding a dependency?[¶](https://square.github.io/leakcanary/faq/#how-does-leakcanary-get-installed-by-only-adding-a-dependency) @@ -601,8 +601,8 @@ public final class AppInitializer { -- [上一篇:8.PagingLibrary简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md) -- [下一篇:10.DataStore简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md) +- [上一篇:8.PagingLibrary简介](./Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md) +- [下一篇:10.DataStore简介](./Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md) --- diff --git "a/Jetpack/ui/material/1.MaterialToolbar\347\256\200\344\273\213.md" "b/Jetpack/ui/material/1.MaterialToolbar\347\256\200\344\273\213.md" index fde025c5..b371cfb2 100644 --- "a/Jetpack/ui/material/1.MaterialToolbar\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/1.MaterialToolbar\347\256\200\344\273\213.md" @@ -2,11 +2,11 @@ ### Actionbar简介 -从Android 3.0(API 11)开始,所有使用默认主题背景的Activity均使用ActionBar作为应用栏。不过,经过不同Android版本的演化,原生ActionBar的行为会有所不同,具体取决于设备用的是哪个版本的Android系统。所以Android提供了Toolbar,可以让这些功能在任何设备上保持一致。 所以,你应用使用支持库中的Toolbar来实现Activity的应用栏,来确保你的应用能在最大范围的设备上保持一致的行为。 - +从Android 3.0(API 11)开始,所有使用默认主题背景的Activity均使用ActionBar作为应用栏。不过,经过不同Android版本的演化,原生ActionBar的行为会有所不同,具体取决于设备用的是哪个版本的Android系统。所以**Android提供了Toolbar,可以让这些功能在任何设备上保持一致。** 所以,你应用使用支持库中的Toolbar来实现Activity的应用栏,来确保你的应用能在最大范围的设备上保持一致的行为。 在使用的时候你会发现除了androidx.appcompat.widget.Toolbar之后还有一个com.google.android.material.appbar.MaterialToolbar。 + MaterialToolbar is a Toolbar that implements certain Material features, such as elevation overlays for Dark Themes. @@ -26,7 +26,7 @@ MaterialToolbar is a Toolbar that implements certain Material features, such as ![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/material_color.png?raw=true) 里面没有`colorAccent`的颜色,唯独colorAccent这个属性比较难理解,它不是用来指定Checkbox等某一个按钮的颜色,而是更多表达了一个强调的意思,比如一些控件的选中状态也会使用colorAccent的颜色。 -- 确保Activity继承自AppCompatActivity +- **确保Activity继承自AppCompatActivity** - 在布局文件中进行声明 menu的实现如下: @@ -281,4 +281,4 @@ class MainActivity : BaseActivity() { -- [下一篇:2.NavigationView简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md) +- [下一篇:2.NavigationView简介](./Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/2.NavigationView\347\256\200\344\273\213.md" "b/Jetpack/ui/material/2.NavigationView\347\256\200\344\273\213.md" index be8958c4..332e32ac 100644 --- "a/Jetpack/ui/material/2.NavigationView\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/2.NavigationView\347\256\200\344\273\213.md" @@ -196,5 +196,5 @@ menu_navigation.xml如下: -- [上一篇:1.MaterialToolbar简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/1.MaterialToolbar%E7%AE%80%E4%BB%8B.md) -- [下一篇:3.NestedScrollView简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md) +- [上一篇:1.MaterialToolbar简介](./Jetpack/ui/material/1.MaterialToolbar%E7%AE%80%E4%BB%8B.md) +- [下一篇:3.NestedScrollView简介](./Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/3.NestedScrollView\347\256\200\344\273\213.md" "b/Jetpack/ui/material/3.NestedScrollView\347\256\200\344\273\213.md" index 19416b74..01f79c8c 100644 --- "a/Jetpack/ui/material/3.NestedScrollView\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/3.NestedScrollView\347\256\200\344\273\213.md" @@ -6,10 +6,11 @@ extends FrameLayout implements NestedScrollingParent3, NestedScrollingChild3, Sc NestedScrollView is just like ScrollView, but it supports acting as both a nested scrolling parent and child on both new and old versions of Android. Nested scrolling is enabled by default. ``` -NestedScrollView即支持嵌套滑动的ScrollView,因此我们可以简单的把NestedScrollView类比为ScrollView,其作用就是作为控件父布局,从而具备(嵌套)滑动的功能。 +NestedScrollView即**支持嵌套滑动的ScrollView**,因此我们可以简单的把NestedScrollView类比为ScrollView,其作用就是作为控件父布局,从而具备(嵌套)滑动的功能。 -它与ScrollView的区别就在于NestedScrollView支持嵌套滑动,无论是作为父控件还是子控件,嵌套滑动都支持,且默认开启。 -因此,在一些需要支持嵌套滑动的情景中,比如一个ScrollView内部内部包裹一个RecyclerView,那么就会产生滑动冲突,这个问题就需要你自己去解决。而如果使用 NestedScrollView包裹RecyclerView,嵌套滑动天然支持,你无需做什么就可以实现前面想要实现的功能了。 +它与ScrollView的区别就在于**NestedScrollView支持嵌套滑动,无论是作为父控件还是子控件,嵌套滑动都支持,且默认开启。** + +因此,在一些需要支持嵌套滑动的情景中,比如一个ScrollView内部内部包裹一个RecyclerView,那么就会产生滑动冲突,这个问题就需要你自己去解决。**而如果使用 NestedScrollView包裹RecyclerView,嵌套滑动天然支持,你无需做什么就可以实现前面想要实现的功能了**。 我们通常为RecyclerView增加一个Header和Footer的方法是通过定义不同的viewType来区分的,而如果使用NestedScrollView,我们完全可以把RecyclerView当成一个单独的控件,然后在其上面增加一个控件作为Header,在其下面增加一个控件作为Footer。 @@ -981,8 +982,8 @@ case MotionEvent.ACTION_UP: -- [上一篇:2.NavigationView简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md) -- [下一篇:4.CoordinatorLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md) +- [上一篇:2.NavigationView简介](./Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md) +- [下一篇:4.CoordinatorLayout简介](./Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/4.CoordinatorLayout\347\256\200\344\273\213.md" "b/Jetpack/ui/material/4.CoordinatorLayout\347\256\200\344\273\213.md" index 761af93d..96271585 100644 --- "a/Jetpack/ui/material/4.CoordinatorLayout\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/4.CoordinatorLayout\347\256\200\344\273\213.md" @@ -26,7 +26,7 @@ ``` -布局中有两个子view,操作viewgirl,viewuncle也会相应跟着走,这就要写一个联动关系,用自定义Behavior实现: +布局中有两个子view,操作view girl,view uncle也会相应跟着走,这就要写一个联动关系,用自定义Behavior实现: ```java public class RunBehavior extends CoordinatorLayout.Behavior{ @@ -54,9 +54,11 @@ public class RunBehavior extends CoordinatorLayout.Behavior{ } ``` -CoordinatorLayout的使用核心是Behavior,Behavior就是执行你定制的动作。 +CoordinatorLayout的使用核心是Behavior,**Behavior就是执行你定制的动作。** -在讲Behavior之前必须先理解两个概念:Child和Dependency,什么意思呢?Child当然是子View的意思了,是谁的子View呢,当然是CoordinatorLayout的子View;其实Child是指要执行动作的CoordinatorLayout的子View。而Dependency是指Child依赖的View。简而言之,就是如果Dependency这个View发生了变化,那么Child这个View就要相应发生变化。发生变化是具体发生什么变化呢?这里就要引入Behavior,Child发生变化的具体执行的代码都是放在Behavior这个类里面。 +在讲Behavior之前必须先理解两个概念:Child和Dependency,什么意思呢?Child当然是子View的意思了,是谁的子View呢,当然是CoordinatorLayout的子View;其实Child是指要执行动作的CoordinatorLayout的子View。而Dependency是指Child依赖的View。 + +简而言之,就是如果Dependency这个View发生了变化,那么Child这个View就要相应发生变化。发生变化是具体发生什么变化呢?这里就要引入Behavior,Child发生变化的具体执行的代码都是放在Behavior这个类里面。 Behavior里面主要有两个方法: - public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) @@ -155,6 +157,6 @@ CoordinatorLayout可以监听其所有子控件的各种事件,然后自动帮 -- [上一篇:3.NestedScrollView简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md) -- [下一篇:5.AppBarLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md) +- [上一篇:3.NestedScrollView简介](./Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md) +- [下一篇:5.AppBarLayout简介](./Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/5.AppBarLayout\347\256\200\344\273\213.md" "b/Jetpack/ui/material/5.AppBarLayout\347\256\200\344\273\213.md" index ac881419..2a086bb1 100644 --- "a/Jetpack/ui/material/5.AppBarLayout\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/5.AppBarLayout\347\256\200\344\273\213.md" @@ -1,6 +1,6 @@ -# 5.AppBarLayout简介 +# 5. AppBarLayout简介 -AppbarLayout是Material Design的一个控件。它继承自LinearLayout,布局方向为垂直方向。所以你可以把它当成垂直布局的LinearLayout来使用。AppBarLayout是在LinearLayou上加了一些材料设计的概念,它可以让你定制当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。 +AppbarLayout是Material Design的一个控件。它继承自LinearLayout,布局方向为垂直方向。所以你可以把它当成垂直布局的LinearLayout来使用。AppBarLayout是在LinearLayout上加了一些材料设计的概念,它可以让你定制当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。 **请注意**:上面提到的某个可滚动View,可以理解为某个ScrollView。怎么理解上面的话呢?就是说,当某个ScrollView发生滚动时,你可以定制你的“顶部栏”应该执行哪些动作(如跟着一起滚动、保持不动等等)。那某个可移动的View到底是哪个可移动的View呢?这是由你自己指定的!如何指定,我们后面说。 @@ -34,7 +34,7 @@ AppBarLayout虽然和Toolbar没有直接联系,但是当Toolbar内置在Appbar -## CoordinatorLayout&AppbarLayout +## CoordinatorLayout & AppbarLayout 当我们运用support design中的组件时,我们应该拥有下面几个最基本的意识: @@ -95,5 +95,5 @@ AppBarLayout对象实现了一个Behavior。而正是这个Behavior,它会响 -- [上一篇:4.CoordinatorLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md) -- [下一篇:6.CollapsingToolbarLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md) +- [上一篇:4.CoordinatorLayout简介](./Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md) +- [下一篇:6.CollapsingToolbarLayout简介](./Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/6.CollapsingToolbarLayout\347\256\200\344\273\213.md" "b/Jetpack/ui/material/6.CollapsingToolbarLayout\347\256\200\344\273\213.md" index 4b5657bf..6b66ac4c 100644 --- "a/Jetpack/ui/material/6.CollapsingToolbarLayout\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/6.CollapsingToolbarLayout\347\256\200\344\273\213.md" @@ -236,5 +236,5 @@ Material 包中的很多类,比如 `DrawerLayout`、`CoordinatorLayout`及`App -- [上一篇:5.AppBarLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md) -- [下一篇:7.Snackbar简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) +- [上一篇:5.AppBarLayout简介](./Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md) +- [下一篇:7.Snackbar简介](./Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/7.Snackbar\347\256\200\344\273\213.md" "b/Jetpack/ui/material/7.Snackbar\347\256\200\344\273\213.md" index d495396d..0bd238cb 100644 --- "a/Jetpack/ui/material/7.Snackbar\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/7.Snackbar\347\256\200\344\273\213.md" @@ -33,5 +33,5 @@ setAction()方法可设置Snackbar右侧按钮,增加进行交互事件。如 -- [上一篇:6.CollapsingToolbarLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md) -- [下一篇:8.TabLayout简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/8.TabLayout%E7%AE%80%E4%BB%8B.md) +- [上一篇:6.CollapsingToolbarLayout简介](./Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md) +- [下一篇:8.TabLayout简介](./Jetpack/ui/material/8.TabLayout%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/ui/material/8.TabLayout\347\256\200\344\273\213.md" "b/Jetpack/ui/material/8.TabLayout\347\256\200\344\273\213.md" index 73d14e83..da33f0cf 100644 --- "a/Jetpack/ui/material/8.TabLayout\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/8.TabLayout\347\256\200\344\273\213.md" @@ -33,4 +33,4 @@ public class TabLayout extends HorizontalScrollView { - app:tabMode:设置tablayout的排列模式,有两种scrollable和fixed;默认是fixed。fixed是固定的,适用于标签较少,scrollable是可滚动的,适用于标签较多的情况下 -- [上一篇:7.Snackbar简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) \ No newline at end of file +- [上一篇:7.Snackbar简介](./Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) \ No newline at end of file diff --git "a/Jetpack/ui/material/9.BottomNavigation\347\256\200\344\273\213.md" "b/Jetpack/ui/material/9.BottomNavigation\347\256\200\344\273\213.md" index d0d58c38..2e1a655b 100644 --- "a/Jetpack/ui/material/9.BottomNavigation\347\256\200\344\273\213.md" +++ "b/Jetpack/ui/material/9.BottomNavigation\347\256\200\344\273\213.md" @@ -3,4 +3,4 @@ -- [上一篇:7.Snackbar简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) \ No newline at end of file +- [上一篇:7.Snackbar简介](./Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md) \ No newline at end of file diff --git "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" index d5741133..b0bcb9e0 100644 --- "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" +++ "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" @@ -1204,11 +1204,4 @@ class Person( -- [下一篇:2.Kotlin_高阶函数&Lambda&内联函数](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md) - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! - +- [下一篇:2.Kotlin_高阶函数&Lambda&内联函数](./KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md) \ No newline at end of file diff --git "a/KotlinCourse/10.Kotlin_\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/KotlinCourse/10.Kotlin_\350\256\276\350\256\241\346\250\241\345\274\217.md" index f2daad86..cc854f5d 100644 --- "a/KotlinCourse/10.Kotlin_\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/KotlinCourse/10.Kotlin_\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -468,7 +468,7 @@ The latest stock price has fell to 98 -- [上一篇:9.Kotlin_androidktx](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/9.Kotlin_androidktx.md) +- [上一篇:9.Kotlin_androidktx](./KotlinCourse/9.Kotlin_androidktx.md) diff --git "a/KotlinCourse/2.Kotlin_\351\253\230\351\230\266\345\207\275\346\225\260&Lambda&\345\206\205\350\201\224\345\207\275\346\225\260.md" "b/KotlinCourse/2.Kotlin_\351\253\230\351\230\266\345\207\275\346\225\260&Lambda&\345\206\205\350\201\224\345\207\275\346\225\260.md" index e426256e..96241623 100644 --- "a/KotlinCourse/2.Kotlin_\351\253\230\351\230\266\345\207\275\346\225\260&Lambda&\345\206\205\350\201\224\345\207\275\346\225\260.md" +++ "b/KotlinCourse/2.Kotlin_\351\253\230\351\230\266\345\207\275\346\225\260&Lambda&\345\206\205\350\201\224\345\207\275\346\225\260.md" @@ -937,8 +937,8 @@ startActivity() -- [上一篇:1.Kotlin_简介&变量&类&接口](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/1.Kotlin_%E7%AE%80%E4%BB%8B%26%E5%8F%98%E9%87%8F%26%E7%B1%BB%26%E6%8E%A5%E5%8F%A3.md) -- [下一篇:3.Kotlin_数字&字符串&数组&集合](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md) +- [上一篇:1.Kotlin_简介&变量&类&接口](./KotlinCourse/1.Kotlin_%E7%AE%80%E4%BB%8B%26%E5%8F%98%E9%87%8F%26%E7%B1%BB%26%E6%8E%A5%E5%8F%A3.md) +- [下一篇:3.Kotlin_数字&字符串&数组&集合](./KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md) --- diff --git "a/KotlinCourse/3.Kotlin_\346\225\260\345\255\227&\345\255\227\347\254\246\344\270\262&\346\225\260\347\273\204&\351\233\206\345\220\210.md" "b/KotlinCourse/3.Kotlin_\346\225\260\345\255\227&\345\255\227\347\254\246\344\270\262&\346\225\260\347\273\204&\351\233\206\345\220\210.md" index 213e4c91..e08efe24 100644 --- "a/KotlinCourse/3.Kotlin_\346\225\260\345\255\227&\345\255\227\347\254\246\344\270\262&\346\225\260\347\273\204&\351\233\206\345\220\210.md" +++ "b/KotlinCourse/3.Kotlin_\346\225\260\345\255\227&\345\255\227\347\254\246\344\270\262&\346\225\260\347\273\204&\351\233\206\345\220\210.md" @@ -656,8 +656,8 @@ loop@ for (i in 1..100) { ``` -- [上一篇:2.Kotlin_高阶函数&Lambda&内联函数](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md) -- [下一篇:4.Kotlin_表达式&关键字](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md) +- [上一篇:2.Kotlin_高阶函数&Lambda&内联函数](./KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md) +- [下一篇:4.Kotlin_表达式&关键字](./KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md) --- diff --git "a/KotlinCourse/4.Kotlin_\350\241\250\350\276\276\345\274\217&\345\205\263\351\224\256\345\255\227.md" "b/KotlinCourse/4.Kotlin_\350\241\250\350\276\276\345\274\217&\345\205\263\351\224\256\345\255\227.md" index f922d625..658658ab 100644 --- "a/KotlinCourse/4.Kotlin_\350\241\250\350\276\276\345\274\217&\345\205\263\351\224\256\345\255\227.md" +++ "b/KotlinCourse/4.Kotlin_\350\241\250\350\276\276\345\274\217&\345\205\263\351\224\256\345\255\227.md" @@ -219,8 +219,8 @@ for(num in nums) { -- [上一篇:3.Kotlin_数字&字符串&数组&集合](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md) -- [下一篇:5.Kotlin_内部类&密封类&枚举&委托](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md) +- [上一篇:3.Kotlin_数字&字符串&数组&集合](./KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md) +- [下一篇:5.Kotlin_内部类&密封类&枚举&委托](./KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md) --- diff --git "a/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" "b/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" index 27224838..27757599 100644 --- "a/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" +++ "b/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" @@ -871,8 +871,8 @@ class MutableUser(val map: MutableMap) { -- [上一篇:4.Kotlin_表达式&关键字](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md) -- [下一篇:6.Kotlin_多继承问题](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md) +- [上一篇:4.Kotlin_表达式&关键字](./KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md) +- [下一篇:6.Kotlin_多继承问题](./KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md) --- diff --git "a/KotlinCourse/6.Kotlin_\345\244\232\347\273\247\346\211\277\351\227\256\351\242\230.md" "b/KotlinCourse/6.Kotlin_\345\244\232\347\273\247\346\211\277\351\227\256\351\242\230.md" index bd8ca990..f0892b2c 100644 --- "a/KotlinCourse/6.Kotlin_\345\244\232\347\273\247\346\211\277\351\227\256\351\242\230.md" +++ "b/KotlinCourse/6.Kotlin_\345\244\232\347\273\247\346\211\277\351\227\256\351\242\230.md" @@ -189,8 +189,8 @@ fun main(args: Array) { -- [上一篇:5.Kotlin_内部类&密封类&枚举&委托](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md) -- [下一篇:7.Kotlin_注解&反射&扩展](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md) +- [上一篇:5.Kotlin_内部类&密封类&枚举&委托](./KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md) +- [下一篇:7.Kotlin_注解&反射&扩展](./KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md) --- diff --git "a/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" "b/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" index a6a52562..d4c453d0 100644 --- "a/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" +++ "b/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" @@ -1206,8 +1206,8 @@ class Group(val name: String) { -- [上一篇:6.Kotlin_多继承问题](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md) -- [下一篇:8.Kotlin_协程](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md) +- [上一篇:6.Kotlin_多继承问题](./KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md) +- [下一篇:8.Kotlin_协程](./KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md) --- diff --git "a/KotlinCourse/8.Kotlin_\345\215\217\347\250\213.md" "b/KotlinCourse/8.Kotlin_\345\215\217\347\250\213.md" index b1e79261..3c24b946 100644 --- "a/KotlinCourse/8.Kotlin_\345\215\217\347\250\213.md" +++ "b/KotlinCourse/8.Kotlin_\345\215\217\347\250\213.md" @@ -1009,8 +1009,8 @@ Kotlin 的协程是一种无栈协程的实现,它的控制流转依靠对协 -- [上一篇:7.Kotlin_注解&反射&扩展](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md) -- [下一篇:9.Kotlin_androidktx](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/9.Kotlin_androidktx.md) +- [上一篇:7.Kotlin_注解&反射&扩展](./KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md) +- [下一篇:9.Kotlin_androidktx](./KotlinCourse/9.Kotlin_androidktx.md) --- diff --git a/KotlinCourse/9.Kotlin_androidktx.md b/KotlinCourse/9.Kotlin_androidktx.md index 5316334e..3d83d2ba 100644 --- a/KotlinCourse/9.Kotlin_androidktx.md +++ b/KotlinCourse/9.Kotlin_androidktx.md @@ -96,8 +96,8 @@ public class ForecastRequest(val zipCode: String) { -- [上一篇:8.Kotlin_协程](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md) -- [下一篇:10.Kotlin_设计模式](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/10.Kotlin_%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) +- [上一篇:8.Kotlin_协程](./KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md) +- [下一篇:10.Kotlin_设计模式](./KotlinCourse/10.Kotlin_%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) diff --git "a/OperatingSystem/1.\346\223\215\344\275\234\347\263\273\347\273\237\347\256\200\344\273\213.md" "b/OperatingSystem/1.\346\223\215\344\275\234\347\263\273\347\273\237\347\256\200\344\273\213.md" index ccd54508..dbdf516b 100644 --- "a/OperatingSystem/1.\346\223\215\344\275\234\347\263\273\347\273\237\347\256\200\344\273\213.md" +++ "b/OperatingSystem/1.\346\223\215\344\275\234\347\263\273\347\273\237\347\256\200\344\273\213.md" @@ -611,7 +611,7 @@ Linux是类Unix系统,借鉴了Unix的设计并实现相关接口,但并非U ---- -- [下一篇:2.进程与线程](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md) +- [下一篇:2.进程与线程](./OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md) diff --git "a/OperatingSystem/2.\350\277\233\347\250\213\344\270\216\347\272\277\347\250\213.md" "b/OperatingSystem/2.\350\277\233\347\250\213\344\270\216\347\272\277\347\250\213.md" index a273dd1f..666a9a6a 100644 --- "a/OperatingSystem/2.\350\277\233\347\250\213\344\270\216\347\272\277\347\250\213.md" +++ "b/OperatingSystem/2.\350\277\233\347\250\213\344\270\216\347\272\277\347\250\213.md" @@ -741,9 +741,9 @@ int main(int argc, char *argv[]) { -- [上一篇:1.操作系统简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/1.%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AE%80%E4%BB%8B.md) +- [上一篇:1.操作系统简介](./OperatingSystem/1.%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AE%80%E4%BB%8B.md) -- [下一篇:3.内存管理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md) +- [下一篇:3.内存管理](./OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md) --- diff --git "a/OperatingSystem/3.\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/OperatingSystem/3.\345\206\205\345\255\230\347\256\241\347\220\206.md" index 8088adec..867d39f2 100644 --- "a/OperatingSystem/3.\345\206\205\345\255\230\347\256\241\347\220\206.md" +++ "b/OperatingSystem/3.\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -461,8 +461,8 @@ Android包含了标准Linux内核中内存管理设施的许多扩展,具体 -- [上一篇:2.进程和线程](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md) -- [下一篇:4.调度](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/4.%E8%B0%83%E5%BA%A6.md) +- [上一篇:2.进程和线程](./OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md) +- [下一篇:4.调度](./OperatingSystem/4.%E8%B0%83%E5%BA%A6.md) diff --git "a/OperatingSystem/4.\350\260\203\345\272\246.md" "b/OperatingSystem/4.\350\260\203\345\272\246.md" index 97635ae5..29763a94 100644 --- "a/OperatingSystem/4.\350\260\203\345\272\246.md" +++ "b/OperatingSystem/4.\350\260\203\345\272\246.md" @@ -82,8 +82,8 @@ -- [上一篇:3.内存管理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md) -- [下一篇:5.I/O](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/5.I:O.md) +- [上一篇:3.内存管理](./OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md) +- [下一篇:5.I/O](./OperatingSystem/5.I:O.md) --- diff --git a/OperatingSystem/5.I:O.md b/OperatingSystem/5.I:O.md index 4ed8964e..c0dd91f1 100644 --- a/OperatingSystem/5.I:O.md +++ b/OperatingSystem/5.I:O.md @@ -112,8 +112,8 @@ DMA模式的优缺点优点就是将主CPU从I/O中解脱出来。而缺点自 -- [上一篇:4.调度](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/4.%E8%B0%83%E5%BA%A6.md) -- [下一篇:6.文件管理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md) +- [上一篇:4.调度](./OperatingSystem/4.%E8%B0%83%E5%BA%A6.md) +- [下一篇:6.文件管理](./OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md) diff --git "a/OperatingSystem/6.\346\226\207\344\273\266\347\256\241\347\220\206.md" "b/OperatingSystem/6.\346\226\207\344\273\266\347\256\241\347\220\206.md" index 4597c5f1..166fce25 100644 --- "a/OperatingSystem/6.\346\226\207\344\273\266\347\256\241\347\220\206.md" +++ "b/OperatingSystem/6.\346\226\207\344\273\266\347\256\241\347\220\206.md" @@ -214,8 +214,8 @@ inode 节点主要包括了以下信息 -- [上一篇:5.I/O](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/5.I:O.md) -- [下一篇:7.嵌入式系统](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md) +- [上一篇:5.I/O](./OperatingSystem/5.I:O.md) +- [下一篇:7.嵌入式系统](./OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md) diff --git "a/OperatingSystem/7.\345\265\214\345\205\245\345\274\217\347\263\273\347\273\237.md" "b/OperatingSystem/7.\345\265\214\345\205\245\345\274\217\347\263\273\347\273\237.md" index ac818dfb..45cf9963 100644 --- "a/OperatingSystem/7.\345\265\214\345\205\245\345\274\217\347\263\273\347\273\237.md" +++ "b/OperatingSystem/7.\345\265\214\345\205\245\345\274\217\347\263\273\347\273\237.md" @@ -20,8 +20,8 @@ Android是基于Linux内核的一个嵌入式系统,因此我们可以认为An --- -- [上一篇:6.文件管理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md) -- [下一篇:8.虚拟机](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md) +- [上一篇:6.文件管理](./OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md) +- [下一篇:8.虚拟机](./OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md) --- diff --git "a/OperatingSystem/8.\350\231\232\346\213\237\346\234\272.md" "b/OperatingSystem/8.\350\231\232\346\213\237\346\234\272.md" index ebc16ef3..0b477666 100644 --- "a/OperatingSystem/8.\350\231\232\346\213\237\346\234\272.md" +++ "b/OperatingSystem/8.\350\231\232\346\213\237\346\234\272.md" @@ -123,7 +123,7 @@ EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EX --- -- [上一篇:7.嵌入式系统](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md) +- [上一篇:7.嵌入式系统](./OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md) - [下一篇:Android内核](https://github.com/CharonChui/AndroidNote/tree/master/OperatingSystem/AndroidKernal) diff --git "a/OperatingSystem/AndroidKernal/1.Android\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" "b/OperatingSystem/AndroidKernal/1.Android\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" index a6c6a9e3..0e50c259 100644 --- "a/OperatingSystem/AndroidKernal/1.Android\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" +++ "b/OperatingSystem/AndroidKernal/1.Android\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241.md" @@ -436,10 +436,10 @@ Binder驱动是Android专用的,但底层的驱动架构与Linux驱动一样 --- -- [上一篇:8.虚拟机](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md) +- [上一篇:8.虚拟机](./OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md) -- [下一篇:2.Android线程间通信之Handler消息机制](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md) +- [下一篇:2.Android线程间通信之Handler消息机制](./OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md) diff --git "a/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" "b/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" index 424a31dd..789811b3 100644 --- "a/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" +++ "b/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" @@ -814,7 +814,7 @@ public final class MessageQueue { -有关内存泄露请猛戳[内存泄露](https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md) +有关内存泄露请猛戳[内存泄露](./BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md) 在上面分析Handler类源码时,其构造函数中第一部分的代码就是 匿名类、内部类和本地类都必须申请为static,否则会警告可能出现内存泄露。那为什么会导致内存泄露呢? @@ -917,8 +917,8 @@ public class MyActivity extends Activity { -- [上一篇:1.Android进程间通信](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/1.Android%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1.md) -- [下一篇:3.Android Framework框架](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md) +- [上一篇:1.Android进程间通信](./OperatingSystem/AndroidKernal/1.Android%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1.md) +- [下一篇:3.Android Framework框架](./OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md) diff --git "a/OperatingSystem/AndroidKernal/3.Android Framework\346\241\206\346\236\266.md" "b/OperatingSystem/AndroidKernal/3.Android Framework\346\241\206\346\236\266.md" index d653e130..16448196 100644 --- "a/OperatingSystem/AndroidKernal/3.Android Framework\346\241\206\346\236\266.md" +++ "b/OperatingSystem/AndroidKernal/3.Android Framework\346\241\206\346\236\266.md" @@ -111,8 +111,8 @@ Context在应用程序开发中会经常被使用,在一般的计算机书记 --- -- [上一篇:2.Android线程间通信之Handler消息机制](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md) -- [下一篇:4.ActivityManagerService简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md) +- [上一篇:2.Android线程间通信之Handler消息机制](./OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md) +- [下一篇:4.ActivityManagerService简介](./OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md) diff --git "a/OperatingSystem/AndroidKernal/4.ActivityManagerService\347\256\200\344\273\213.md" "b/OperatingSystem/AndroidKernal/4.ActivityManagerService\347\256\200\344\273\213.md" index 3e88e552..74cb7173 100644 --- "a/OperatingSystem/AndroidKernal/4.ActivityManagerService\347\256\200\344\273\213.md" +++ "b/OperatingSystem/AndroidKernal/4.ActivityManagerService\347\256\200\344\273\213.md" @@ -144,8 +144,8 @@ TaskRecord中并没有该任务中所包含的Activity的列表,比如ArrayLis --- -- [上一篇:3.Android Framework框架](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md) -- [下一篇:5.Android消息获取](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md) +- [上一篇:3.Android Framework框架](./OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md) +- [下一篇:5.Android消息获取](./OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md) diff --git "a/OperatingSystem/AndroidKernal/5.Android\346\266\210\346\201\257\350\216\267\345\217\226.md" "b/OperatingSystem/AndroidKernal/5.Android\346\266\210\346\201\257\350\216\267\345\217\226.md" index 3fe0e833..5172508b 100644 --- "a/OperatingSystem/AndroidKernal/5.Android\346\266\210\346\201\257\350\216\267\345\217\226.md" +++ "b/OperatingSystem/AndroidKernal/5.Android\346\266\210\346\201\257\350\216\267\345\217\226.md" @@ -57,8 +57,8 @@ --- -- [上一篇:4.ActivityManagerService简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md) -- [下一篇:6.屏幕绘制基础](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md) +- [上一篇:4.ActivityManagerService简介](./OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md) +- [下一篇:6.屏幕绘制基础](./OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md) diff --git "a/OperatingSystem/AndroidKernal/6.\345\261\217\345\271\225\347\273\230\345\210\266\345\237\272\347\241\200.md" "b/OperatingSystem/AndroidKernal/6.\345\261\217\345\271\225\347\273\230\345\210\266\345\237\272\347\241\200.md" index feeb1c49..8c9c2d42 100644 --- "a/OperatingSystem/AndroidKernal/6.\345\261\217\345\271\225\347\273\230\345\210\266\345\237\272\347\241\200.md" +++ "b/OperatingSystem/AndroidKernal/6.\345\261\217\345\271\225\347\273\230\345\210\266\345\237\272\347\241\200.md" @@ -100,8 +100,8 @@ Framebuffer是系内核系统提供的图形硬件的抽象描述。之所以称 --- -- [上一篇:5.Android消息获取](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md) -- [下一篇:7.View绘制原理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md) +- [上一篇:5.Android消息获取](./OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md) +- [下一篇:7.View绘制原理](./OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md) diff --git "a/OperatingSystem/AndroidKernal/7.View\347\273\230\345\210\266\345\216\237\347\220\206.md" "b/OperatingSystem/AndroidKernal/7.View\347\273\230\345\210\266\345\216\237\347\220\206.md" index 325c231f..3d83fb38 100644 --- "a/OperatingSystem/AndroidKernal/7.View\347\273\230\345\210\266\345\216\237\347\220\206.md" +++ "b/OperatingSystem/AndroidKernal/7.View\347\273\230\345\210\266\345\216\237\347\220\206.md" @@ -1618,8 +1618,8 @@ MeasureSpec是View类的一个静态内部类,用来说明如何测量这个 --- -- [上一篇:6.屏幕绘制基础](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md) -- [下一篇:8.WindowManagerService简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md) +- [上一篇:6.屏幕绘制基础](./OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md) +- [下一篇:8.WindowManagerService简介](./OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md) diff --git "a/OperatingSystem/AndroidKernal/8.WindowManagerService\347\256\200\344\273\213.md" "b/OperatingSystem/AndroidKernal/8.WindowManagerService\347\256\200\344\273\213.md" index d3bb82f4..e8e5d4ef 100644 --- "a/OperatingSystem/AndroidKernal/8.WindowManagerService\347\256\200\344\273\213.md" +++ "b/OperatingSystem/AndroidKernal/8.WindowManagerService\347\256\200\344\273\213.md" @@ -128,8 +128,8 @@ Surface的销毁有两种情况: --- -- [上一篇:7.View绘制原理](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md) -- [下一篇:9.PackageManagerService简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/9.PackageManagerService%E7%AE%80%E4%BB%8B.md) +- [上一篇:7.View绘制原理](./OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md) +- [下一篇:9.PackageManagerService简介](./OperatingSystem/AndroidKernal/9.PackageManagerService%E7%AE%80%E4%BB%8B.md) diff --git "a/OperatingSystem/AndroidKernal/9.PackageManagerService\347\256\200\344\273\213.md" "b/OperatingSystem/AndroidKernal/9.PackageManagerService\347\256\200\344\273\213.md" index d26ae20e..61fa7597 100644 --- "a/OperatingSystem/AndroidKernal/9.PackageManagerService\347\256\200\344\273\213.md" +++ "b/OperatingSystem/AndroidKernal/9.PackageManagerService\347\256\200\344\273\213.md" @@ -61,7 +61,7 @@ --- -- [上一篇:8.WindowManagerService简介](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md) +- [上一篇:8.WindowManagerService简介](./OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md) diff --git a/OperatingSystem/AndroidKernal/Framework/ReadMe.md b/OperatingSystem/AndroidKernal/Framework/ReadMe.md new file mode 100644 index 00000000..518a0a1c --- /dev/null +++ b/OperatingSystem/AndroidKernal/Framework/ReadMe.md @@ -0,0 +1,303 @@ +## Andorid Framework入门 + +#### 第1章 系统服务相关问题 +本章重点讲解系统核心进程,以及一些关键的系统服务的启动原理和工作原理相关的内容。 +##### 1:谈谈对zygote的理解 +Zygote的作用是什么? +对于Zygote的作用实际上可以概括为以下两点: ++ 创建SystemServer ++ 孵化应用进程 + +![](./imgs/zygote.jpeg) + ++ 参考[谈谈对Android中Zygote的理解](https://zhuanlan.zhihu.com/p/260414370) + + +##### 2: 说说Android系统的启动 +Android是基于Linux系统的。但是它没有BIOS程序,取而代之的是**BootLoader(系统启动加载器)**。类似于BIOS,在系统加载前,用于初始化硬件设备,最终调用系统内核准备好环境。在Android中没有硬盘,而是ROM,类似于硬盘存放操作系统,用户程序等。 + +ROM跟硬盘一样也会划分为不同的区域,用于放置不同的程序,在Android中主要划分为以下几个区域: ++ /boot: 存放引导程序,包括内核和内存操作程序 ++ /system:相当于电脑C盘,存放Android系统和系统应用 ++ /recover: 回复分区。可以进入该分区进行系统回复 ++ /data: 用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序 ++ /cache: 安卓系统缓存区,保存系统经常访问的数据和应用程序 ++ /misc: 杂项内容 ++ /sdcard: 用户自己的存储区域。存放照片视频等 +Android系统启动跟PC相似。当开机时,首先加载BootLoader,BootLoader会读取ROM找到系统并将内核加载进RAM中。 + +当内核启动后会初始化各种软硬件环境,加载驱动程序,挂载跟文件系统。最后阶段会启动执行第一个用户空间进程init进程。 +![](./imgs/startup.jpg) + ++ 参考资料[《详解Android系统启动过程》](http://www.ay1.cc/article/18368.html) + +##### 3 你知道怎么添加一个系统服务吗? +###### 新增的服务 ++ 服务AIDL文件,定义服务的接口: + ```shell + frameworks/base/core/java/android/app/IDemoManager.aidl + ``` ++ 服务管理类,提供给客户端调用,以访问服务端的接口 (即持有服务端的引用, Binder 引用) + ```shell + frameworks/base/core/java/android/app/DemoManager.java + ``` ++ 服务实现类, 实现AIDL文件 + ```shell + frameworks/base/services/core/java/com/android/server/DemoManagerService.java + ``` + +###### 创建及启动服务涉及的修改 ++ 定义服务的标识 + ```shell + frameworks/base/core/java/android/content/Context.java + ``` ++ 创建及启动服务 + ```shell + frameworks/base/services/java/com/android/server/SystemServer.java + ``` ++ 创建服务管理类(可同时获取服务端的代理对象,由服务管理对象持有) + ```shell + frameworks/base/core/java/android/app/SystemServiceRegistry.java + ``` ++ 参考[《Framework添加新的系统服务》](https://www.jianshu.com/p/74971ee85a8b) + +#### 4 系统服务和bind的应用服务有什么区别? +##### 启动方式 ++ 系统服务 + 在SystemServer里面进行分批、分阶段启动,大部分都跑在binder线程里面。 +##### 注册方式 ++ 系统服务 + 有系统服务才能注册在ServiceManager ++ 应用服务 + ![](./imgs/ams.png) + + 应用端会向AMS发起bindService。 + + AMS会先判断这个Service是否已经注册过了,注册过就直接把之前发布的binder返回给应用;如果没有,AMS会像Service请求binder对象。(AMS请求的,属于被动注册) + + Service会相应AMS的请求,发布这个binder对象到AMS + + AMS再把这个binder对象回调给应用 + +##### 使用方式 ++ 系统服务 + 通过服务名去找到对于的ServiceFetcher对象,然后先通过SM.getService拿到binder对象,然后封装了一层拿到服务的管理对象。 ++ 应用服务 + 通过bindService向AMS发送绑定服务端请求,AMS通过onServiceConnected()回调把服务的binder对象返回给业务端,然后把这个对象封装成业务接口对象给业务接口调用。 + +#### 5 ServiceManager启动和工作原理是怎样的? +ServiceManager 是为了完成 Binder Server 的 Name(域名)和 Handle(IP 地址)之间对应关系的查询而存在的,它主要包含的功能: + ++ 注册:当一个 Binder Server 创建后,应该将这个 Server 的 Name 和 Handle 对应关系记录到 ServiceManager 中 ++ 查询:其他应用可以根据 Server 的 Name 查询到对应的 Service Handle +```shell +binder 驱动 -> 路由器 +ServiceManager -> DNS +Binder Client -> 客户端 +Binder Server -> 服务器 +``` + ++ 参考资料[《ServiceManager 的工作原理》](https://zhuanlan.zhihu.com/p/158623349) + +#### 6 谈谈对AMS的理解 +AMS即ActivityManagerService,AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似 +![](./imgs/ams_service.jpeg) + + + AMS的main函数:创建AMS实例,其中最重要的工作是创建Android运行环境,得到一个ActivityThread和一个Context对象。 + + AMS的setSystemProcess函数:该函数注册AMS和meminfo等服务到ServiceManager中。另外,它为SystemServer创建了一个ProcessRecord对象。由于AMS是Java世界的进程管理及调度中心,要做到对Java进程一视同仁,尽管SystemServer贵为系统进程,此时也不得不将其并入AMS的管理范围内。 + + AMS的installSystemProviders:为SystemServer加载SettingsProvider。 + + AMS的systemReady:做系统启动完毕前最后一些扫尾工作。该函数调用完毕后,HomeActivity将呈现在用户面前。 + ++ 参考资料[《AMS在Android起到什么作用?》](https://zhuanlan.zhihu.com/p/86266649) + +#### 第2章 应用进程相关问题 + +本章主要讲解应用进程的启动,以及伴随进程启动过程中的一些重要机制的初始化原理,比如binder机制,Application,以及Context等方面的问题。 +##### 1 Android应用进程是怎么启动的吗? +###### 冷启动与热启动 +Activity启动过程中,一般会牵涉到应用启动的流程。应用启动又分为冷启动和热启动。 ++ 冷启动:点击桌面图标,手机系统不存在该应用进程,这时系统会重新fork一个子进程来加载Application并启动Activity,这个启动方式就是冷启动。 ++ 热启动:应用的热启动比冷启动简单得多,开销也更低。在热启动中,因为系统里已有该应用的进程,所以系统的所有工作就是将您的 Activity 带到前台。 冷启动是应用完全从0开始启动,涉及到更多的内容,所以就应用冷启动的过程展开讨论。 + +###### 应用启动流程(冷启动) +![](./imgs/activy_start.jpeg) ++ 启动进程 + + 点击图标发生在Launcher应用的进程,startActivity()函数最终是由Instrumentation通过Android的Binder跨进程通信机制 发送消息给 system_server 进程; + + 在 system_server 中,启动进程的操作由ActivityManagerService 通过 socket 通信告知 Zygote 进程 fork 子进程(app进程) ++ 开启主线程 app 进程启动后,首先是实例化 ActivityThread,并执行其main()函数:创建 ApplicationThread,Looper,Handler 对象,并开启主线程消息循环Looper.loop()。 ++ 创建并初始化 Application和Activity ActivityThread的main()调用 ActivityThread#attach(false)方法进行 Binder 通信,通知system_server进程执行 ActivityManagerService#attachApplication(mAppThread)方法,用于初始化Application和Activity。 + + 在system_server进程中,ActivityManagerService#attachApplication(mAppThread)里依次初始化了Application和Activity,分别有2个关键函数: + + thread#bindApplication()方法通知主线程Handler 创建 Application 对象、绑定 Context 、执行 Application#onCreate() 生命周期 + + mStackSupervisor#attachApplicationLocked()方法中调用 ActivityThread#ApplicationThread#scheduleLaunchActivity()方法,进而通过主线程Handler消息通知创建 Activity 对象,然后再调用 mInstrumentation#callActivityOnCreate()执行 Activity#onCreate() 生命周期 ++ 布局&绘制 源码流程可以参考Android View 的绘制流程分析及其源码调用追踪 + +###### 参考资料 + + [《Android应用启动流程分析》](https://zhuanlan.zhihu.com/p/596546019) + + [《Android应用进程的创建 — Activity的启动流程》](https://www.jianshu.com/p/0875116e2e54) + +##### 2 应用是怎么启用Binder机制的 + + +##### 3 谈谈对Application的理解 +Application的作用 ++ 保存应用进程中的全局变量 + Application会横跨进程的生命周期,我们可以在Application中维护一些全局变量 ++ 应用初始化操作 + Application的创建是排在四大组件的前面 ++ 提供应用的上下文 + Application可以提供一个稳定的context,而且因为Application的生命周期横跨整个应用的生命周期,所以不需要担心Application的context内存泄漏的问题 + +##### 4 谈谈对Context的理解 +Context的字面含义是上下文环境。应用的上层代码通过Context类提供的接口来操作Android的4大组件和资源。在Android的应用程序中,Context无处不在,很多接口都要求用Context对象作为参数。 +![](./imgs/context.jpeg) + ++ Application的Context和Activity的Context的区别? +Activity、Service和Application这三种类型的Context都是可以通用的 + + ++ 如何获取Context? +通常我们想要获取Context对象,主要有以下四种方法 + + View.getContext + 返回当前View对象的Context对象,通常是当前正在展示的Activity对象。 + + Activity.getApplicationContext + 获取当前Activity所在的(应用)进程的Context对象,通常我们使用Context对象时,要优先考虑这个全局的进程Context。 + + ContextWrapper.getBaseContext() + 用来获取一个ContextWrapper进行装饰之前的Context,可以使用这个方法,这个方法在实际开发中使用并不多,也不建议使用。 + + Activity.this + 返回当前的Activity实例,如果是UI控件需要使用Activity作为Context对象,但是默认的Toast实际上使用ApplicationContext也可以。 + + getApplication()和getApplicationContext() + 它们得到的是同一个对象。getApplication()只能在Activity和Service中得到。在BroadcastReciver必须使用getApplicationContext()。 +###### 参考资料 ++ [《如何理解Context?》](https://zhuanlan.zhihu.com/p/27163977) + +#### 第3章 Activity组件相关问题 + +这一章主要讲解Activity相关的机制,包括Activity的启动流程,显示原理等相关问题,通过本章的学习,我们不但能熟悉它,更能深入了解它。 +##### 1 说说Activity的启动流程 +##### 2 说说Activity的显示原理 +##### 3 应用的UI线程是怎么启动的 + +#### 第4章 其它应用组件相关问题 + +本章主要讲除了Activity之外的应用组件相关问题,包括service的启动和绑定原理,静态广播和动态广播的注册和收发原理,provider的启动和数据传输原理等等。 +##### 1 说说service的启动原理 +Service的启动方式主要是:startService、bindService。 ++ binderService和startService的区别: + binderService不会触发应用端的onStartCommand函数。 +###### startService的流程 +流程分为两部分:AMS端、应用端。 ++ AMS的流程: + + 1). 先看Service启动了没有:如果启动了就直接发指令,让应用端执行onStartCommand()。 + + 2). 如果Service没有启动,就看它所在进程启动了没有:如果已经启动,就去启动Service,等Service启动了之后再发送指令让其执行onStartCommand。 + + 3). 如果进程没有启动就去启动进程,等进程启动后再启动Service。 + ++ 应用端的流程: + + 1). 先创建Service对象 + + 2). 再赋予上下文 + + 3). 最后调用生命周期onCreate() +![](./imgs/service_start.png) +###### bindService的流程 ++ 用向AMS发起bindService调用。 ++ AMS首先检查有没有Service的binder句柄,如果有就直接把它回调给应用。 ++ 如果没有,AMS就会向Service请求binder句柄。 ++ Service收到之后就会把自己的binder句柄发布到AMS。 ++ AMS再把这个binder句柄回调给应用。 ++ 应用拿到这个binder句柄后就可以向Service发起binder调用了。 +![](./imgs/service_binder.png) + +###### 参考资料 [《Service启动原理》](https://www.cnblogs.com/renhui/p/12964554.html) +##### 2 说说service的绑定原理 + +##### 3 说说动态广播的注册和收发原理 + +##### 4 说说静态广播的注册和收发原理 + +##### 5 说说Provider的启动原理 + +#### 第5章 UI体系相关问题 + +本章主要讲UI体系相关问题,包括UI刷新机制,涉及到vsync和choreographer原理。另外还会讲到surface的相关原理,涉及到应用和WMS、surfaceFlinger通信。 +##### 1 说说屏幕刷新的机制-1 + +##### 2 说说屏幕刷新的机制-2 + +##### 3 surface跨进程传递原理 + +##### 4 surface的绘制原理 + +##### 5 你对vsync机制有了解吗? + +##### 6 SurfaceView & View的区别,底层原理有何不同 + +#### 第6章 进程通信相关问题 + +本章主要讲进程通信相关问题,包括binder的整体架构和通信原理,oneway机制,binder对象的传递等等。 +##### 1 Android Framework用到了哪些跨进程通信方式 +跨进程通信主要有以下几类:管道、Socket、共享内存、信号。 ++ 管道 +管道的特点是半双工&单向的,管道里面的数据只能往一个方向流动。一般情况下管道是在父子进程之间使用的。 + ++ socket +socket的特点是全双工,即可读也可写。可以用在两个无亲缘关系的进程之间,但需要公开路径。 +例子:在Android的Framework机制中,zygote就是通过socket来接受AMS的请求,然后启动应用进程的。 + ++ 共享内存 +共享内存的特点:速度快,且不需要多次拷贝,且进程之间不需要存在亲缘关系,只需要拿到文件描述符即可。 +这里补充一下:管道和socket的问题在于数据不能太大,否则性能会非常糟糕,相比较共享内存不存在这个问题。 + ++ 信号 +信号的特点是: + + a).单向的,发送出去后不管其他人接受者是如何处理的; + + b).只能带信号,不能带其他参数。 + + c).知道进程的pid就可以发信号,而且一次可以一群进程发信号(需 root权限 或 同uid 才行)。 +例子:Android的Process#killProcess方法,就是发送的 SIGNAL_KILL 信号。 + ++ Binder +Binder机制是Android特有的进程间通信的机制,特点为:采用C/S的通信模式、有更好的传输性能,最重要的特点是安全。 +Android的四大组件,有时候不同的组件之间所在的进程是不一样的,当处于不同的进程的时候,就需要进行进程间通信了。这些进程间的通信依赖于Binder IPC机制。不仅如此,Android 系统对应用层提供的服务如:AMS、PMS等都是基于Binder IPC机制实现的。Binder机制在Android系统中的位置非常重要。 + +##### 2 谈谈你对Binder的理解 + +##### 3 一次完整的ipc通信流程是怎样的 +![](./imgs/ipc.webp) +##### 4 binder对象跨进程传递原理是怎么样的 ++ Binder 跨进程传输是通过 Parcel 传输的,先通过 WriteStrongBinder 写到 Parcel 再通过 ReadStrongBinder 读取Parcel。 ++ 在 Parcel 中存储的结构是 flat_binder_object 根据偏移量来确定保存的位置。然后 Binder 驱动通过读取 Parcel 中的 binder 实体对象 创建了 binder_node 结构,和 binder_ref 引用给到目标进程; ++ 目标进程通过 binder_ref 的 handle 创建了 BpBinder 再往上调用到 BinderProxy 再调用到业务层 Proxy +![](./imgs/binder_trans.png) + +##### 5 说一说binder的oneway机制 ++ 非 oneway:调用方阻塞(休眠) +![](./imgs/one_way_01.png) + + ++ oneway:调用方非阻塞(non-block) +![](./imgs/one_way_02.png) + +#### 第7章 线程通信相关问题 + +本章主要讲线程通信原理相关问题,包括消息队列的创建,消息循环机制,消息延时,同步和异步消息,消息屏障等等内容。 +##### 1 线程的消息队列是怎么创建的? +![](./imgs/message_queue.webp) + +##### 2 说说android线程间消息传递机制 +![](./imgs/multi_thread_messsge.webp) + +##### 3 handler的消息延时是怎么实现的? + +##### 4 说说idleHandler的原理 + +##### 5 主线程进入loop循环了为什么没有ANR? + +##### 6 听说过消息屏障么? + +##### 7 多线程间通信和多进程之间通信有什么不同,分别怎么实现? + +#### 第8章 技巧,心得相关 + +除了上面章节之外的所有问题,都会放在本章讲到,除了原理之外,还会分享一些代码技巧。 +##### 1 怎么跨进程传递大图片 + +##### 2 说说threadLocal的原理 + +##### 3 来说说looper的副业 + +##### 4 怎么检查线程有耗时任务 +##### 5 怎么同步处理消息 +##### 6 主线程&ApplicationThread diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/activy_start.jpeg b/OperatingSystem/AndroidKernal/Framework/imgs/activy_start.jpeg new file mode 100644 index 00000000..c7146820 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/activy_start.jpeg differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/ams.png b/OperatingSystem/AndroidKernal/Framework/imgs/ams.png new file mode 100644 index 00000000..e6531659 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/ams.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/ams_service.jpeg b/OperatingSystem/AndroidKernal/Framework/imgs/ams_service.jpeg new file mode 100644 index 00000000..5e352bf4 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/ams_service.jpeg differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/binder_trans.png b/OperatingSystem/AndroidKernal/Framework/imgs/binder_trans.png new file mode 100644 index 00000000..7fa047b6 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/binder_trans.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/context.jpeg b/OperatingSystem/AndroidKernal/Framework/imgs/context.jpeg new file mode 100644 index 00000000..7a06152a Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/context.jpeg differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/ipc.webp b/OperatingSystem/AndroidKernal/Framework/imgs/ipc.webp new file mode 100644 index 00000000..6c1b232e Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/ipc.webp differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/message_queue.webp b/OperatingSystem/AndroidKernal/Framework/imgs/message_queue.webp new file mode 100644 index 00000000..7673f24f Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/message_queue.webp differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/multi_thread_messsge.webp b/OperatingSystem/AndroidKernal/Framework/imgs/multi_thread_messsge.webp new file mode 100644 index 00000000..d6b034c0 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/multi_thread_messsge.webp differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/one_way_01.png b/OperatingSystem/AndroidKernal/Framework/imgs/one_way_01.png new file mode 100644 index 00000000..de13bb8f Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/one_way_01.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/one_way_02.png b/OperatingSystem/AndroidKernal/Framework/imgs/one_way_02.png new file mode 100644 index 00000000..0e082f49 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/one_way_02.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/service_binder.png b/OperatingSystem/AndroidKernal/Framework/imgs/service_binder.png new file mode 100644 index 00000000..ffcadcbd Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/service_binder.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/service_start.png b/OperatingSystem/AndroidKernal/Framework/imgs/service_start.png new file mode 100644 index 00000000..ca625aa4 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/service_start.png differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/startup.jpg b/OperatingSystem/AndroidKernal/Framework/imgs/startup.jpg new file mode 100644 index 00000000..2c5c022a Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/startup.jpg differ diff --git a/OperatingSystem/AndroidKernal/Framework/imgs/zygote.jpeg b/OperatingSystem/AndroidKernal/Framework/imgs/zygote.jpeg new file mode 100644 index 00000000..cf7d2531 Binary files /dev/null and b/OperatingSystem/AndroidKernal/Framework/imgs/zygote.jpeg differ diff --git "a/OperatingSystem/AndroidKernal/Framework/\351\237\263\351\242\221\346\241\206\346\236\266.md" "b/OperatingSystem/AndroidKernal/Framework/\351\237\263\351\242\221\346\241\206\346\236\266.md" new file mode 100644 index 00000000..0e06440b --- /dev/null +++ "b/OperatingSystem/AndroidKernal/Framework/\351\237\263\351\242\221\346\241\206\346\236\266.md" @@ -0,0 +1,8 @@ +# Android 12 音频框架 + +### 概述 + +- AudioRcorder 和 AudioTrack:这两个类属于 Audio 系统对外提供的 API 类,通过它们可以完成 + Android 平台上⾳频数据的采集和输出任务。 +- AudioFlinger:它是 Audio 系统的⼯作引擎,管理着系统中的输⼊输出⾳频流,并承担⾳频数据的混⾳,以及读写 Audio 硬件等⼯作以实现数据的输⼊输出功能。 +- AudioPolicyService:它是 Audio 系统的策略控制中⼼,具体掌管系统中声⾳设备的选择和切换、⾳量控制等功能。 diff --git "a/OperatingSystem/AndroidKernal/Framework/\351\237\263\351\242\221\350\260\203\350\257\225.md" "b/OperatingSystem/AndroidKernal/Framework/\351\237\263\351\242\221\350\260\203\350\257\225.md" new file mode 100644 index 00000000..e69de29b diff --git a/README.md b/README.md index e3db9d51..b41b7e40 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,5 @@ -Android学习笔记 -=== - -![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/note.jpg) - -> 十年生死两茫茫,不思量,自难忘,华年短暂,陈辞岁月悠悠伤, -> 满腔热血已芜荒,展未来,后生强,战战兢兢,如履薄冰心彷徨, -> 青丝化雪、鬓角成霜,已是英雄迟暮,人生怎慷慨激昂? - - -目录 -=== - -- [史上最适合Android开发者学习的Go语言教程](https://github.com/CharonChui/GolangStudyNote) -- [史上最适合Android开发者学习的iOS开发教程](https://github.com/CharonChui/iOSStudyNote) -- [源码解析][43] - - [自定义View详解][1] - - [Activity界面绘制过程详解][2] - - [Activity启动过程][3] - - [Android Touch事件分发详解][4] - - [AsyncTask详解][5] - - [butterknife源码详解][6] - - [InstantRun详解][7] - - [ListView源码分析][8] - - [VideoView源码分析][9] - - [View绘制过程详解][10] - - [LeakCanary源码分析][284] - - [网络部分][11] - - [HttpURLConnection详解][12] - - [HttpURLConnection与HttpClient][13] - - [volley-retrofit-okhttp之我们该如何选择网路框架][14] - - [Volley源码分析][15] - - [Retrofit详解(上)][16] - - [Retrofit详解(下)][17] +### Android学习笔记 +#### 目录 - [Dagger2][199] - [1.Dagger2简介(一).md][200] - [2.Dagger2入门demo(二).md][201] @@ -42,60 +10,6 @@ Android学习笔记 - [7.Dagger2之dagger-android(七).md][206] - [8.Dagger2与MVP(八).md][207] - [9.Dagger2原理分析(九).md][212] -- [音视频开发][44] - - [搭建nginx+rtmp服务器][18] - - [视频播放相关内容总结][19] - - [视频解码之软解与硬解][20] - - [音视频基础知识][21] - - [Android WebRTC简介][22] - - [DNS及HTTPDNS][23] - - [DLNA简介][24] - - [AudioTrack简介][214] - - [流媒体协议][224] - - [流媒体协议][246] - - [HLS][247] - - [DASH][248] - - [HTTP FLV][249] - - [RTMP][250] - - [ExoPlayer][216] - - [1. ExoPlayer简介.md][217] - - [2. ExoPlayer MediaSource简介][218] - - [3. ExoPlayer源码分析之prepare方法][219] - - [4. ExoPlayer源码分析之prepare序列图][220] - - [5. ExoPlayer源码分析之PlayerView][221] - - [视频封装格式][225] - - [MP4格式详解][251] - - [FLV][252] - - [TS][253] - - [fMP4 vs ts][254] - - [fMP4格式详解][255] - - [视频封装格式][256] - - [视频编码][257] - - [AV1][258] - - [H264][259] - - [H265][260] - - [SurfaceView与TextureView][226] - - [关键帧][227] - - [CDN及PCDN][228] - - [P2P技术][229] - - [P2P][261] - - [P2P原理_NAT穿透][262] - - [播放器性能优化][230] - - [MediaExtractor、MediaCodec、MediaMuxer][245] - - [OpenGL][231] - - [1.OpenGL简介][232] - - [2.GLSurfaceView简介][233] - - [3.GLSurfaceView源码解析][234] - - [4.GLTextureView实现][235] - - [5.OpenGL ES绘制三角形][236] - - [6.OpenGL ES绘制矩形及圆形][237] - - [7.OpenGL ES着色器语言GLSL][238] - - [8.GLES类及Matrix类][239] - - [9.OpenGL ES纹理][240] - - [10.GLSurfaceView+MediaPlayer播放视频][241] - - [11.OpenGL ES滤镜][242] - - [弹幕][243] - - [Android弹幕实现][244] - [操作系统][263] - [1.操作系统简介][264] - [2.进程与线程][265] @@ -115,37 +29,37 @@ Android学习笔记 - [7.View绘制原理][281] - [8.WindowManagerService简介][282] - [9.PackageManagerService简介][283] -- [架构设计][272] - - [1.架构简介][273] +- [x] [架构设计][272] + - [x] [1.架构简介][273] - [Jetpack][287] - - [Jetpack简介][288] - - [architecture][289] - - [1.简介][293] - - [2.ViewBinding简介][294] - - [3.Lifecycle简介][295] - - [4.ViewModel简介][296] - - [5.LiveData简介][297] - - [6.DataBinding简介][298] - - [7.Room简介][299] - - [8.PagingLibrary简介][300] - - [9.App Startup简介][301] - - [10.DataStore简介][302] - - [11.Hilt简介][303] - - [12.Navigation简介][304] - - [13.Jetpack MVVM简介][305] - - [14.findViewById的过去及未来][306] - - [ui][290] - - [Jetpack Compose简介][307] - - [material][308] - - [1.MaterialToolbar简介][309] - - [2.NavigationView简介][310] - - [3.NestedScrollView简介][311] - - [4.CoordinatorLayout简介][312] - - [5.AppBarLayout简介][313] - - [6.CollapsingToolbarLayout简介][314] - - [7.Snackbar简介][315] - - [8.TabLayout简介][316] + - [x] [Jetpack简介][288] + - [x] [architecture][289] + - [x] [1.简介][293] + - [x] [2.ViewBinding简介][294] + - [x] [3.Lifecycle简介][295] + - [x] [4.ViewModel简介][296] + - [x] [5.LiveData简介][297] + - [x] [6.DataBinding简介][298] + - [x] [7.Room简介][299] + - [x] [8.PagingLibrary简介][300] + - [x] [9.App Startup简介][301] + - [x] [10.DataStore简介][302] + - [x] [11.Hilt简介][303] + - [x] [12.Navigation简介][304] + - [x] [13.Jetpack MVVM简介][305] + - [x] [14.findViewById的过去及未来][306] + - [UI][290] + - [x] [Jetpack Compose简介][307] + - [x] [material][308] + - [x] [1.MaterialToolbar简介][309] + - [x] [2.NavigationView简介][310] + - [x] [3.NestedScrollView简介][311] + - [x] [4.CoordinatorLayout简介][312] + - [x] [5.AppBarLayout简介][313] + - [x] [6.CollapsingToolbarLayout简介][314] + - [x] [7.Snackbar简介][315] + - [x] [8.TabLayout简介][316] - [foundation][291] - [1.简介][317] - [behavior][292] @@ -168,14 +82,14 @@ Android学习笔记 - [RxJava系列全家桶][31] - [开发工具][47] - - [目前流行的开发组合][32] - - [性能优化相关工具][33] - - [Android开发工具及类库][34] - - [Github个人主页绑定域名][35] - - [Markdown学习手册][36] - - [MAT内存分析][37] - - [调试平台Sonar][213] - - [Icon制作][223] + - [x] [目前流行的开发组合][32] + - [x] [性能优化相关工具][33] + - [x] [Android开发工具及类库][34] + - [x] [Github个人主页绑定域名][35] + - [x] [Markdown学习手册][36] + - [x] [MAT内存分析][37] + - [x] [调试平台Sonar][213] + - [x] [Icon制作][223] - [Kotlin学习][48] - [1.Kotlin_简介&变量&类&接口][180] @@ -192,9 +106,9 @@ Android学习笔记 - [Gradle&Maven][49] - - [Gradle专题][39] - - [发布library到Maven仓库][40] - - [Composing builds简介][319] + - [x] [Gradle专题][39] + - [x] [发布library到Maven仓库][40] + - [x] [Composing builds简介][319] - [应用发布][50] - [使用Jenkins实现自动化打包][198] @@ -202,76 +116,76 @@ Android学习笔记 - [Zipalign优化][42] - [Android Studio使用教程][51] - - [AndroidStudio使用教程(第一弹)][55] - - [AndroidStudio使用教程(第二弹)][56] - - [AndroidStudio使用教程(第三弹)][57] - - [AndroidStudio使用教程(第四弹)][58] - - [AndroidStudio使用教程(第五弹)][59] - - [AndroidStudio使用教程(第六弹)][60] - - [AndroidStudio使用教程(第七弹)][61] - - [Android Studio你可能不知道的操作][62] - - [AndroidStudio提高Build速度][63] - - [AndroidStudio中进行ndk开发][64] + - [x] [AndroidStudio使用教程(第一弹)][55] + - [x] [AndroidStudio使用教程(第二弹)][56] + - [x] [AndroidStudio使用教程(第三弹)][57] + - [x] [AndroidStudio使用教程(第四弹)][58] + - [x] [AndroidStudio使用教程(第五弹)][59] + - [x] [AndroidStudio使用教程(第六弹)][60] + - [x] [AndroidStudio使用教程(第七弹)][61] + - [x] [Android Studio你可能不知道的操作][62] + - [x] [AndroidStudio提高Build速度][63] + - [x] [AndroidStudio中进行ndk开发][64] - [进阶部分][52] - - [布局优化][65] - - [屏幕适配之百分比方案详解][66] - - [热修复实现][67] - - [如何让Service常驻内存][68] - - [通过Hardware Layer提高动画性能][69] - - [性能优化][70] - - [注解使用][71] - - [Android6.0权限系统][72] - - [Android开发不申请权限来使用对应功能][73] - - [Android开发中的MVP模式详解][74] - - [Android启动模式详解][75] - - [Android卸载反馈][76] - - [ApplicationId vs PackageName][77] - - [AndroidRuntime_ART与Dalvik][78] - - [BroadcastReceiver安全问题][79] - - [Crash及ANR分析][80] - - [Library项目中资源id使用case时报错][81] - - [Mac下配置adb及Android命令][82] - - [RecyclerView专题][84] - - [ConstraintLaayout简介][194] - - [Android WorkManager][208] - - [OOM问题分析][215] + - [x] [布局优化][65] + - [x] [x] [屏幕适配之百分比方案详解][66] + - [x] [热修复实现][67] + - [x] [如何让Service常驻内存][68] + - [x] [通过Hardware Layer提高动画性能][69] + - [x] [性能优化][70] + - [x] [注解使用][71] + - [x] [Android6.0权限系统][72] + - [x] [Android开发不申请权限来使用对应功能][73] + - [x] [Android开发中的MVP模式详解][74] + - [x] [Android启动模式详解][75] + - [x] [Android卸载反馈][76] + - [x] [ApplicationId vs PackageName][77] + - [x] [AndroidRuntime_ART与Dalvik][78] + - [x] [BroadcastReceiver安全问题][79] + - [x] [Crash及ANR分析][80] + - [x] [Library项目中资源id使用case时报错][81] + - [x] [Mac下配置adb及Android命令][82] + - [x] [RecyclerView专题][84] + - [x] [ConstraintLaayout简介][194] + - [x] [Android WorkManager][208] + - [x] [OOM问题分析][215] - [Java基础及算法][53] - - [八种排序算法][189] - - [算法复杂度][192] - - [线程池的原理][190] - - [设计模式][191] - - [动态代理][193] - - [常用命令行大全][85] - - [单例的最佳实现方式][86] - - [数据结构][87] - - [获取今后多少天后的日期][88] - - [剑指Offer(上)][89] - - [剑指Offer(下)][90] - - [强引用、软引用、弱引用、虚引用][91] - - [生产者消费者][92] - - [数据加密及解密][93] - - [死锁][94] - - [常见算法][95] - - [网络请求相关内容总结][96] - - [线程池的原理][97] - - [Java并发编程之原子性、可见性以及有序性][98] - - [Base64加密][99] - - [Git简介][100] - - [hashCode与equals][101] - - [HashMap实现原理分析][102] - - [Java基础面试题][103] - - [JVM垃圾回收机制][104] - - [MD5加密][105] - - [MVC与MVP及MVVM][106] - - [RMB大小写转换][107] - - [Vim使用教程][108] - - [volatile和Synchronized区别][109] - - [Http与Https的区别][195] - - [Top-K问题][196] - - [Java内存模型][285] - - [JVM架构][286] + - [x] [八种排序算法][189] + - [x] [算法复杂度][192] + - [x] [线程池的原理][190] + - [x] [设计模式][191] + - [x] [动态代理][193] + - [x] [常用命令行大全][85] + - [x] [单例的最佳实现方式][86] + - [x] [数据结构][87] + - [x] [获取今后多少天后的日期][88] + - [x] [剑指Offer(上)][89] + - [x] [剑指Offer(下)][90] + - [x] [强引用、软引用、弱引用、虚引用][91] + - [x] [生产者消费者][92] + - [x] [数据加密及解密][93] + - [x] [死锁][94] + - [x] [常见算法][95] + - [x] [网络请求相关内容总结][96] + - [x] [线程池的原理][97] + - [x] [Java并发编程之原子性、可见性以及有序性][98] + - [x] [Base64加密][99] + - [x] [Git简介][100] + - [x] [hashCode与equals][101] + - [x] [HashMap实现原理分析][102] + - [x] [Java基础面试题][103] + - [x] [JVM垃圾回收机制][104] + - [x] [MD5加密][105] + - [x] [MVC与MVP及MVVM][106] + - [x] [RMB大小写转换][107] + - [x] [Vim使用教程][108] + - [x] [volatile和Synchronized区别][109] + - [x] [Http与Https的区别][195] + - [x] [Top-K问题][196] + - [x] [Java内存模型][285] + - [x] [JVM架构][286] - [基础部分][54] - [安全退出应用程序][110] - [病毒][111] @@ -322,7 +236,6 @@ Android学习笔记 - [Android入门介绍][156] - [Android四大组件之ContentProvider][157] - [Android四大组件之Service][158] - - [Ant打包][159] - [Bitmap优化][160] - [Fragment专题][161] - [Home键监听][162] @@ -346,48 +259,123 @@ Android学习笔记 - [反编译][222] -[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/%E8%87%AA%E5%AE%9A%E4%B9%89View%E8%AF%A6%E8%A7%A3.md "自定义View详解" -[2]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Activity%E7%95%8C%E9%9D%A2%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "Activity界面绘制过程详解" -[3]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Activity%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B.md "Activity启动过程" -[4]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md "Android Touch事件分发详解" -[5]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/AsyncTask%E8%AF%A6%E8%A7%A3.md "AsyncTask详解" -[6]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md "butterknife源码详解" -[7]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" -[8]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/ListView源码分析.md "ListView源码分析" -[9]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/VideoView%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "VideoView源码分析" -[10]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "View绘制过程详解" + +- [音视频开发][44] + - [搭建nginx+rtmp服务器][18] + - [视频播放相关内容总结][19] + - [视频解码之软解与硬解][20] + - [音视频基础知识][21] + - [Android WebRTC简介][22] + - [DNS及HTTPDNS][23] + - [DLNA简介][24] + - [AudioTrack简介][214] + - [流媒体协议][224] + - [流媒体协议][246] + - [HLS][247] + - [DASH][248] + - [HTTP FLV][249] + - [RTMP][250] + - [ExoPlayer][216] + - [1. ExoPlayer简介.md][217] + - [2. ExoPlayer MediaSource简介][218] + - [3. ExoPlayer源码分析之prepare方法][219] + - [4. ExoPlayer源码分析之prepare序列图][220] + - [5. ExoPlayer源码分析之PlayerView][221] + - [视频封装格式][225] + - [MP4格式详解][251] + - [FLV][252] + - [TS][253] + - [fMP4 vs ts][254] + - [fMP4格式详解][255] + - [视频封装格式][256] + - [视频编码][257] + - [AV1][258] + - [H264][259] + - [H265][260] + - [SurfaceView与TextureView][226] + - [关键帧][227] + - [CDN及PCDN][228] + - [P2P技术][229] + - [P2P][261] + - [P2P原理_NAT穿透][262] + - [播放器性能优化][230] + - [MediaExtractor、MediaCodec、MediaMuxer][245] + - [OpenGL][231] + - [1.OpenGL简介][232] + - [2.GLSurfaceView简介][233] + - [3.GLSurfaceView源码解析][234] + - [4.GLTextureView实现][235] + - [5.OpenGL ES绘制三角形][236] + - [6.OpenGL ES绘制矩形及圆形][237] + - [7.OpenGL ES着色器语言GLSL][238] + - [8.GLES类及Matrix类][239] + - [9.OpenGL ES纹理][240] + - [10.GLSurfaceView+MediaPlayer播放视频][241] + - [11.OpenGL ES滤镜][242] + - [弹幕][243] + - [Android弹幕实现][244] + +- [源码解析][43] + - [自定义View详解][1] + - [Activity界面绘制过程详解][2] + - [Activity启动过程][3] + - [Android Touch事件分发详解][4] + - [AsyncTask详解][5] + - [butterknife源码详解][6] + - [InstantRun详解][7] + - [ListView源码分析][8] + - [VideoView源码分析][9] + - [View绘制过程详解][10] + - [LeakCanary源码分析][284] + - [网络部分][11] + - [HttpURLConnection详解][12] + - [HttpURLConnection与HttpClient][13] + - [volley-retrofit-okhttp之我们该如何选择网路框架][14] + - [Volley源码分析][15] + - [Retrofit详解(上)][16] + - [Retrofit详解(下)][17] +[1]: ./SourceAnalysis/%E8%87%AA%E5%AE%9A%E4%B9%89View%E8%AF%A6%E8%A7%A3.md "自定义View详解" +[2]: ./SourceAnalysis/Activity%E7%95%8C%E9%9D%A2%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "Activity界面绘制过程详解" +[3]: ./SourceAnalysis/Activity%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B.md "Activity启动过程" +[4]: ./SourceAnalysis/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md "Android Touch事件分发详解" +[5]: ./SourceAnalysis/AsyncTask%E8%AF%A6%E8%A7%A3.md "AsyncTask详解" +[6]: ./SourceAnalysis/butterknife%E6%BA%90%E7%A0%81%E8%AF%A6%E8%A7%A3.md "butterknife源码详解" +[7]: ./SourceAnalysis/InstantRun%E8%AF%A6%E8%A7%A3.md "InstantRun详解" +[8]: ./SourceAnalysis/ListView源码分析.md "ListView源码分析" +[9]: ./SourceAnalysis/VideoView%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "VideoView源码分析" +[10]: ./SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md "View绘制过程详解" [11]: https://github.com/CharonChui/AndroidNote/tree/master/SourceAnalysis/Netowork "网络部分" -[12]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/HttpURLConnection%E8%AF%A6%E8%A7%A3.md "HttpURLConnection详解" -[13]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/HttpURLConnection%E4%B8%8EHttpClient.md "HttpURLConnection与HttpClient" -[14]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md "volley-retrofit-okhttp之我们该如何选择网路框架" -[15]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" -[16]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8A).md "Retrofit详解(上)" -[17]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8B).md "Retrofit详解(下)" -[18]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%90%AD%E5%BB%BAnginx%2Brtmp%E6%9C%8D%E5%8A%A1%E5%99%A8.md "搭建nginx+rtmp服务器" -[19]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E6%80%BB%E7%BB%93.md "视频播放相关内容总结" -[20]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E8%A7%A3%E7%A0%81%E4%B9%8B%E8%BD%AF%E8%A7%A3%E4%B8%8E%E7%A1%AC%E8%A7%A3.md "视频解码之软解与硬解" -[21]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md "音视频基础知识" -[22]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/Android%20WebRTC%E7%AE%80%E4%BB%8B.md "Android WebRTC简介" -[23]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/DNS%E5%8F%8AHTTPDNS.md "DNS及HTTPDNS" -[24]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/DLNA%E7%AE%80%E4%BB%8B.md "DLNA简介" -[25]: https://github.com/CharonChui/AndroidNote/blob/master/ImageLoaderLibrary/Glide%E7%AE%80%E4%BB%8B(%E4%B8%8A).md "Glide简介(上)" -[26]: https://github.com/CharonChui/AndroidNote/blob/master/ImageLoaderLibrary/Glide%E7%AE%80%E4%BB%8B(%E4%B8%8B).md "Glide简介(下)" -[27]: https://github.com/CharonChui/AndroidNote/blob/master/ImageLoaderLibrary/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93%E6%AF%94%E8%BE%83.md "图片加载库比较" -[28]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/1.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%80).md "RxJava详解(一)" -[29]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/2.RxJava%E8%AF%A6%E8%A7%A3(%E4%BA%8C).md "RxJava详解(二)" -[30]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/3.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%89).md "RxJava详解(三)" -[31]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/7.RxJava%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6.md "RxJava系列全家桶" -[32]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/%E7%9B%AE%E5%89%8D%E6%B5%81%E8%A1%8C%E7%9A%84%E5%BC%80%E5%8F%91%E7%BB%84%E5%90%88.md "目前流行的开发组合" -[33]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7.md "性能优化相关工具" -[34]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/Android%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8F%8A%E7%B1%BB%E5%BA%93.md "Android开发工具及类库" -[35]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/Github%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D.md "Github个人主页绑定域名" -[36]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/Markdown%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C.md "Markdown学习手册" -[37]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/MAT%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90.md "MAT内存分析" -[38]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/Kotlin%E5%AD%A6%E4%B9%A0%E6%95%99%E7%A8%8B(%E4%B8%80).md "Kotlin学习教程(一)(未完)" -[39]: https://github.com/CharonChui/AndroidNote/blob/master/Gradle%26Maven/Gradle%E4%B8%93%E9%A2%98.md "Gradle专题" -[40]: https://github.com/CharonChui/AndroidNote/blob/master/Gradle%26Maven/%E5%8F%91%E5%B8%83library%E5%88%B0Maven%E4%BB%93%E5%BA%93.md "发布library到Maven仓库" -[41]: https://github.com/CharonChui/AndroidNote/blob/master/AppPublish/Android%E5%BA%94%E7%94%A8%E5%8F%91%E5%B8%83.md "Android应用发布" -[42]: https://github.com/CharonChui/AndroidNote/blob/master/AppPublish/Zipalign%E4%BC%98%E5%8C%96.md "Zipalign优化" +[12]: ./SourceAnalysis/Netowork/HttpURLConnection%E8%AF%A6%E8%A7%A3.md "HttpURLConnection详解" +[13]: ./SourceAnalysis/Netowork/HttpURLConnection%E4%B8%8EHttpClient.md "HttpURLConnection与HttpClient" +[14]: ./SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md "volley-retrofit-okhttp之我们该如何选择网路框架" +[15]: ./SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" +[16]: ./SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8A).md "Retrofit详解(上)" +[17]: ./SourceAnalysis/Netowork/Retrofit%E8%AF%A6%E8%A7%A3(%E4%B8%8B).md "Retrofit详解(下)" +[18]: ./VideoDevelopment/%E6%90%AD%E5%BB%BAnginx%2Brtmp%E6%9C%8D%E5%8A%A1%E5%99%A8.md "搭建nginx+rtmp服务器" +[19]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E6%80%BB%E7%BB%93.md "视频播放相关内容总结" +[20]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E8%A7%A3%E7%A0%81%E4%B9%8B%E8%BD%AF%E8%A7%A3%E4%B8%8E%E7%A1%AC%E8%A7%A3.md "视频解码之软解与硬解" +[21]: ./VideoDevelopment/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md "音视频基础知识" +[22]: ./VideoDevelopment/Android%20WebRTC%E7%AE%80%E4%BB%8B.md "Android WebRTC简介" +[23]: ./VideoDevelopment/DNS%E5%8F%8AHTTPDNS.md "DNS及HTTPDNS" +[24]: ./VideoDevelopment/DLNA%E7%AE%80%E4%BB%8B.md "DLNA简介" +[25]: ./ImageLoaderLibrary/Glide%E7%AE%80%E4%BB%8B(%E4%B8%8A).md "Glide简介(上)" +[26]: ./ImageLoaderLibrary/Glide%E7%AE%80%E4%BB%8B(%E4%B8%8B).md "Glide简介(下)" +[27]: ./ImageLoaderLibrary/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93%E6%AF%94%E8%BE%83.md "图片加载库比较" +[28]: ./RxJavaPart/1.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%80).md "RxJava详解(一)" +[29]: ./RxJavaPart/2.RxJava%E8%AF%A6%E8%A7%A3(%E4%BA%8C).md "RxJava详解(二)" +[30]: ./RxJavaPart/3.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%89).md "RxJava详解(三)" +[31]: ./RxJavaPart/7.RxJava%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6.md "RxJava系列全家桶" +[32]: ./Tools%26Library/%E7%9B%AE%E5%89%8D%E6%B5%81%E8%A1%8C%E7%9A%84%E5%BC%80%E5%8F%91%E7%BB%84%E5%90%88.md "目前流行的开发组合" +[33]: ./Tools%26Library/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7.md "性能优化相关工具" +[34]: ./Tools%26Library/Android%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8F%8A%E7%B1%BB%E5%BA%93.md "Android开发工具及类库" +[35]: ./Tools%26Library/Github%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D.md "Github个人主页绑定域名" +[36]: ./Tools%26Library/Markdown%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C.md "Markdown学习手册" +[37]: ./Tools%26Library/MAT%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90.md "MAT内存分析" +[38]: ./KotlinCourse/Kotlin%E5%AD%A6%E4%B9%A0%E6%95%99%E7%A8%8B(%E4%B8%80).md "Kotlin学习教程(一)(未完)" +[39]: ./Gradle%26Maven/Gradle%E4%B8%93%E9%A2%98.md "Gradle专题" +[40]: ./Gradle%26Maven/%E5%8F%91%E5%B8%83library%E5%88%B0Maven%E4%BB%93%E5%BA%93.md "发布library到Maven仓库" +[41]: ./AppPublish/Android%E5%BA%94%E7%94%A8%E5%8F%91%E5%B8%83.md "Android应用发布" +[42]: ./AppPublish/Zipalign%E4%BC%98%E5%8C%96.md "Zipalign优化" [43]: https://github.com/CharonChui/AndroidNote/tree/master/SourceAnalysis "源码解析" [44]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment "音视频开发" [45]: https://github.com/CharonChui/AndroidNote/tree/master/ImageLoaderLibrary "图片加载" @@ -400,303 +388,280 @@ Android学习笔记 [52]: https://github.com/CharonChui/AndroidNote/tree/master/AdavancedPart "进阶部分" [53]: https://github.com/CharonChui/AndroidNote/tree/master/JavaKnowledge "Java基础及算法" [54]: https://github.com/CharonChui/AndroidNote/tree/master/BasicKnowledge "基础部分" -[55]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%80%E5%BC%B9).md "AndroidStudio使用教程(第一弹)" -[56]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%BA%8C%E5%BC%B9).md "AndroidStudio使用教程(第二弹)" -[57]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%89%E5%BC%B9).md "AndroidStudio使用教程(第三弹)" -[58]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E5%9B%9B%E5%BC%B9).md "AndroidStudio使用教程(第四弹)" -[59]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%BA%94%E5%BC%B9).md "AndroidStudio使用教程(第五弹)" -[60]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E5%85%AD%E5%BC%B9).md "AndroidStudio使用教程(第六弹)" -[61]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%83%E5%BC%B9).md "AndroidStudio使用教程(第七弹)" -[62]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/Android%20Studio%E4%BD%A0%E5%8F%AF%E8%83%BD%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E6%93%8D%E4%BD%9C.md "Android Studio你可能不知道的操作" -[63]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md "AndroidStudio提高Build速度" -[64]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E4%B8%AD%E8%BF%9B%E8%A1%8Cndk%E5%BC%80%E5%8F%91.md "AndroidStudio中进行ndk开发" -[65]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E5%B8%83%E5%B1%80%E4%BC%98%E5%8C%96.md "布局优化" -[66]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D%E4%B9%8B%E7%99%BE%E5%88%86%E6%AF%94%E6%96%B9%E6%A1%88%E8%AF%A6%E8%A7%A3.md "屏幕适配之百分比方案详解" -[67]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%AE%9E%E7%8E%B0.md "热修复实现" -[68]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E5%A6%82%E4%BD%95%E8%AE%A9Service%E5%B8%B8%E9%A9%BB%E5%86%85%E5%AD%98.md "如何让Service常驻内存" -[69]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md "通过Hardware Layer提高动画性能" -[70]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "性能优化" -[71]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" -[72]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android6.0%E6%9D%83%E9%99%90%E7%B3%BB%E7%BB%9F.md "Android6.0权限系统" -[73]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E7%94%B3%E8%AF%B7%E6%9D%83%E9%99%90%E6%9D%A5%E4%BD%BF%E7%94%A8%E5%AF%B9%E5%BA%94%E5%8A%9F%E8%83%BD.md "Android开发不申请权限来使用对应功能" -[74]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84MVP%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "Android开发中的MVP模式详解" -[75]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%90%AF%E5%8A%A8%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "Android启动模式详解" -[76]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%E5%8D%B8%E8%BD%BD%E5%8F%8D%E9%A6%88.md "Android卸载反馈" -[77]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/ApplicationId%20vs%20PackageName.md "ApplicationId vs PackageName" -[78]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/AndroidRuntime_ART%E4%B8%8EDalvik.md "AndroidRuntime_ART与Dalvik" -[79]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/BroadcastReceiver%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.md "BroadcastReceiver安全问题" -[80]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Crash%E5%8F%8AANR%E5%88%86%E6%9E%90.md "Crash及ANR分析" - -[81]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Library%E9%A1%B9%E7%9B%AE%E4%B8%AD%E8%B5%84%E6%BA%90id%E4%BD%BF%E7%94%A8case%E6%97%B6%E6%8A%A5%E9%94%99.md "Library项目中资源id使用case时报错" -[82]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Mac%E4%B8%8B%E9%85%8D%E7%BD%AEadb%E5%8F%8AAndroid%E5%91%BD%E4%BB%A4.md "Mac下配置adb及Android命令" -[84]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/RecyclerView%E4%B8%93%E9%A2%98.md "RecyclerView专题" -[85]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%A4%A7%E5%85%A8.md "常用命令行大全" -[86]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%8D%95%E4%BE%8B%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F.md "单例的最佳实现方式" -[87]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.md "数据结构" -[88]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E8%8E%B7%E5%8F%96%E4%BB%8A%E5%90%8E%E5%A4%9A%E5%B0%91%E5%A4%A9%E5%90%8E%E7%9A%84%E6%97%A5%E6%9C%9F.md "获取今后多少天后的日期" -[89]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%89%91%E6%8C%87Offer(%E4%B8%8A).md "剑指Offer(上)" -[90]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/剑指Offer(下).md "剑指Offer(下)" -[91]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%BC%BA%E5%BC%95%E7%94%A8%E3%80%81%E8%BD%AF%E5%BC%95%E7%94%A8%E3%80%81%E5%BC%B1%E5%BC%95%E7%94%A8%E3%80%81%E8%99%9A%E5%BC%95%E7%94%A8.md "强引用、软引用、弱引用、虚引用" -[92]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85.md "生产者消费者" -[93]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E6%95%B0%E6%8D%AE%E5%8A%A0%E5%AF%86%E5%8F%8A%E8%A7%A3%E5%AF%86.md "数据加密及解密" -[94]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E6%AD%BB%E9%94%81.md "死锁" -[95]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95.md "算法" -[96]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E6%80%BB%E7%BB%93.md "网络请求相关内容总结" -[97]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E5%8E%9F%E7%90%86.md "线程池的原理" -[98]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Java并发编程之原子性、可见性以及有序性.md "Java并发编程之原子性、可见性以及有序性" -[99]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Base64%E5%8A%A0%E5%AF%86.md "Base64加密" -[100]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Git%E7%AE%80%E4%BB%8B.md "Git简介" -[101]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/hashCode%E4%B8%8Eequals.md "hashCode与equals" -[102]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/HashMap%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md "HashMap实现原理分析" -[103]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E9%A2%98.md "Java基础面试题" -[104]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md "JVM垃圾回收机制" -[105]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/MD5%E5%8A%A0%E5%AF%86.md "MD5加密" -[106]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/MVC%E4%B8%8EMVP%E5%8F%8AMVVM.md "MVC与MVP及MVVM" -[107]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/RMB%E5%A4%A7%E5%B0%8F%E5%86%99%E8%BD%AC%E6%8D%A2.md "RMB大小写转换" -[108]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Vim%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md "Vim使用教程" -[109]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/volatile%E5%92%8CSynchronized%E5%8C%BA%E5%88%AB.md "volatile和Synchronized区别" -[110]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%AE%89%E5%85%A8%E9%80%80%E5%87%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.md "安全退出应用程序" -[111]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E7%97%85%E6%AF%92.md "病毒" -[112]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%B6%85%E7%BA%A7%E7%AE%A1%E7%90%86%E5%91%98(DevicePoliceManager).md "超级管理员(DevicePoliceManager)" -[113]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%90%AF%E5%8A%A8%E3%80%81%E5%8D%B8%E8%BD%BD%E5%92%8C%E5%88%86%E4%BA%AB.md "程序的启动、卸载和分享" -[114]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86.md "代码混淆" -[115]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%AF%BB%E5%8F%96%E7%94%A8%E6%88%B7logcat%E6%97%A5%E5%BF%97.md "读取用户logcat日志" -[116]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E7%9F%AD%E4%BF%A1%E5%B9%BF%E6%92%AD%E6%8E%A5%E6%94%B6%E8%80%85.md "短信广播接收者" -[117]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%96%AD%E7%82%B9%E4%B8%8B%E8%BD%BD.md "多线程断点下载" -[118]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E9%BB%91%E5%90%8D%E5%8D%95%E6%8C%82%E6%96%AD%E7%94%B5%E8%AF%9D%E5%8F%8A%E5%88%A0%E9%99%A4%E7%94%B5%E8%AF%9D%E8%AE%B0%E5%BD%95.md "黑名单挂断电话及删除电话记录" -[119]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%A8%AA%E5%90%91ListView.md "横向ListView" -[120]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%BB%91%E5%8A%A8%E5%88%87%E6%8D%A2Activity(GestureDetector).md "滑动切换Activity(GestureDetector)" -[121]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%8E%B7%E5%8F%96%E8%81%94%E7%B3%BB%E4%BA%BA.md "获取联系人" -[122]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%8E%B7%E5%8F%96%E6%89%8B%E6%9C%BA%E5%8F%8ASD%E5%8D%A1%E5%8F%AF%E7%94%A8%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4.md "获取手机及SD卡可用存储空间" -[123]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%8E%B7%E5%8F%96%E6%89%8B%E6%9C%BA%E4%B8%AD%E6%89%80%E6%9C%89%E5%AE%89%E8%A3%85%E7%9A%84%E7%A8%8B%E5%BA%8F.md "获取手机中所有安装的程序" -[124]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%8E%B7%E5%8F%96%E4%BD%8D%E7%BD%AE(LocationManager).md "获取位置(LocationManager)" -[125]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BC%93%E5%AD%98%E5%8F%8A%E4%B8%80%E9%94%AE%E6%B8%85%E7%90%86.md "获取应用程序缓存及一键清理" -[126]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%BC%80%E5%8F%91%E4%B8%AD%E5%BC%82%E5%B8%B8%E7%9A%84%E5%A4%84%E7%90%86.md "开发中异常的处理" -[127]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%BC%80%E5%8F%91%E4%B8%ADLog%E7%9A%84%E7%AE%A1%E7%90%86.md "开发中Log的管理" -[128]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F%E5%B7%A5%E5%85%B7%E7%B1%BB.md "快捷方式工具类" -[129]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%9D%A5%E7%94%B5%E5%8F%B7%E7%A0%81%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%8F%90%E7%A4%BA%E6%A1%86.md "来电号码归属地提示框" -[130]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%9D%A5%E7%94%B5%E7%9B%91%E5%90%AC%E5%8F%8A%E5%BD%95%E9%9F%B3.md "来电监听及录音" -[131]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E9%9B%B6%E6%9D%83%E9%99%90%E4%B8%8A%E4%BC%A0%E6%95%B0%E6%8D%AE.md "零权限上传数据" -[132]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md "内存泄漏" -[133]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D.md "屏幕适配" -[134]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8(ActivityManager).md "任务管理器(ActivityManager)" -[135]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%89%8B%E6%9C%BA%E6%91%87%E6%99%83.md "手机摇晃" -[136]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E7%AB%96%E7%9D%80%E7%9A%84Seekbar.md "竖着的Seekbar" -[137]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8.md "数据存储" -[138]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%90%9C%E7%B4%A2%E6%A1%86.md "搜索框" -[139]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E9%94%81%E5%B1%8F%E4%BB%A5%E5%8F%8A%E8%A7%A3%E9%94%81%E7%9B%91%E5%90%AC.md "锁屏以及解锁监听" -[140]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.md "文件上传" -[141]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0ListView.md "下拉刷新ListView" -[142]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E4%BF%AE%E6%94%B9%E7%B3%BB%E7%BB%9F%E7%BB%84%E4%BB%B6%E6%A0%B7%E5%BC%8F.md "修改系统组件样式" -[143]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E9%9F%B3%E9%87%8F%E5%8F%8A%E5%B1%8F%E5%B9%95%E4%BA%AE%E5%BA%A6%E8%B0%83%E8%8A%82.md "音量及屏幕亮度调节" -[144]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%BA%94%E7%94%A8%E5%AE%89%E8%A3%85.md "应用安装" -[145]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%BA%94%E7%94%A8%E5%90%8E%E5%8F%B0%E5%94%A4%E9%86%92%E5%90%8E%E6%95%B0%E6%8D%AE%E7%9A%84%E5%88%B7%E6%96%B0.md "应用后台唤醒后数据的刷新" -[146]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E7%9F%A5%E8%AF%86%E5%A4%A7%E6%9D%82%E7%83%A9.md "知识大杂烩" -[147]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E6%8B%B7%E8%B4%9D%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F.md "资源文件拷贝的三种方式" -[148]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%83%8C%E6%99%AF.md "自定义背景" -[149]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6.md "自定义控件" -[150]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8A%B6%E6%80%81%E6%A0%8F%E9%80%9A%E7%9F%A5.md "自定义状态栏通知" -[151]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89Toast.md "自定义Toast" -[152]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/adb%20logcat%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B.md "adb logcat使用简介" -[153]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83.md "Android编码规范" -[154]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E5%8A%A8%E7%94%BB.md "Android动画" -[155]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E9%A2%98.md "Android基础面试题" -[156]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D.md "Android入门介绍" -[157]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6%E4%B9%8BContentProvider.md "Android四大组件之ContentProvider" -[158]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Android%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6%E4%B9%8BService.md "Android四大组件之Service" -[159]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Ant%E6%89%93%E5%8C%85.md "Ant打包" -[160]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Bitmap%E4%BC%98%E5%8C%96.md "Bitmap优化" -[161]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Fragment%E4%B8%93%E9%A2%98.md "Fragment专题" -[162]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Home%E9%94%AE%E7%9B%91%E5%90%AC.md "Home键监听" -[163]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/HttpClient%E6%89%A7%E8%A1%8CGet%E5%92%8CPost%E8%AF%B7%E6%B1%82.md "HttpClient执行Get和Post请求" -[164]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/JNI_C%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80.md "JNI_C语言基础" -[165]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/JNI%E5%9F%BA%E7%A1%80.md "JNI基础" -[166]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/ListView%E4%B8%93%E9%A2%98.md "ListView专题" -[167]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Parcelable%E5%8F%8ASerializable.md "Parcelable及Serializable" -[168]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/PopupWindow%E7%BB%86%E8%8A%82.md "PopupWindow细节" -[169]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Scroller%E7%AE%80%E4%BB%8B.md "Scroller简介" -[170]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/ScrollingTabs.md "ScrollingTabs" -[171]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/SDK%20Manager%E6%97%A0%E6%B3%95%E6%9B%B4%E6%96%B0%E7%9A%84%E9%97%AE%E9%A2%98.md "SDK Manager无法更新的问题" -[172]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Selector%E4%BD%BF%E7%94%A8.md "Selector使用" -[173]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/SlidingMenu.md "SlidingMenu" -[174]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/String%E6%A0%BC%E5%BC%8F%E5%8C%96.md "String格式化" -[175]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/TextView%E8%B7%91%E9%A9%AC%E7%81%AF%E6%95%88%E6%9E%9C.md "TextView跑马灯效果" -[176]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/WebView%E6%80%BB%E7%BB%93.md "WebView总结" -[177]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Widget(%E7%AA%97%E5%8F%A3%E5%B0%8F%E9%83%A8%E4%BB%B6).md "Widget(窗口小部件)" -[178]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/Wifi%E7%8A%B6%E6%80%81%E7%9B%91%E5%90%AC.md "Wifi状态监听" -[179]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/XmlPullParser.md "XmlPullParser" - - -[180]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/1.Kotlin_%E7%AE%80%E4%BB%8B%26%E5%8F%98%E9%87%8F%26%E7%B1%BB%26%E6%8E%A5%E5%8F%A3.md "1.Kotlin_简介&变量&类&接口" -[181]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md "2.Kotlin_高阶函数&Lambda&内联函数.md" -[182]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md "3.Kotlin_数字&字符串&数组&集合" -[183]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md "4.Kotlin_表达式&关键字" -[184]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md "5.Kotlin_内部类&密封类&枚举&委托" -[185]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md "6.Kotlin_多继承问题" -[186]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md "7.Kotlin_注解&反射&扩展" -[187]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md "8.Kotlin_协程" -[188]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/9.Kotlin_androidktx.md "9.Kotlin_androidktx" -[189]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%85%AB%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md "八种排序算法" -[190]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%AE%80%E4%BB%8B.md "线程池简介" -[191]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md "设计模式" -[192]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E7%AE%97%E6%B3%95%E7%9A%84%E5%A4%8D%E6%9D%82%E5%BA%A6.md "算法复杂度" -[193]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86.md "动态代理" -[194]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/ConstraintLaayout%E7%AE%80%E4%BB%8B.md "ConstraintLaayout简介" -[195]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Http%E4%B8%8EHttps%E7%9A%84%E5%8C%BA%E5%88%AB.md "Http与Https的区别" -[196]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Top-K%E9%97%AE%E9%A2%98.md "Top-K问题" -[197]: https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/10.Kotlin_%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md "10.Kotlin_设计模式" -[198]: https://github.com/CharonChui/AndroidNote/blob/master/AppPublish/%E4%BD%BF%E7%94%A8Jenkins%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%8C%96%E6%89%93%E5%8C%85.md "使用Jenkins实现自动化打包" +[55]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%80%E5%BC%B9).md "AndroidStudio使用教程(第一弹)" +[56]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%BA%8C%E5%BC%B9).md "AndroidStudio使用教程(第二弹)" +[57]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%89%E5%BC%B9).md "AndroidStudio使用教程(第三弹)" +[58]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E5%9B%9B%E5%BC%B9).md "AndroidStudio使用教程(第四弹)" +[59]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%BA%94%E5%BC%B9).md "AndroidStudio使用教程(第五弹)" +[60]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E5%85%AD%E5%BC%B9).md "AndroidStudio使用教程(第六弹)" +[61]: ./AndroidStudioCourse/AndroidStudio%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B(%E7%AC%AC%E4%B8%83%E5%BC%B9).md "AndroidStudio使用教程(第七弹)" +[62]: ./AndroidStudioCourse/Android%20Studio%E4%BD%A0%E5%8F%AF%E8%83%BD%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E6%93%8D%E4%BD%9C.md "Android Studio你可能不知道的操作" +[63]: ./AndroidStudioCourse/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md "AndroidStudio提高Build速度" +[64]: ./AndroidStudioCourse/AndroidStudio%E4%B8%AD%E8%BF%9B%E8%A1%8Cndk%E5%BC%80%E5%8F%91.md "AndroidStudio中进行ndk开发" +[65]: ./AdavancedPart/%E5%B8%83%E5%B1%80%E4%BC%98%E5%8C%96.md "布局优化" +[66]: ./AdavancedPart/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D%E4%B9%8B%E7%99%BE%E5%88%86%E6%AF%94%E6%96%B9%E6%A1%88%E8%AF%A6%E8%A7%A3.md "屏幕适配之百分比方案详解" +[67]: ./AdavancedPart/%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%AE%9E%E7%8E%B0.md "热修复实现" +[68]: ./AdavancedPart/%E5%A6%82%E4%BD%95%E8%AE%A9Service%E5%B8%B8%E9%A9%BB%E5%86%85%E5%AD%98.md "如何让Service常驻内存" +[69]: ./AdavancedPart/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md "通过Hardware Layer提高动画性能" +[70]: ./AdavancedPart/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "性能优化" +[71]: ./AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" +[72]: ./AdavancedPart/Android6.0%E6%9D%83%E9%99%90%E7%B3%BB%E7%BB%9F.md "Android6.0权限系统" +[73]: ./AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E7%94%B3%E8%AF%B7%E6%9D%83%E9%99%90%E6%9D%A5%E4%BD%BF%E7%94%A8%E5%AF%B9%E5%BA%94%E5%8A%9F%E8%83%BD.md "Android开发不申请权限来使用对应功能" +[74]: ./AdavancedPart/Android%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84MVP%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "Android开发中的MVP模式详解" +[75]: ./AdavancedPart/Android%E5%90%AF%E5%8A%A8%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "Android启动模式详解" +[76]: ./AdavancedPart/Android%E5%8D%B8%E8%BD%BD%E5%8F%8D%E9%A6%88.md "Android卸载反馈" +[77]: ./AdavancedPart/ApplicationId%20vs%20PackageName.md "ApplicationId vs PackageName" +[78]: ./AdavancedPart/AndroidRuntime_ART%E4%B8%8EDalvik.md "AndroidRuntime_ART与Dalvik" +[79]: ./AdavancedPart/BroadcastReceiver%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.md "BroadcastReceiver安全问题" +[80]: ./AdavancedPart/Crash%E5%8F%8AANR%E5%88%86%E6%9E%90.md "Crash及ANR分析" + +[81]: ./AdavancedPart/Library%E9%A1%B9%E7%9B%AE%E4%B8%AD%E8%B5%84%E6%BA%90id%E4%BD%BF%E7%94%A8case%E6%97%B6%E6%8A%A5%E9%94%99.md "Library项目中资源id使用case时报错" +[82]: ./AdavancedPart/Mac%E4%B8%8B%E9%85%8D%E7%BD%AEadb%E5%8F%8AAndroid%E5%91%BD%E4%BB%A4.md "Mac下配置adb及Android命令" +[84]: ./AdavancedPart/RecyclerView%E4%B8%93%E9%A2%98.md "RecyclerView专题" +[85]: ./JavaKnowledge/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%A4%A7%E5%85%A8.md "常用命令行大全" +[86]: ./JavaKnowledge/%E5%8D%95%E4%BE%8B%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F.md "单例的最佳实现方式" +[87]: ./JavaKnowledge/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.md "数据结构" +[88]: ./JavaKnowledge/%E8%8E%B7%E5%8F%96%E4%BB%8A%E5%90%8E%E5%A4%9A%E5%B0%91%E5%A4%A9%E5%90%8E%E7%9A%84%E6%97%A5%E6%9C%9F.md "获取今后多少天后的日期" +[89]: ./JavaKnowledge/%E5%89%91%E6%8C%87Offer(%E4%B8%8A).md "剑指Offer(上)" +[90]: ./JavaKnowledge/剑指Offer(下).md "剑指Offer(下)" +[91]: ./JavaKnowledge/%E5%BC%BA%E5%BC%95%E7%94%A8%E3%80%81%E8%BD%AF%E5%BC%95%E7%94%A8%E3%80%81%E5%BC%B1%E5%BC%95%E7%94%A8%E3%80%81%E8%99%9A%E5%BC%95%E7%94%A8.md "强引用、软引用、弱引用、虚引用" +[92]: ./JavaKnowledge/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85.md "生产者消费者" +[93]: ./JavaKnowledge/%E6%95%B0%E6%8D%AE%E5%8A%A0%E5%AF%86%E5%8F%8A%E8%A7%A3%E5%AF%86.md "数据加密及解密" +[94]: ./JavaKnowledge/%E6%AD%BB%E9%94%81.md "死锁" +[95]: ./JavaKnowledge/%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95.md "算法" +[96]: ./JavaKnowledge/%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E6%80%BB%E7%BB%93.md "网络请求相关内容总结" +[97]: ./JavaKnowledge/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E5%8E%9F%E7%90%86.md "线程池的原理" +[98]: ./JavaKnowledge/Java并发编程之原子性、可见性以及有序性.md "Java并发编程之原子性、可见性以及有序性" +[99]: ./JavaKnowledge/Base64%E5%8A%A0%E5%AF%86.md "Base64加密" +[100]: ./JavaKnowledge/Git%E7%AE%80%E4%BB%8B.md "Git简介" +[101]: ./JavaKnowledge/hashCode%E4%B8%8Eequals.md "hashCode与equals" +[102]: ./JavaKnowledge/HashMap%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md "HashMap实现原理分析" +[103]: ./JavaKnowledge/Java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E9%A2%98.md "Java基础面试题" +[104]: ./JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md "JVM垃圾回收机制" +[105]: ./JavaKnowledge/MD5%E5%8A%A0%E5%AF%86.md "MD5加密" +[106]: ./JavaKnowledge/MVC%E4%B8%8EMVP%E5%8F%8AMVVM.md "MVC与MVP及MVVM" +[107]: ./JavaKnowledge/RMB%E5%A4%A7%E5%B0%8F%E5%86%99%E8%BD%AC%E6%8D%A2.md "RMB大小写转换" +[108]: ./JavaKnowledge/Vim%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md "Vim使用教程" +[109]: ./JavaKnowledge/volatile%E5%92%8CSynchronized%E5%8C%BA%E5%88%AB.md "volatile和Synchronized区别" +[110]: ./BasicKnowledge/%E5%AE%89%E5%85%A8%E9%80%80%E5%87%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.md "安全退出应用程序" +[111]: ./BasicKnowledge/%E7%97%85%E6%AF%92.md "病毒" +[112]: ./BasicKnowledge/%E8%B6%85%E7%BA%A7%E7%AE%A1%E7%90%86%E5%91%98(DevicePoliceManager).md "超级管理员(DevicePoliceManager)" +[113]: ./BasicKnowledge/%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%90%AF%E5%8A%A8%E3%80%81%E5%8D%B8%E8%BD%BD%E5%92%8C%E5%88%86%E4%BA%AB.md "程序的启动、卸载和分享" +[114]: ./BasicKnowledge/%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86.md "代码混淆" +[115]: ./BasicKnowledge/%E8%AF%BB%E5%8F%96%E7%94%A8%E6%88%B7logcat%E6%97%A5%E5%BF%97.md "读取用户logcat日志" +[116]: ./BasicKnowledge/%E7%9F%AD%E4%BF%A1%E5%B9%BF%E6%92%AD%E6%8E%A5%E6%94%B6%E8%80%85.md "短信广播接收者" +[117]: ./BasicKnowledge/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%96%AD%E7%82%B9%E4%B8%8B%E8%BD%BD.md "多线程断点下载" +[118]: ./BasicKnowledge/%E9%BB%91%E5%90%8D%E5%8D%95%E6%8C%82%E6%96%AD%E7%94%B5%E8%AF%9D%E5%8F%8A%E5%88%A0%E9%99%A4%E7%94%B5%E8%AF%9D%E8%AE%B0%E5%BD%95.md "黑名单挂断电话及删除电话记录" +[119]: ./BasicKnowledge/%E6%A8%AA%E5%90%91ListView.md "横向ListView" +[120]: ./BasicKnowledge/%E6%BB%91%E5%8A%A8%E5%88%87%E6%8D%A2Activity(GestureDetector).md "滑动切换Activity(GestureDetector)" +[121]: ./BasicKnowledge/%E8%8E%B7%E5%8F%96%E8%81%94%E7%B3%BB%E4%BA%BA.md "获取联系人" +[122]: ./BasicKnowledge/%E8%8E%B7%E5%8F%96%E6%89%8B%E6%9C%BA%E5%8F%8ASD%E5%8D%A1%E5%8F%AF%E7%94%A8%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4.md "获取手机及SD卡可用存储空间" +[123]: ./BasicKnowledge/%E8%8E%B7%E5%8F%96%E6%89%8B%E6%9C%BA%E4%B8%AD%E6%89%80%E6%9C%89%E5%AE%89%E8%A3%85%E7%9A%84%E7%A8%8B%E5%BA%8F.md "获取手机中所有安装的程序" +[124]: ./BasicKnowledge/%E8%8E%B7%E5%8F%96%E4%BD%8D%E7%BD%AE(LocationManager).md "获取位置(LocationManager)" +[125]: ./BasicKnowledge/%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BC%93%E5%AD%98%E5%8F%8A%E4%B8%80%E9%94%AE%E6%B8%85%E7%90%86.md "获取应用程序缓存及一键清理" +[126]: ./BasicKnowledge/%E5%BC%80%E5%8F%91%E4%B8%AD%E5%BC%82%E5%B8%B8%E7%9A%84%E5%A4%84%E7%90%86.md "开发中异常的处理" +[127]: ./BasicKnowledge/%E5%BC%80%E5%8F%91%E4%B8%ADLog%E7%9A%84%E7%AE%A1%E7%90%86.md "开发中Log的管理" +[128]: ./BasicKnowledge/%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F%E5%B7%A5%E5%85%B7%E7%B1%BB.md "快捷方式工具类" +[129]: ./BasicKnowledge/%E6%9D%A5%E7%94%B5%E5%8F%B7%E7%A0%81%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%8F%90%E7%A4%BA%E6%A1%86.md "来电号码归属地提示框" +[130]: ./BasicKnowledge/%E6%9D%A5%E7%94%B5%E7%9B%91%E5%90%AC%E5%8F%8A%E5%BD%95%E9%9F%B3.md "来电监听及录音" +[131]: ./BasicKnowledge/%E9%9B%B6%E6%9D%83%E9%99%90%E4%B8%8A%E4%BC%A0%E6%95%B0%E6%8D%AE.md "零权限上传数据" +[132]: ./BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md "内存泄漏" +[133]: ./BasicKnowledge/%E5%B1%8F%E5%B9%95%E9%80%82%E9%85%8D.md "屏幕适配" +[134]: ./BasicKnowledge/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8(ActivityManager).md "任务管理器(ActivityManager)" +[135]: ./BasicKnowledge/%E6%89%8B%E6%9C%BA%E6%91%87%E6%99%83.md "手机摇晃" +[136]: ./BasicKnowledge/%E7%AB%96%E7%9D%80%E7%9A%84Seekbar.md "竖着的Seekbar" +[137]: ./BasicKnowledge/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8.md "数据存储" +[138]: ./BasicKnowledge/%E6%90%9C%E7%B4%A2%E6%A1%86.md "搜索框" +[139]: ./BasicKnowledge/%E9%94%81%E5%B1%8F%E4%BB%A5%E5%8F%8A%E8%A7%A3%E9%94%81%E7%9B%91%E5%90%AC.md "锁屏以及解锁监听" +[140]: ./BasicKnowledge/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.md "文件上传" +[141]: ./BasicKnowledge/%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0ListView.md "下拉刷新ListView" +[142]: ./BasicKnowledge/%E4%BF%AE%E6%94%B9%E7%B3%BB%E7%BB%9F%E7%BB%84%E4%BB%B6%E6%A0%B7%E5%BC%8F.md "修改系统组件样式" +[143]: ./BasicKnowledge/%E9%9F%B3%E9%87%8F%E5%8F%8A%E5%B1%8F%E5%B9%95%E4%BA%AE%E5%BA%A6%E8%B0%83%E8%8A%82.md "音量及屏幕亮度调节" +[144]: ./BasicKnowledge/%E5%BA%94%E7%94%A8%E5%AE%89%E8%A3%85.md "应用安装" +[145]: ./BasicKnowledge/%E5%BA%94%E7%94%A8%E5%90%8E%E5%8F%B0%E5%94%A4%E9%86%92%E5%90%8E%E6%95%B0%E6%8D%AE%E7%9A%84%E5%88%B7%E6%96%B0.md "应用后台唤醒后数据的刷新" +[146]: ./BasicKnowledge/%E7%9F%A5%E8%AF%86%E5%A4%A7%E6%9D%82%E7%83%A9.md "知识大杂烩" +[147]: ./BasicKnowledge/%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E6%8B%B7%E8%B4%9D%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F.md "资源文件拷贝的三种方式" +[148]: ./BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%83%8C%E6%99%AF.md "自定义背景" +[149]: ./BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6.md "自定义控件" +[150]: ./BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8A%B6%E6%80%81%E6%A0%8F%E9%80%9A%E7%9F%A5.md "自定义状态栏通知" +[151]: ./BasicKnowledge/%E8%87%AA%E5%AE%9A%E4%B9%89Toast.md "自定义Toast" +[152]: ./BasicKnowledge/adb%20logcat%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B.md "adb logcat使用简介" +[153]: ./BasicKnowledge/Android%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83.md "Android编码规范" +[154]: ./BasicKnowledge/Android%E5%8A%A8%E7%94%BB.md "Android动画" +[155]: ./BasicKnowledge/Android%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E9%A2%98.md "Android基础面试题" +[156]: ./BasicKnowledge/Android%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D.md "Android入门介绍" +[157]: ./BasicKnowledge/Android%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6%E4%B9%8BContentProvider.md "Android四大组件之ContentProvider" +[158]: ./BasicKnowledge/Android%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6%E4%B9%8BService.md "Android四大组件之Service" +[160]: ./BasicKnowledge/Bitmap%E4%BC%98%E5%8C%96.md "Bitmap优化" +[161]: ./BasicKnowledge/Fragment%E4%B8%93%E9%A2%98.md "Fragment专题" +[162]: ./BasicKnowledge/Home%E9%94%AE%E7%9B%91%E5%90%AC.md "Home键监听" +[163]: ./BasicKnowledge/HttpClient%E6%89%A7%E8%A1%8CGet%E5%92%8CPost%E8%AF%B7%E6%B1%82.md "HttpClient执行Get和Post请求" +[164]: ./BasicKnowledge/JNI_C%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80.md "JNI_C语言基础" +[165]: ./BasicKnowledge/JNI%E5%9F%BA%E7%A1%80.md "JNI基础" +[166]: ./BasicKnowledge/ListView%E4%B8%93%E9%A2%98.md "ListView专题" +[167]: ./BasicKnowledge/Parcelable%E5%8F%8ASerializable.md "Parcelable及Serializable" +[168]: ./BasicKnowledge/PopupWindow%E7%BB%86%E8%8A%82.md "PopupWindow细节" +[169]: ./BasicKnowledge/Scroller%E7%AE%80%E4%BB%8B.md "Scroller简介" +[170]: ./BasicKnowledge/ScrollingTabs.md "ScrollingTabs" +[171]: ./BasicKnowledge/SDK%20Manager%E6%97%A0%E6%B3%95%E6%9B%B4%E6%96%B0%E7%9A%84%E9%97%AE%E9%A2%98.md "SDK Manager无法更新的问题" +[172]: ./BasicKnowledge/Selector%E4%BD%BF%E7%94%A8.md "Selector使用" +[173]: ./BasicKnowledge/SlidingMenu.md "SlidingMenu" +[174]: ./BasicKnowledge/String%E6%A0%BC%E5%BC%8F%E5%8C%96.md "String格式化" +[175]: ./BasicKnowledge/TextView%E8%B7%91%E9%A9%AC%E7%81%AF%E6%95%88%E6%9E%9C.md "TextView跑马灯效果" +[176]: ./BasicKnowledge/WebView%E6%80%BB%E7%BB%93.md "WebView总结" +[177]: ./BasicKnowledge/Widget(%E7%AA%97%E5%8F%A3%E5%B0%8F%E9%83%A8%E4%BB%B6).md "Widget(窗口小部件)" +[178]: ./BasicKnowledge/Wifi%E7%8A%B6%E6%80%81%E7%9B%91%E5%90%AC.md "Wifi状态监听" +[179]: ./BasicKnowledge/XmlPullParser.md "XmlPullParser" + + +[180]: ./KotlinCourse/1.Kotlin_%E7%AE%80%E4%BB%8B%26%E5%8F%98%E9%87%8F%26%E7%B1%BB%26%E6%8E%A5%E5%8F%A3.md "1.Kotlin_简介&变量&类&接口" +[181]: ./KotlinCourse/2.Kotlin_%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%26Lambda%26%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0.md "2.Kotlin_高阶函数&Lambda&内联函数.md" +[182]: ./KotlinCourse/3.Kotlin_%E6%95%B0%E5%AD%97%26%E5%AD%97%E7%AC%A6%E4%B8%B2%26%E6%95%B0%E7%BB%84%26%E9%9B%86%E5%90%88.md "3.Kotlin_数字&字符串&数组&集合" +[183]: ./KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md "4.Kotlin_表达式&关键字" +[184]: ./KotlinCourse/5.Kotlin_%E5%86%85%E9%83%A8%E7%B1%BB%26%E5%AF%86%E5%B0%81%E7%B1%BB%26%E6%9E%9A%E4%B8%BE%26%E5%A7%94%E6%89%98.md "5.Kotlin_内部类&密封类&枚举&委托" +[185]: ./KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md "6.Kotlin_多继承问题" +[186]: ./KotlinCourse/7.Kotlin_%E6%B3%A8%E8%A7%A3%26%E5%8F%8D%E5%B0%84%26%E6%89%A9%E5%B1%95.md "7.Kotlin_注解&反射&扩展" +[187]: ./KotlinCourse/8.Kotlin_%E5%8D%8F%E7%A8%8B.md "8.Kotlin_协程" +[188]: ./KotlinCourse/9.Kotlin_androidktx.md "9.Kotlin_androidktx" +[189]: ./JavaKnowledge/%E5%85%AB%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md "八种排序算法" +[190]: ./JavaKnowledge/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%AE%80%E4%BB%8B.md "线程池简介" +[191]: ./JavaKnowledge/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md "设计模式" +[192]: ./JavaKnowledge/%E7%AE%97%E6%B3%95%E7%9A%84%E5%A4%8D%E6%9D%82%E5%BA%A6.md "算法复杂度" +[193]: ./JavaKnowledge/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86.md "动态代理" +[194]: ./AdavancedPart/ConstraintLaayout%E7%AE%80%E4%BB%8B.md "ConstraintLaayout简介" +[195]: ./JavaKnowledge/Http%E4%B8%8EHttps%E7%9A%84%E5%8C%BA%E5%88%AB.md "Http与Https的区别" +[196]: ./JavaKnowledge/Top-K%E9%97%AE%E9%A2%98.md "Top-K问题" +[197]: ./KotlinCourse/10.Kotlin_%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md "10.Kotlin_设计模式" +[198]: ./AppPublish/%E4%BD%BF%E7%94%A8Jenkins%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%8C%96%E6%89%93%E5%8C%85.md "使用Jenkins实现自动化打包" [199]: https://github.com/CharonChui/AndroidNote/tree/master/Dagger2 "Dagger2" -[200]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/1.Dagger2%E7%AE%80%E4%BB%8B(%E4%B8%80).md "1.Dagger2简介(一).md" -[201]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/2.Dagger2%E5%85%A5%E9%97%A8demo(%E4%BA%8C).md "2.Dagger2入门demo(二).md" -[202]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/3.Dagger2%E5%85%A5%E9%97%A8demo%E6%89%A9%E5%B1%95(%E4%B8%89).md "3.Dagger2入门demo扩展(三).md" -[203]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/4.Dagger2%E5%8D%95%E4%BE%8B(%E5%9B%9B).md "4.Dagger2单例(四).md" -[204]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/5.Dagger2Lay%E5%92%8CProvider(%E4%BA%94).md "5.Dagger2Lay和Provider(五).md" -[205]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/6.Dagger2Android%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81(%E5%85%AD).md "6.Dagger2Android示例代码(六).md" -[206]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/7.Dagger2%E4%B9%8Bdagger-android(%E4%B8%83).md "7.Dagger2之dagger-android(七).md" -[207]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/8.Dagger2%E4%B8%8EMVP(%E5%85%AB).md "8.Dagger2与MVP(八).md" -[208]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/Android%20WorkManager.md "Android WorkManager.md" - -[209]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/4.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E5%9B%9B).md "4.RxJava详解之执行原理(四)" -[210]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/5.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%AC%A6%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E4%BA%94).md "5.RxJava详解之操作符执行原理(五)" -[211]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/6.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%BA%BF%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86(%E5%85%AD).md "6.RxJava详解之线程调度原理(六)" -[212]: https://github.com/CharonChui/AndroidNote/blob/master/Dagger2/9.Dagger2%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90(%E4%B9%9D).md "9.Dagger2原理分析(九)" -[213]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/%E8%B0%83%E8%AF%95%E5%B9%B3%E5%8F%B0Sonar.md "调试平台Sonar" -[214]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/AudioTrack%E7%AE%80%E4%BB%8B.md "AudioTrack简介" -[215]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/OOM%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90.md "OOM问题分析" +[200]: ./Dagger2/1.Dagger2%E7%AE%80%E4%BB%8B(%E4%B8%80).md "1.Dagger2简介(一).md" +[201]: ./Dagger2/2.Dagger2%E5%85%A5%E9%97%A8demo(%E4%BA%8C).md "2.Dagger2入门demo(二).md" +[202]: ./Dagger2/3.Dagger2%E5%85%A5%E9%97%A8demo%E6%89%A9%E5%B1%95(%E4%B8%89).md "3.Dagger2入门demo扩展(三).md" +[203]: ./Dagger2/4.Dagger2%E5%8D%95%E4%BE%8B(%E5%9B%9B).md "4.Dagger2单例(四).md" +[204]: ./Dagger2/5.Dagger2Lay%E5%92%8CProvider(%E4%BA%94).md "5.Dagger2Lay和Provider(五).md" +[205]: ./Dagger2/6.Dagger2Android%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81(%E5%85%AD).md "6.Dagger2Android示例代码(六).md" +[206]: ./Dagger2/7.Dagger2%E4%B9%8Bdagger-android(%E4%B8%83).md "7.Dagger2之dagger-android(七).md" +[207]: ./Dagger2/8.Dagger2%E4%B8%8EMVP(%E5%85%AB).md "8.Dagger2与MVP(八).md" +[208]: ./AdavancedPart/Android%20WorkManager.md "Android WorkManager.md" + +[209]: ./RxJavaPart/4.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E5%9B%9B).md "4.RxJava详解之执行原理(四)" +[210]: ./RxJavaPart/5.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%AC%A6%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E4%BA%94).md "5.RxJava详解之操作符执行原理(五)" +[211]: ./RxJavaPart/6.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%BA%BF%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86(%E5%85%AD).md "6.RxJava详解之线程调度原理(六)" +[212]: ./Dagger2/9.Dagger2%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90(%E4%B9%9D).md "9.Dagger2原理分析(九)" +[213]: ./Tools%26Library/%E8%B0%83%E8%AF%95%E5%B9%B3%E5%8F%B0Sonar.md "调试平台Sonar" +[214]: ./VideoDevelopment/AudioTrack%E7%AE%80%E4%BB%8B.md "AudioTrack简介" +[215]: ./AdavancedPart/OOM%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90.md "OOM问题分析" [216]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/ExoPlayer "ExoPlayer" -[217]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/1.%20ExoPlayer%E7%AE%80%E4%BB%8B.md "1. ExoPlayer简介" -[218]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md "2. ExoPlayer MediaSource简介" -[219]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md "3. ExoPlayer源码分析之prepare方法" -[220]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/4.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E5%BA%8F%E5%88%97%E5%9B%BE.md "4. ExoPlayer源码分析之prepare序列图" -[221]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/5.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8BPlayerView.md "5. ExoPlayer源码分析之PlayerView" -[222]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%8F%8D%E7%BC%96%E8%AF%91.md "反编译" -[223]: https://github.com/CharonChui/AndroidNote/blob/master/Tools%26Library/Icon%E5%88%B6%E4%BD%9C.md "Icon制作" +[217]: ./VideoDevelopment/ExoPlayer/1.%20ExoPlayer%E7%AE%80%E4%BB%8B.md "1. ExoPlayer简介" +[218]: ./VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md "2. ExoPlayer MediaSource简介" +[219]: ./VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md "3. ExoPlayer源码分析之prepare方法" +[220]: ./VideoDevelopment/ExoPlayer/4.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E5%BA%8F%E5%88%97%E5%9B%BE.md "4. ExoPlayer源码分析之prepare序列图" +[221]: ./VideoDevelopment/ExoPlayer/5.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8BPlayerView.md "5. ExoPlayer源码分析之PlayerView" +[222]: ./BasicKnowledge/%E5%8F%8D%E7%BC%96%E8%AF%91.md "反编译" +[223]: ./Tools%26Library/Icon%E5%88%B6%E4%BD%9C.md "Icon制作" [224]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE "流媒体协议" [225]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F "视频封装格式" -[226]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/SurfaceView%E4%B8%8ETextureView.md "SurfaceView与TextureView" -[227]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E5%85%B3%E9%94%AE%E5%B8%A7.md "关键帧" -[228]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/CDN%E5%8F%8APCDN.md "CDN及PCDN" +[226]: ./VideoDevelopment/SurfaceView%E4%B8%8ETextureView.md "SurfaceView与TextureView" +[227]: ./VideoDevelopment/%E5%85%B3%E9%94%AE%E5%B8%A7.md "关键帧" +[228]: ./VideoDevelopment/CDN%E5%8F%8APCDN.md "CDN及PCDN" [229]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/P2P%E6%8A%80%E6%9C%AF "P2P" -[230]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%92%AD%E6%94%BE%E5%99%A8%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "播放器性能优化" +[230]: ./VideoDevelopment/%E6%92%AD%E6%94%BE%E5%99%A8%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "播放器性能优化" [231]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/OpenGL "OpenGL" -[232]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/1.OpenGL%E7%AE%80%E4%BB%8B.md "1.OpenGL简介" -[233]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md "2.GLSurfaceView简介" -[234]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md "3.GLSurfaceView源码解析" -[235]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md "4.GLTextureView实现.md" -[236]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md "5.OpenGL ES绘制三角形" -[237]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md "6.OpenGL ES绘制矩形及圆形" -[238]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md "7.OpenGL ES着色器语言GLSL" -[239]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md "8.GLES类及Matrix类" - -[240]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md "9.OpenGL ES纹理" -[241]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md " 10.GLSurfaceView+MediaPlayer播放视频" -[242]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/11.OpenGL%20ES%E6%BB%A4%E9%95%9C.md "11.OpenGL ES滤镜" +[232]: ./VideoDevelopment/OpenGL/1.OpenGL%E7%AE%80%E4%BB%8B.md "1.OpenGL简介" +[233]: ./VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md "2.GLSurfaceView简介" +[234]: ./VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md "3.GLSurfaceView源码解析" +[235]: ./VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md "4.GLTextureView实现.md" +[236]: ./VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md "5.OpenGL ES绘制三角形" +[237]: ./VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md "6.OpenGL ES绘制矩形及圆形" +[238]: ./VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md "7.OpenGL ES着色器语言GLSL" +[239]: ./VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md "8.GLES类及Matrix类" + +[240]: ./VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md "9.OpenGL ES纹理" +[241]: ./VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md " 10.GLSurfaceView+MediaPlayer播放视频" +[242]: ./VideoDevelopment/OpenGL/11.OpenGL%20ES%E6%BB%A4%E9%95%9C.md "11.OpenGL ES滤镜" [243]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/Danmaku "弹幕" -[244]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/Danmaku/Android%E5%BC%B9%E5%B9%95%E5%AE%9E%E7%8E%B0.md "Android弹幕实现" -[245]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/MediaExtractor%E3%80%81MediaCodec%E3%80%81MediaMuxer.md "MediaExtractor、MediaCodec、MediaMuxer" -[246]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE.md "流媒体协议" -[247]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HLS.md "HLS" -[248]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/DASH.md "DASH" -[249]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HTTP%20FLV.md "HTTP FLV" -[250]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/RTMP.md "RTMP" -[251]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/MP4%E6%A0%BC%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "MP4格式详解" -[252]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/FLV.md "FLV" -[253]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/TS.md "TS" -[254]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/fMP4%20vs%20ts.md "fMP4 vs ts" -[255]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/fMP4%E6%A0%BC%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "fMP4格式详解" -[256]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F.md "视频封装格式" +[244]: ./VideoDevelopment/Danmaku/Android%E5%BC%B9%E5%B9%95%E5%AE%9E%E7%8E%B0.md "Android弹幕实现" +[245]: ./VideoDevelopment/MediaExtractor%E3%80%81MediaCodec%E3%80%81MediaMuxer.md "MediaExtractor、MediaCodec、MediaMuxer" +[246]: ./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE.md "流媒体协议" +[247]: ./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HLS.md "HLS" +[248]: ./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/DASH.md "DASH" +[249]: ./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HTTP%20FLV.md "HTTP FLV" +[250]: ./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/RTMP.md "RTMP" +[251]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/MP4%E6%A0%BC%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "MP4格式详解" +[252]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/FLV.md "FLV" +[253]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/TS.md "TS" +[254]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/fMP4%20vs%20ts.md "fMP4 vs ts" +[255]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/fMP4%E6%A0%BC%E5%BC%8F%E8%AF%A6%E8%A7%A3.md "fMP4格式详解" +[256]: ./VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F.md "视频封装格式" [257]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81 "视频编码" -[258]:https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/AV1.md "AV1" -[259]:https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/H264.md "H264" -[260]:https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/H265.md "H265" -[261]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/P2P%E6%8A%80%E6%9C%AF/P2P.md "P2P" -[262]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/P2P%E6%8A%80%E6%9C%AF/P2P%E5%8E%9F%E7%90%86_NAT%E7%A9%BF%E9%80%8F.md "P2P原理_NAT穿透" +[258]:./VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/AV1.md "AV1" +[259]:./VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/H264.md "H264" +[260]:./VideoDevelopment/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/H265.md "H265" +[261]: ./VideoDevelopment/P2P%E6%8A%80%E6%9C%AF/P2P.md "P2P" +[262]: ./VideoDevelopment/P2P%E6%8A%80%E6%9C%AF/P2P%E5%8E%9F%E7%90%86_NAT%E7%A9%BF%E9%80%8F.md "P2P原理_NAT穿透" [263]: https://github.com/CharonChui/AndroidNote/tree/master/OperatingSystem "操作系统" -[264]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/1.%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AE%80%E4%BB%8B.md "1.操作系统简介" -[265]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md "2.进程和线程" -[266]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md "3.内存管理" -[267]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/4.%E8%B0%83%E5%BA%A6.md "4.调度" +[264]: ./OperatingSystem/1.%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AE%80%E4%BB%8B.md "1.操作系统简介" +[265]: ./OperatingSystem/2.%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.md "2.进程和线程" +[266]: ./OperatingSystem/3.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.md "3.内存管理" +[267]: ./OperatingSystem/4.%E8%B0%83%E5%BA%A6.md "4.调度" -[268]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/5.I:O.md "5.I/O" +[268]: ./OperatingSystem/5.I:O.md "5.I/O" -[269]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md "6.文件管理" -[270]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md "7.嵌入式系统" -[271]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md "8.虚拟机" +[269]: ./OperatingSystem/6.%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.md "6.文件管理" +[270]: ./OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md "7.嵌入式系统" +[271]: ./OperatingSystem/8.%E8%99%9A%E6%8B%9F%E6%9C%BA.md "8.虚拟机" [272]: https://github.com/CharonChui/AndroidNote/tree/master/Architect "架构设计" -[273]: https://github.com/CharonChui/AndroidNote/blob/master/Architect/1.%E6%9E%B6%E6%9E%84%E7%AE%80%E4%BB%8B.md "1.架构简介" +[273]: ./Architect/1.%E6%9E%B6%E6%9E%84%E7%AE%80%E4%BB%8B.md "1.架构简介" [274]: https://github.com/CharonChui/AndroidNote/tree/master/OperatingSystem/AndroidKernal "Android内核" -[275]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/1.Android%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1.md "1.Android进程间通信" -[276]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md "2.Android线程间通信之Handler消息机制" -[277]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md "3.Android Framework框架" -[278]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md "4.ActivityManagerService简介" -[279]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md "5.Android消息获取" -[280]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md "6.屏幕绘制基础" -[281]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md "7.View绘制原理" -[282]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md "8.WindowManagerService简介" - -[283]: https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/AndroidKernal/9.PackageManagerService%E7%AE%80%E4%BB%8B.md "9.PackageManagerService简介" - -[ 284 ]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/LeakCanary%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md. "LeakCanary源码分析" -[285]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md "Java内存模型" -[286]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/JVM%E6%9E%B6%E6%9E%84.md "JVM架构" +[275]: ./OperatingSystem/AndroidKernal/1.Android%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1.md "1.Android进程间通信" +[276]: ./OperatingSystem/AndroidKernal/2.Android%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8BHandler%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md "2.Android线程间通信之Handler消息机制" +[277]: ./OperatingSystem/AndroidKernal/3.Android%20Framework%E6%A1%86%E6%9E%B6.md "3.Android Framework框架" +[278]: ./OperatingSystem/AndroidKernal/4.ActivityManagerService%E7%AE%80%E4%BB%8B.md "4.ActivityManagerService简介" +[279]: ./OperatingSystem/AndroidKernal/5.Android%E6%B6%88%E6%81%AF%E8%8E%B7%E5%8F%96.md "5.Android消息获取" +[280]: ./OperatingSystem/AndroidKernal/6.%E5%B1%8F%E5%B9%95%E7%BB%98%E5%88%B6%E5%9F%BA%E7%A1%80.md "6.屏幕绘制基础" +[281]: ./OperatingSystem/AndroidKernal/7.View%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.md "7.View绘制原理" +[282]: ./OperatingSystem/AndroidKernal/8.WindowManagerService%E7%AE%80%E4%BB%8B.md "8.WindowManagerService简介" + +[283]: ./OperatingSystem/AndroidKernal/9.PackageManagerService%E7%AE%80%E4%BB%8B.md "9.PackageManagerService简介" + +[ 284 ]: ./SourceAnalysis/LeakCanary%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md. "LeakCanary源码分析" +[285]: ./JavaKnowledge/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B.md "Java内存模型" +[286]: ./JavaKnowledge/JVM%E6%9E%B6%E6%9E%84.md "JVM架构" [287]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack "Jetpack" -[288]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/Jetpack%E7%AE%80%E4%BB%8B.md "Jetpack简介" +[288]: ./Jetpack/Jetpack%E7%AE%80%E4%BB%8B.md "Jetpack简介" [289]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack/architecture "architecture" [290]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack/ui "ui" [291]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack/foundation "foundation" [292]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack/behavior "behavior" -[293]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/1.%E7%AE%80%E4%BB%8B.md "1.简介" -[294]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md "2.ViewBinding简介" -[295]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md "3.Lifecycle简介" -[296]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md "4.ViewModel简介" -[297]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md "5.LiveData简介" -[298]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md "6.DataBinding简介" -[299]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md "7.Room简介" -[300]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md "8.PagingLibrary简介" -[301]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md "9.App Startup简介" -[302]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md "10.DataStore简介" -[303]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md "11.Hilt简介" -[304]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md "12.Navigation简介" -[305]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md "13.Jetpack MVVM简介" -[306]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/14.findViewById%E7%9A%84%E8%BF%87%E5%8E%BB%E5%8F%8A%E6%9C%AA%E6%9D%A5.md "14.findViewById的过去及未来" -[307]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/Jetpack%20Compose%E7%AE%80%E4%BB%8B.md "Jetpack Compose简介" -[308]: https://github.com/CharonChui/AndroidNote/tree/master/Jetpack/ui/material "material" -[309]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/1.MaterialToolbar%E7%AE%80%E4%BB%8B.md "1.MaterialToolbar简介" -[310]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md "2.NavigationView简介" -[311]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md "3.NestedScrollView简介" -[312]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md "4.CoordinatorLayout简介" -[313]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md "5.AppBarLayout简介" -[314]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md "6.CollapsingToolbarLayout简介" -[315]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md "7.Snackbar简介" -[316]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/ui/material/8.TabLayout%E7%AE%80%E4%BB%8B.md "8.TabLayout简介" -[317]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/foundation/1.%E7%AE%80%E4%BB%8B.md "1.简介" -[318]: https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/behavior/1.%E7%AE%80%E4%BB%8B.md "1.简介" -[319]: https://github.com/CharonChui/AndroidNote/blob/master/Gradle%26Maven/Composing%20builds%E7%AE%80%E4%BB%8B.md "Composing builds简介" -[320]: https://github.com/CharonChui/AndroidNote/blob/master/ImageLoaderLibrary/Coil%E7%AE%80%E4%BB%8B.md "Coil简介" +[293]: ./Jetpack/architecture/1.%E7%AE%80%E4%BB%8B.md "1.简介" +[294]: ./Jetpack/architecture/2.ViewBinding%E7%AE%80%E4%BB%8B.md "2.ViewBinding简介" +[295]: ./Jetpack/architecture/3.Lifecycle%E7%AE%80%E4%BB%8B.md "3.Lifecycle简介" +[296]: ./Jetpack/architecture/4.ViewModel%E7%AE%80%E4%BB%8B.md "4.ViewModel简介" +[297]: ./Jetpack/architecture/5.LiveData%E7%AE%80%E4%BB%8B.md "5.LiveData简介" +[298]: ./Jetpack/architecture/6.DataBinding%E7%AE%80%E4%BB%8B.md "6.DataBinding简介" +[299]: ./Jetpack/architecture/7.Room%E7%AE%80%E4%BB%8B.md "7.Room简介" +[300]: ./Jetpack/architecture/8.PagingLibrary%E7%AE%80%E4%BB%8B.md "8.PagingLibrary简介" +[301]: ./Jetpack/architecture/9.App%20Startup%E7%AE%80%E4%BB%8B.md "9.App Startup简介" +[302]: ./Jetpack/architecture/10.DataStore%E7%AE%80%E4%BB%8B.md "10.DataStore简介" +[303]: ./Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md "11.Hilt简介" +[304]: ./Jetpack/architecture/12.Navigation%E7%AE%80%E4%BB%8B.md "12.Navigation简介" +[305]: ./Jetpack/architecture/13.Jetpack%20MVVM%E7%AE%80%E4%BB%8B.md "13.Jetpack MVVM简介" +[306]: ./Jetpack/architecture/14.findViewById%E7%9A%84%E8%BF%87%E5%8E%BB%E5%8F%8A%E6%9C%AA%E6%9D%A5.md "14.findViewById的过去及未来" +[307]: ./Jetpack/ui/Jetpack%20Compose%E7%AE%80%E4%BB%8B.md "Jetpack Compose简介" +[308]: ./Jetpack/ui/material "material" +[309]: ./Jetpack/ui/material/1.MaterialToolbar%E7%AE%80%E4%BB%8B.md "1.MaterialToolbar简介" +[310]: ./Jetpack/ui/material/2.NavigationView%E7%AE%80%E4%BB%8B.md "2.NavigationView简介" +[311]: ./Jetpack/ui/material/3.NestedScrollView%E7%AE%80%E4%BB%8B.md "3.NestedScrollView简介" +[312]: ./Jetpack/ui/material/4.CoordinatorLayout%E7%AE%80%E4%BB%8B.md "4.CoordinatorLayout简介" +[313]: ./Jetpack/ui/material/5.AppBarLayout%E7%AE%80%E4%BB%8B.md "5.AppBarLayout简介" +[314]: ./Jetpack/ui/material/6.CollapsingToolbarLayout%E7%AE%80%E4%BB%8B.md "6.CollapsingToolbarLayout简介" +[315]: ./Jetpack/ui/material/7.Snackbar%E7%AE%80%E4%BB%8B.md "7.Snackbar简介" +[316]: ./Jetpack/ui/material/8.TabLayout%E7%AE%80%E4%BB%8B.md "8.TabLayout简介" +[317]: ./Jetpack/foundation/1.%E7%AE%80%E4%BB%8B.md "1.简介" +[318]: ./Jetpack/behavior/1.%E7%AE%80%E4%BB%8B.md "1.简介" +[319]: ./Gradle%26Maven/Composing%20builds%E7%AE%80%E4%BB%8B.md "Composing builds简介" +[320]: ./ImageLoaderLibrary/Coil%E7%AE%80%E4%BB%8B.md "Coil简介" - - -Developed By -=== - - * Charon Chui - - - -License -=== - - Copyright (C) 2013 Charon Chui - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file +- [史上最适合Android开发者学习的Go语言教程](https://github.com/CharonChui/GolangStudyNote) +- [史上最适合Android开发者学习的iOS开发教程](https://github.com/CharonChui/iOSStudyNote) \ No newline at end of file diff --git "a/RxJavaPart/1.RxJava\350\257\246\350\247\243(\344\270\200).md" "b/RxJavaPart/1.RxJava\350\257\246\350\247\243(\344\270\200).md" index 81b665b6..071b72b7 100644 --- "a/RxJavaPart/1.RxJava\350\257\246\350\247\243(\344\270\200).md" +++ "b/RxJavaPart/1.RxJava\350\257\246\350\247\243(\344\270\200).md" @@ -735,7 +735,7 @@ Observable.create(new ObservableOnSubscribe() { - [Google Agera 从入门到放弃](http://blog.chengyunfeng.com/?p=984) -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/2.RxJava%E8%AF%A6%E8%A7%A3(%E4%BA%8C).md "RxJava详解(二)" +[1]: ./RxJavaPart/2.RxJava%E8%AF%A6%E8%A7%A3(%E4%BA%8C).md "RxJava详解(二)" --- diff --git "a/RxJavaPart/2.RxJava\350\257\246\350\247\243(\344\272\214).md" "b/RxJavaPart/2.RxJava\350\257\246\350\247\243(\344\272\214).md" index a689be18..541850f9 100644 --- "a/RxJavaPart/2.RxJava\350\257\246\350\247\243(\344\272\214).md" +++ "b/RxJavaPart/2.RxJava\350\257\246\350\247\243(\344\272\214).md" @@ -998,7 +998,7 @@ Observable.from(folders) - [给 Android 开发者的 RxJava 详解](http://gank.io/post/560e15be2dca930e00da1083) - [Google Agera 从入门到放弃](http://blog.chengyunfeng.com/?p=984) -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/3.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%89).md "RxJava详解(三)" +[1]: ./RxJavaPart/3.RxJava%E8%AF%A6%E8%A7%A3(%E4%B8%89).md "RxJava详解(三)" --- diff --git "a/RxJavaPart/3.RxJava\350\257\246\350\247\243(\344\270\211).md" "b/RxJavaPart/3.RxJava\350\257\246\350\247\243(\344\270\211).md" index e1f39a75..7a877327 100644 --- "a/RxJavaPart/3.RxJava\350\257\246\350\247\243(\344\270\211).md" +++ "b/RxJavaPart/3.RxJava\350\257\246\350\247\243(\344\270\211).md" @@ -176,7 +176,7 @@ Observable.create(onSubscribe) 更多内容请看下一篇文章[RxJava详解(四)][1] -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/4.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E5%9B%9B).md "RxJava详解(四)" +[1]: ./RxJavaPart/4.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E5%9B%9B).md "RxJava详解(四)" Agera diff --git "a/RxJavaPart/4.RxJava\350\257\246\350\247\243\344\271\213\346\211\247\350\241\214\345\216\237\347\220\206(\345\233\233).md" "b/RxJavaPart/4.RxJava\350\257\246\350\247\243\344\271\213\346\211\247\350\241\214\345\216\237\347\220\206(\345\233\233).md" index 52de63e3..6bf0c6e7 100644 --- "a/RxJavaPart/4.RxJava\350\257\246\350\247\243\344\271\213\346\211\247\350\241\214\345\216\237\347\220\206(\345\233\233).md" +++ "b/RxJavaPart/4.RxJava\350\257\246\350\247\243\344\271\213\346\211\247\350\241\214\345\216\237\347\220\206(\345\233\233).md" @@ -495,7 +495,7 @@ observable.subscribe(subscriber); 更多内容请看下一篇文章[RxJava详解(五)][1] -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/5.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%AC%A6%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E4%BA%94).md "RxJava详解(五)" +[1]: ./RxJavaPart/5.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%AC%A6%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86(%E4%BA%94).md "RxJava详解(五)" --- diff --git "a/RxJavaPart/5.RxJava\350\257\246\350\247\243\344\271\213\346\223\215\344\275\234\347\254\246\346\211\247\350\241\214\345\216\237\347\220\206(\344\272\224).md" "b/RxJavaPart/5.RxJava\350\257\246\350\247\243\344\271\213\346\223\215\344\275\234\347\254\246\346\211\247\350\241\214\345\216\237\347\220\206(\344\272\224).md" index 8fd8210f..0ba452e2 100644 --- "a/RxJavaPart/5.RxJava\350\257\246\350\247\243\344\271\213\346\223\215\344\275\234\347\254\246\346\211\247\350\241\214\345\216\237\347\220\206(\344\272\224).md" +++ "b/RxJavaPart/5.RxJava\350\257\246\350\247\243\344\271\213\346\223\215\344\275\234\347\254\246\346\211\247\350\241\214\345\216\237\347\220\206(\344\272\224).md" @@ -226,7 +226,7 @@ static final class MapSubscriber extends Subscriber { 更多内容请看下一篇文章[RxJava详解(六)][1] -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/6.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%BA%BF%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86(%E5%85%AD).md "RxJava详解(六)" +[1]: ./RxJavaPart/6.RxJava%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%BA%BF%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86(%E5%85%AD).md "RxJava详解(六)" --- diff --git "a/RxJavaPart/6.RxJava\350\257\246\350\247\243\344\271\213\347\272\277\347\250\213\350\260\203\345\272\246\345\216\237\347\220\206(\345\205\255).md" "b/RxJavaPart/6.RxJava\350\257\246\350\247\243\344\271\213\347\272\277\347\250\213\350\260\203\345\272\246\345\216\237\347\220\206(\345\205\255).md" index c3de5a36..260a9b3f 100644 --- "a/RxJavaPart/6.RxJava\350\257\246\350\247\243\344\271\213\347\272\277\347\250\213\350\260\203\345\272\246\345\216\237\347\220\206(\345\205\255).md" +++ "b/RxJavaPart/6.RxJava\350\257\246\350\247\243\344\271\213\347\272\277\347\250\213\350\260\203\345\272\246\345\216\237\347\220\206(\345\205\255).md" @@ -814,7 +814,7 @@ class LooperScheduler extends Scheduler { 更多内容请看下一篇文章[RxJava详解(七)][1] -[1]: https://github.com/CharonChui/AndroidNote/blob/master/RxJavaPart/7.RxJava%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6.md "RxJava全家桶" +[1]: ./RxJavaPart/7.RxJava%E7%B3%BB%E5%88%97%E5%85%A8%E5%AE%B6%E6%A1%B6.md "RxJava全家桶" --- diff --git "a/SourceAnalysis/InstantRun\350\257\246\350\247\243.md" "b/SourceAnalysis/InstantRun\350\257\246\350\247\243.md" index a219e78f..8469eef9 100644 --- "a/SourceAnalysis/InstantRun\350\257\246\350\247\243.md" +++ "b/SourceAnalysis/InstantRun\350\257\246\350\247\243.md" @@ -180,7 +180,7 @@ InstantRun详解 - [Instant Run: How Does it Work?!](https://medium.com/google-developers/instant-run-how-does-it-work-294a1633367f#.8xmpk8xvc) -[1]: https://github.com/CharonChui/AndroidNote/blob/master/AndroidStudioCourse/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md "AndroidStudio提高Build速度" +[1]: ./AndroidStudioCourse/AndroidStudio%E6%8F%90%E9%AB%98Build%E9%80%9F%E5%BA%A6.md "AndroidStudio提高Build速度" --- diff --git "a/SourceAnalysis/LeakCanary\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/SourceAnalysis/LeakCanary\346\272\220\347\240\201\345\210\206\346\236\220.md" index 62669286..5d5942f5 100644 --- "a/SourceAnalysis/LeakCanary\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/SourceAnalysis/LeakCanary\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -20,7 +20,7 @@ dependencies { -到这里你肯定会有个疑问:一行Java代码都没有,它是如何做到监控的? 后面我们就带着这个疑问来进行源码查看。不过再看源码之前,我们需要先了解一些引用的知识[**强引用、软引用、弱引用、虚引用**](https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/%E5%BC%BA%E5%BC%95%E7%94%A8%E3%80%81%E8%BD%AF%E5%BC%95%E7%94%A8%E3%80%81%E5%BC%B1%E5%BC%95%E7%94%A8%E3%80%81%E8%99%9A%E5%BC%95%E7%94%A8.md) +到这里你肯定会有个疑问:一行Java代码都没有,它是如何做到监控的? 后面我们就带着这个疑问来进行源码查看。不过再看源码之前,我们需要先了解一些引用的知识[**强引用、软引用、弱引用、虚引用**](./JavaKnowledge/%E5%BC%BA%E5%BC%95%E7%94%A8%E3%80%81%E8%BD%AF%E5%BC%95%E7%94%A8%E3%80%81%E5%BC%B1%E5%BC%95%E7%94%A8%E3%80%81%E8%99%9A%E5%BC%95%E7%94%A8.md) 这篇文章中在介绍弱引用时是这样说的: diff --git "a/SourceAnalysis/ListView\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/SourceAnalysis/ListView\346\272\220\347\240\201\345\210\206\346\236\220.md" index c0e9cd71..1a5807f7 100644 --- "a/SourceAnalysis/ListView\346\272\220\347\240\201\345\210\206\346\236\220.md" +++ "b/SourceAnalysis/ListView\346\272\220\347\240\201\345\210\206\346\236\220.md" @@ -969,7 +969,7 @@ private View fillSpecific(int position, int top) { 一个个的来,先看一下手势滑动部分,这个当然是从`onTouchEvent()`方法看了, 手势这一块不太清楚的可以看我之前的一篇文章 -[Android Touch事件分发详解](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md) +[Android Touch事件分发详解](./SourceAnalysis/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md) 发现`ListView`没有重写`onTouchEvent()`方法,这也好理解,因为`GridView`也有类似的滑动功能,所以去父类`AbsListView`中看. diff --git "a/SourceAnalysis/Netowork/Retrofit\350\257\246\350\247\243(\344\270\212).md" "b/SourceAnalysis/Netowork/Retrofit\350\257\246\350\247\243(\344\270\212).md" index f40821cd..22abfa80 100644 --- "a/SourceAnalysis/Netowork/Retrofit\350\257\246\350\247\243(\344\270\212).md" +++ "b/SourceAnalysis/Netowork/Retrofit\350\257\246\350\247\243(\344\270\212).md" @@ -370,9 +370,9 @@ Call getUser(@Header("Authorization") String authorization) -keepattributes Exceptions ``` -[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md "volley-retrofit-okhttp之我们该如何选择网路框架" -[2]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" -[3]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" +[1]: ./SourceAnalysis/Netowork/volley-retrofit-okhttp%E4%B9%8B%E6%88%91%E4%BB%AC%E8%AF%A5%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E7%BD%91%E8%B7%AF%E6%A1%86%E6%9E%B6.md "volley-retrofit-okhttp之我们该如何选择网路框架" +[2]: ./SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" +[3]: ./AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" [4]: https://github.com/CharonChui/AndroidNote/tree/master/RxJavaPart "Rx详解系列" diff --git "a/SourceAnalysis/Netowork/volley-retrofit-okhttp\344\271\213\346\210\221\344\273\254\350\257\245\345\246\202\344\275\225\351\200\211\346\213\251\347\275\221\350\267\257\346\241\206\346\236\266.md" "b/SourceAnalysis/Netowork/volley-retrofit-okhttp\344\271\213\346\210\221\344\273\254\350\257\245\345\246\202\344\275\225\351\200\211\346\213\251\347\275\221\350\267\257\346\241\206\346\236\266.md" index 199266cd..b453d80b 100644 --- "a/SourceAnalysis/Netowork/volley-retrofit-okhttp\344\271\213\346\210\221\344\273\254\350\257\245\345\246\202\344\275\225\351\200\211\346\213\251\347\275\221\350\267\257\346\241\206\346\236\266.md" +++ "b/SourceAnalysis/Netowork/volley-retrofit-okhttp\344\271\213\346\210\221\344\273\254\350\257\245\345\246\202\344\275\225\351\200\211\346\213\251\347\275\221\350\267\257\346\241\206\346\236\266.md" @@ -43,8 +43,8 @@ volley-retrofit-okhttp之我们该如何选择网路框架 所以综合起来说使用`Volley+OKHttp`的组合是非常不错的,既可以保证速度又可以满足对缓存、重试等的处理。但是如果你是`RxJava`的使用者那你可能会更偏向于使用`Retrofit`,因为`Retrofit`可以无缝结合`RxJava`使用。目前主流的一套框架就是`Retrofit + OkHttp + RxJava + Dagger2 `,但是对使用者的要求也相对要高些。 -[1]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/HttpURLConnection%E8%AF%A6%E8%A7%A3.md "HttpUrlConnection详解" -[2]: https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" +[1]: ./SourceAnalysis/Netowork/HttpURLConnection%E8%AF%A6%E8%A7%A3.md "HttpUrlConnection详解" +[2]: ./SourceAnalysis/Netowork/Volley%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md "Volley源码分析" --- diff --git "a/SourceAnalysis/butterknife\346\272\220\347\240\201\350\257\246\350\247\243.md" "b/SourceAnalysis/butterknife\346\272\220\347\240\201\350\257\246\350\247\243.md" index dfe613b2..74c060bb 100644 --- "a/SourceAnalysis/butterknife\346\272\220\347\240\201\350\257\246\350\247\243.md" +++ "b/SourceAnalysis/butterknife\346\272\220\347\240\201\350\257\246\350\247\243.md" @@ -92,7 +92,7 @@ public @interface ListenerClass { 作用到注解类型的运行时注解。 -有了之前[注解使用](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)这篇文章的基础,我们知道对于编译时注解肯定是要通过自定义`AbstractProcessor`来解析的,所以接下来我们要去`butterknife-compiler module`中找一下对应的类。通过名字我们就能很简单的找到: +有了之前[注解使用](./Android%E5%8A%A0%E5%BC%BA/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md)这篇文章的基础,我们知道对于编译时注解肯定是要通过自定义`AbstractProcessor`来解析的,所以接下来我们要去`butterknife-compiler module`中找一下对应的类。通过名字我们就能很简单的找到: ```java package butterknife.compiler; @@ -582,7 +582,7 @@ public class SimpleActivity_ViewBinding implements Unb ``` -[1]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" +[1]: ./AdavancedPart/%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8.md "注解使用" diff --git "a/SourceAnalysis/\350\207\252\345\256\232\344\271\211View\350\257\246\350\247\243.md" "b/SourceAnalysis/\350\207\252\345\256\232\344\271\211View\350\257\246\350\247\243.md" index 557f47f9..bd5a9d8f 100644 --- "a/SourceAnalysis/\350\207\252\345\256\232\344\271\211View\350\257\246\350\247\243.md" +++ "b/SourceAnalysis/\350\207\252\345\256\232\344\271\211View\350\257\246\350\247\243.md" @@ -1,7 +1,7 @@ 自定义View详解 === -虽然之前也分析过[View绘制过程](https://github.com/CharonChui/AndroidNote/blob/master/SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md),但是如果让我自己集成`ViewGroup`然后自己重新`onMeasure,onLayout,onDraw`方法自定义`View`我还是会头疼。今天索性来系统的学习下。 +虽然之前也分析过[View绘制过程](./SourceAnalysis/View%E7%BB%98%E5%88%B6%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3.md),但是如果让我自己集成`ViewGroup`然后自己重新`onMeasure,onLayout,onDraw`方法自定义`View`我还是会头疼。今天索性来系统的学习下。 ### `onMeasure` diff --git "a/Tools&Library/Android\345\274\200\345\217\221\345\267\245\345\205\267\345\217\212\347\261\273\345\272\223.md" "b/Tools&Library/Android\345\274\200\345\217\221\345\267\245\345\205\267\345\217\212\347\261\273\345\272\223.md" index 9806157a..f2111b51 100644 --- "a/Tools&Library/Android\345\274\200\345\217\221\345\267\245\345\205\267\345\217\212\347\261\273\345\272\223.md" +++ "b/Tools&Library/Android\345\274\200\345\217\221\345\267\245\345\205\267\345\217\212\347\261\273\345\272\223.md" @@ -77,10 +77,4 @@ Android开发工具及类库 12. [android-architecture](https://github.com/googlesamples/android-architecture) 放到这里可能不太合适,因为它并不是工具和类库,而是`Google`官方发布的`Android`架构示例。非常值得参考。 13. [AndroidWiFiADB](https://github.com/pedrovgs/AndroidWiFiADB) - 还在为数据线不够用而烦恼嘛? - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! + 还在为数据线不够用而烦恼嘛? \ No newline at end of file diff --git "a/Tools&Library/MAT\345\206\205\345\255\230\345\210\206\346\236\220.md" "b/Tools&Library/MAT\345\206\205\345\255\230\345\210\206\346\236\220.md" index c575f19a..188fc565 100644 --- "a/Tools&Library/MAT\345\206\205\345\255\230\345\210\206\346\236\220.md" +++ "b/Tools&Library/MAT\345\206\205\345\255\230\345\210\206\346\236\220.md" @@ -21,9 +21,4 @@ MAT内存分析 自从良心企业发布了`leakCanary`后,都已经转投到大神门下。 -[1]: https://github.com/CharonChui/AndroidNote/blob/master/BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md "内存泄露介绍" - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +[1]: ./BasicKnowledge/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md "内存泄露介绍" diff --git "a/Tools&Library/\346\200\247\350\203\275\344\274\230\345\214\226\347\233\270\345\205\263\345\267\245\345\205\267.md" "b/Tools&Library/\346\200\247\350\203\275\344\274\230\345\214\226\347\233\270\345\205\263\345\267\245\345\205\267.md" index 1084d903..613007b1 100644 --- "a/Tools&Library/\346\200\247\350\203\275\344\274\230\345\214\226\347\233\270\345\205\263\345\267\245\345\205\267.md" +++ "b/Tools&Library/\346\200\247\350\203\275\344\274\230\345\214\226\347\233\270\345\205\263\345\267\245\345\205\267.md" @@ -409,12 +409,7 @@ public void ProcessPeople() { -[1]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "性能优化" -[2]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E5%B8%83%E5%B1%80%E4%BC%98%E5%8C%96.md "布局优化" -[3]: https://github.com/CharonChui/AndroidNote/blob/master/JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md "有关Java垃圾回收机制请参考" -[4]: https://github.com/CharonChui/AndroidNote/blob/master/AdavancedPart/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md "通过Hardware Layer提高动画性能" - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! +[1]: ./AdavancedPart/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.md "性能优化" +[2]: ./AdavancedPart/%E5%B8%83%E5%B1%80%E4%BC%98%E5%8C%96.md "布局优化" +[3]: ./JavaKnowledge/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md "有关Java垃圾回收机制请参考" +[4]: ./AdavancedPart/%E9%80%9A%E8%BF%87Hardware%20Layer%E6%8F%90%E9%AB%98%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.md "通过Hardware Layer提高动画性能" diff --git "a/Tools&Library/\347\233\256\345\211\215\346\265\201\350\241\214\347\232\204\345\274\200\345\217\221\347\273\204\345\220\210.md" "b/Tools&Library/\347\233\256\345\211\215\346\265\201\350\241\214\347\232\204\345\274\200\345\217\221\347\273\204\345\220\210.md" index a753091f..d0801267 100644 --- "a/Tools&Library/\347\233\256\345\211\215\346\265\201\350\241\214\347\232\204\345\274\200\345\217\221\347\273\204\345\220\210.md" +++ "b/Tools&Library/\347\233\256\345\211\215\346\265\201\350\241\214\347\232\204\345\274\200\345\217\221\347\273\204\345\220\210.md" @@ -6,9 +6,3 @@ 架构上面目前是`MVP`居多。 - - ---- - -- 邮箱 :charon.chui@gmail.com -- Good Luck! \ No newline at end of file diff --git "a/Tools&Library/\350\260\203\350\257\225\345\271\263\345\217\260Flipper.md" "b/Tools&Library/\350\260\203\350\257\225\345\271\263\345\217\260Flipper.md" index 92e411a1..1f61711b 100644 --- "a/Tools&Library/\350\260\203\350\257\225\345\271\263\345\217\260Flipper.md" +++ "b/Tools&Library/\350\260\203\350\257\225\345\271\263\345\217\260Flipper.md" @@ -1,8 +1,4 @@ -调试平台Flipper - -=== - -子日:工欲善其事必先利其器 +### 调试平台Flipper [Flipper](https://fbflipper.com/docs)是之前`Facebook`的一个内部调试工具,旨在帮助开发人员以交互式和可扩展的方式检查和理解`iOS`及`Android`应用程序的结构和行为。 @@ -179,11 +175,3 @@ public class MySonarPlugin implements SonarPlugin { } } ``` - - - ---- - -- 邮箱 :charon.chui@gmail.com -- -Good Luck! diff --git "a/VideoDevelopment/Android\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221/1.\351\237\263\350\247\206\351\242\221\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/VideoDevelopment/Android\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221/1.\351\237\263\350\247\206\351\242\221\345\237\272\347\241\200\347\237\245\350\257\206.md" index 7964053a..d925d418 100644 --- "a/VideoDevelopment/Android\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221/1.\351\237\263\350\247\206\351\242\221\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/VideoDevelopment/Android\351\237\263\350\247\206\351\242\221\345\274\200\345\217\221/1.\351\237\263\350\247\206\351\242\221\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -253,7 +253,7 @@ PAR DAR SAR 音视频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP、RTMP等等,这些协议在传输音视频数据的同时也会传输一些信令数据。这些信令数据包括对播放的控制(播放、暂停、停止)或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留音视频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。 -[常见流媒体协议](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/%E6%B5%81%E5%AA%92%E4%BD%93%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE.md) +[常见流媒体协议](./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/%E6%B5%81%E5%AA%92%E4%BD%93%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE.md) diff --git "a/VideoDevelopment/ExoPlayer/1. ExoPlayer\347\256\200\344\273\213.md" "b/VideoDevelopment/ExoPlayer/1. ExoPlayer\347\256\200\344\273\213.md" index 09afc156..8dc2aa89 100644 --- "a/VideoDevelopment/ExoPlayer/1. ExoPlayer\347\256\200\344\273\213.md" +++ "b/VideoDevelopment/ExoPlayer/1. ExoPlayer\347\256\200\344\273\213.md" @@ -37,7 +37,7 @@ implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X' - `exoplayer-smoothstreaming`:支持SmoothStreaming - `exoplayer-ui`:使用ExoPlayer所需的UI部分和资源 -上面讲到了DASH、HLS、SmoothStreaming,具体的介绍可以参考[流媒体通信协议](https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE) +上面讲到了DASH、HLS、SmoothStreaming,具体的介绍可以参考[流媒体通信协议](../流媒体协议/流媒体协议.md) 除了上面的几个类库外,ExoPlayer还有很多扩展库提供一些额外的功能,有一些可以直接通过JCenter进行依赖,有一些需要手动去编译,具体的可以通过[扩展库目录](https://github.com/google/ExoPlayer/tree/release-v2/extensions/)中的README来查看详细的内容。 可以通过JCenter进行依赖的类库和扩展可以从[ExoPlayer的Binatry](https://bintray.com/google/exoplayer)上查看。 @@ -52,14 +52,20 @@ compileOptions { ExoPlayer库的核心是ExoPlayer接口,ExoPlayer公开了传统的高级媒体播放器功能,例如缓冲、播放、暂停、seek等。在具体实现方面,该开源库对播放器的媒体类型、存储方式、位置、渲染方式等进行了最少的实现,旨在让开发者自定义各种特性。ExoPlayer的实现不是直接实现加载和呈现媒体,而是将这项工作委托给各种组件。主要有: -- TrackSelector:轨道提取器,从MediaSource中提取各个轨道的二进制数据,交给Renderer渲染,创建播放器时传入。 -- Renderer:对多媒体中的各个轨道(音轨、视频轨、字母轨等)数据进行渲染,渲染就是"播放",把二进制文件渲染成声音、画面,创建播放器时传入。 -- MediaSource:定义多媒体数据源,这个类的功能就是从Uri中读取多媒体文件的二进制数据。MediaSource在播放开始时通过ExoPlayer.prepare()注入。 -- LoadControl:对MediaSource进行控制,比如什么时候开始缓冲、缓冲多少等。 +- **TrackSelector** + 轨道提取器,从MediaSource中提取各个轨道的二进制数据,交给Renderer渲染,创建播放器时传入。 +- **Renderer** + 对多媒体中的各个轨道(音轨、视频轨、字母轨等)数据进行渲染,渲染就是"播放",把二进制文件渲染成声音、画面,创建播放器时传入。 +- **MediaSource** + 定义多媒体数据源,这个类的功能就是从Uri中读取多媒体文件的二进制数据。MediaSource在播放开始时通过ExoPlayer.prepare()注入。 +- **LoadControl** + 对MediaSource进行控制,比如什么时候开始缓冲、缓冲多少等。 它们之间的关系是: -渲染器(Render) ---刷数据--->提取器(Extraor) ----读取数据---> 加载控制器(LoadControl) ----控制数据加载方式---> 媒体源(MediaSource) + 渲染器(Render) + ---> 刷数据 --->提取器(Extraor) ---> 读取数据 + ---> 加载控制器(LoadControl) ----控制数据加载方式---> 媒体源(MediaSource) @@ -82,7 +88,9 @@ public static SimpleExoPlayer newSimpleInstance(Context context) { ### 把播放器实例附着到一个View上 -ExoPlayer库提供了一个PlayerView(A high level view for Player media playbacks. It displays video, subtitles and album art during playback, and displays playback controls using a PlayerControlView.)类,他封装了PlayerControlView和渲染视频的一个默认的SurfaceView以及字幕等功能。可以通过xml中surface_type来指定视频播放的Surface类型,除了值spherical_view(这是球形视频播放一个特殊的值)时,允许值是surface_view,texture_view和none。如果视图仅用于音频播放,则应使用none以避免必须创建Surface,因为这样做可能耗费资源。 +ExoPlayer库提供了一个PlayerView(A high level view for Player media playbacks. It displays video, subtitles and album art during playback, and displays playback controls using a PlayerControlView.)类,他封装了PlayerControlView和渲染视频的一个默认的SurfaceView以及字幕等功能。 + +可以通过xml中surface_type来指定视频播放的Surface类型,除了值spherical_view(这是球形视频播放一个特殊的值)时,允许值是surface_view,texture_view和none。如果视图仅用于音频播放,则应使用none以避免必须创建Surface,因为这样做可能耗费资源。 如果视图是用于常规视频播放那么surface_view或texture_view 应该使用。对于视频播放,相比TextureView,SurfaceView有许多好处: @@ -217,7 +225,7 @@ if (mPlayer != null) { -[下一篇: 2. ExoPlayer MediaSource简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md) +[下一篇: 2. ExoPlayer MediaSource简介](./VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md) --- diff --git "a/VideoDevelopment/ExoPlayer/2. ExoPlayer MediaSource\347\256\200\344\273\213.md" "b/VideoDevelopment/ExoPlayer/2. ExoPlayer MediaSource\347\256\200\344\273\213.md" index 1a307e2f..e3e2ba3f 100644 --- "a/VideoDevelopment/ExoPlayer/2. ExoPlayer MediaSource\347\256\200\344\273\213.md" +++ "b/VideoDevelopment/ExoPlayer/2. ExoPlayer MediaSource\347\256\200\344\273\213.md" @@ -2,7 +2,7 @@ --- 在ExoPlayer里每一种媒体资源都是被MediaSource来代表的。 -``` +```java /** * Defines and provides media to be played by an {@link com.google.android.exoplayer2.ExoPlayer}. A * MediaSource has two main responsibilities: @@ -32,14 +32,14 @@ public interface MediaSource { ExoPlayer中MediaSource接口有很多实现类: -- ProgressiveMediaSource: 常规资源 -- SsMediaSource: SmoothStreaming资源 -- HlsMediaSource: HLS资源 -- DashMediaSource: DASH资源 -- LoopingMediaSource:循环播放 -- MergingMediaSource:合并 -- ClippingMediaSource:裁剪 -- ConcatenatingMediaSource:列表 +- ProgressiveMediaSource : 常规资源 +- SsMediaSource : SmoothStreaming资源 +- HlsMediaSource : HLS资源 +- DashMediaSource : DASH资源 +- LoopingMediaSource : 循环播放 +- MergingMediaSource : 合并 +- ClippingMediaSource : 裁剪 +- ConcatenatingMediaSource : 列表 @@ -49,7 +49,7 @@ ExoPlayer中MediaSource接口有很多实现类: 在一个ConcatenatingMediaSource里可以通过添加,删除和移动MediaSource动态地修改播放列表。同样在播放视频之前或者是正在播放的过程中可以通过调用相应的ConcatenatingMediaSource方法动态修改播放列表。播放器会正确地自动处理这些动态修改。例如正在播放的MediaSource被移动了,播放不会中断并且播放完成后会自动播放它后面的一个MediaSource资源。如果正在播放的MediaSource被删除了,播放器会自动移动到第一个存在的后继者去播放,如果没有后继者的话,播放器将会转到结束的状态。 -``` +```java val mediaSource = buildMediaSource(uri) val mediaSource2 = buildMediaSource(uri) @@ -68,7 +68,7 @@ private fun buildMediaSource(uri: Uri): MediaSource { 剪辑视频 -``` +```java // 从5s到10s val clippingMediaSource = ClippingMediaSource(mediaSource, 5000, 10000) mPlayer.prepare(clippingMediaSource) @@ -79,7 +79,7 @@ mPlayer.prepare(clippingMediaSource) 循环播放,如果想要一直循环,可以使用ExoPlayer.setRepeatMode. -``` +``` java // 循环5次 val loopingMediaSource = LoopingMediaSource(mediaSource, 5) mPlayer.prepare(loopingMediaSource) @@ -89,13 +89,13 @@ mPlayer.prepare(loopingMediaSource) ### MergingMediaSource -如果一个视频文件和一个单独的字母文件,可以使用MergingMediaSource合并成一个资源播放 +如果一个视频文件和一个单独的字幕文件,可以使用MergingMediaSource合并成一个资源播放 ### 高级组合 假如有两个视频A和B,下面的例子展示了怎么一起使用LoopingMediaSource和ConcatenatingMediaSource来播放A、A、B序列。 -``` +``` java val mediaSource = buildMediaSource(uri) val mediaSource2 = buildMediaSource(uri) @@ -110,8 +110,8 @@ ExoPlayer提供下载媒体以进行离线播放的功能。这里就不细说 -[上一篇: 1. ExoPlayer简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/1.%20ExoPlayer%E7%AE%80%E4%BB%8B.md) -[下一篇: 3. ExoPlayer源码分析之prepare方法](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md) +[上一篇: 1. ExoPlayer简介](./VideoDevelopment/ExoPlayer/1.%20ExoPlayer%E7%AE%80%E4%BB%8B.md) +[下一篇: 3. ExoPlayer源码分析之prepare方法](./VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md) --- diff --git "a/VideoDevelopment/ExoPlayer/3. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\346\226\271\346\263\225.md" "b/VideoDevelopment/ExoPlayer/3. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\346\226\271\346\263\225.md" index 54185eca..ce44641e 100644 --- "a/VideoDevelopment/ExoPlayer/3. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\346\226\271\346\263\225.md" +++ "b/VideoDevelopment/ExoPlayer/3. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\346\226\271\346\263\225.md" @@ -6,7 +6,7 @@ ### 找入口 分析的时候首先要找到一个切入点,上一篇文章中写了怎么去创建使用,我们再看一遍代码,如下: -``` +```java View.inflate(context, R.layout.video_view, this) mPlayer = ExoPlayerFactory.newSimpleInstance(context) mPlayerView.player = mPlayer @@ -27,7 +27,7 @@ mPlayer.prepare(mediaSource) ### 类图 先看一下`ExoPlayer`接口的实现: -``` +``` java /** * An extensible media player that plays MediaSources. Instances can be obtained from ExoPlayerFactory. */ @@ -39,7 +39,7 @@ public interface ExoPlayer extends Player { ``` 它实现了Player接口: -``` +```java public interface Player { interface AudioComponent interface VideoComponent @@ -72,7 +72,7 @@ public interface Player { Player接口有一个默认的实现类BasePlayer: -``` +``` java /** Abstract base {@link Player} which implements common implementation independent methods. */ public abstract class BasePlayer implements Player { @@ -83,7 +83,7 @@ public abstract class BasePlayer implements Player { ### ExoPlayer创建部分 获取ExoPlayer对象的实例是通过ExoPlayerFactory来实现的,这里面提供了一些静态的方法: -``` +```java public static SimpleExoPlayer newSimpleInstance(Context context) { return newSimpleInstance(context, new DefaultTrackSelector()); } @@ -104,7 +104,7 @@ public static ExoPlayer newInstance( ``` 通过这个工厂类可以获取SimpleExoPlayer或者ExoPlayer接口的实例。我们上面是通过该工厂类的ExoPlayerFactory.newSimpleInstance(context)来获取的SimpleExoPlayer。而newSimpleInstance()方法的实现如下: -``` +```java public static SimpleExoPlayer newSimpleInstance( Context context, RenderersFactory renderersFactory, @@ -127,7 +127,7 @@ public static SimpleExoPlayer newSimpleInstance( ``` 可以看到它最后调用了new SimpleExoPlayer,并且传入了一些参数,这些参数主要有: -- TrackSelector:轨道提取器,The component of an ExoPlayer responsible for selecting tracks to be consumed by each of the player's Renderers. The DefaultTrackSelector implementation should be suitable for most use cases.从MediaSource中提取各个轨道的二进制数据,交给Renderer渲染,它有个selectTracks()方法,会返回TrackSelection数组,TrackSelection就是对轨道进行解析的,因为一个文件有多个轨道:音频轨、视频轨、文字轨等,所以也需要多个TrackSelection。 +- **TrackSelector** :轨道提取器,The component of an ExoPlayer responsible for selecting tracks to be consumed by each of the player's Renderers. The DefaultTrackSelector implementation should be suitable for most use cases.从MediaSource中提取各个轨道的二进制数据,交给Renderer渲染,它有个selectTracks()方法,会返回TrackSelection数组,TrackSelection就是对轨道进行解析的,因为一个文件有多个轨道:音频轨、视频轨、文字轨等,所以也需要多个TrackSelection。 - Renderer:对多媒体中的各个轨道(音轨、视频轨、字母轨等)数据进行渲染,渲染就是"播放",把二进制文件渲染成声音、画面,创建播放器时传入。 RenderersFactory的作用就是创建Renderers,每个资源可能有音频、视频等多个轨道,每个Render对应一个轨道,Renderer对应的有VideoRender、AudioRender、TextRenderer、MetadataRenderers等等 - LoadControl:对MediaSource进行控制,比如什么时候开始缓冲、缓冲多少等 主要是记录一些位置。 @@ -137,10 +137,12 @@ RenderersFactory的作用就是创建Renderers,每个资源可能有音频、 它们之间的关系是: -渲染器(Render) ---刷数据--->提取器(Extraor) ----读取数据---> 加载控制器(LoadControl) ----控制数据加载方式---> 媒体源(MediaSource) + 渲染器(Render) ---> 刷数据--->提取器(Extraor) + ---> 读取数据 ---> 加载控制器(LoadControl) + ---> 控制数据加载方式 ---> 媒体源(MediaSource) 扯远了,继续看SimpleExoPlayer的构造函数: -``` +```java public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, Player.AudioComponent, @@ -208,7 +210,7 @@ public class SimpleExoPlayer extends BasePlayer ``` 该方法里面调用了new ExoPlayerImpl(),继续看一下ExoPlayerImpl的构造函数: -``` +```java final class ExoPlayerImpl extends BasePlayer implements ExoPlayer { public ExoPlayerImpl( Renderer[] renderers, @@ -271,7 +273,7 @@ final class ExoPlayerImpl extends BasePlayer implements ExoPlayer { 里面又创建了ExoPlayerImplInternal,并把那些参数全部传递到这里面了: -``` +```java public ExoPlayerImplInternal( Renderer[] renderers, TrackSelector trackSelector, @@ -335,7 +337,7 @@ public ExoPlayerImplInternal( ### ExoPlayer.prepare()部分 我们找到SimpleExoPlayer.prepare()方法: -``` +```java @Override public void prepare(MediaSource mediaSource) { prepare(mediaSource, /* resetPosition= */ true, /* resetState= */ true); @@ -359,7 +361,7 @@ public ExoPlayerImplInternal( } ``` 所以要继续看ExoPlayerImpl.prepare()方法: -``` +``` java @Override public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { playbackError = null; @@ -384,7 +386,7 @@ public ExoPlayerImplInternal( } ``` 所以要继续再看ExoPlayerImplInternal的prepare方法: -``` +```java public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { // 调用handler.sendMessage,上面在handler初始化的时候说过,该handler发送的消息会走到该类的handleMessage方法。 handler @@ -392,8 +394,9 @@ public ExoPlayerImplInternal( .sendToTarget(); } ``` + 所以接下来要继续看一下ExoPlayerImplInternal.handleMessage()方法,这个方法比较多,我们这里只要看MSG_PREPARE部分: -``` +```java public boolean handleMessage(Message msg) { try { switch (msg.what) { @@ -421,7 +424,7 @@ public ExoPlayerImplInternal( ``` 里面调用了prepareInternal()方法: -``` +```java private void prepareInternal(MediaSource mediaSource, boolean resetPosition, boolean resetState) { pendingPrepareCount++; // 这个方法是做一些资源的释放初始化等操作,移除MSG_DO_SOME_WORK消息,然后重置Render,把之前的MediaSource释放等 @@ -445,7 +448,7 @@ private void prepareInternal(MediaSource mediaSource, boolean resetPosition, boo #### MediaSource.prepareSource() 在看之前有必要先看一下MediaSource接口: -``` +``` java Defines and provides media to be played by an ExoPlayer. A MediaSource has two main responsibilities: To provide the player with a Timeline defining the structure of its media, and to provide a new timeline whenever the structure of the media changes. The MediaSource provides these timelines by calling MediaSource.SourceInfoRefreshListener.onSourceInfoRefreshed on the MediaSource.SourceInfoRefreshListeners passed to prepareSource(MediaSource.SourceInfoRefreshListener, TransferListener). To provide MediaPeriod instances for the periods in its timeline. MediaPeriods are obtained by calling createPeriod(MediaSource.MediaPeriodId, Allocator, long), and provide a way for the player to load and read the media. @@ -455,7 +458,7 @@ To provide MediaPeriod instances for the periods in its timeline. MediaPeriods a - 对Timeline中的媒体片段提供MediaPeriod对象,player通过MediaPeriod中提供的方式来读取媒体数据 继续看一下mediaSource.prepareSource()方法,它的实现是在BaseMediaSource类中的: -``` +```java public final void prepareSource( SourceInfoRefreshListener listener, @Nullable TransferListener mediaTransferListener) { @@ -472,7 +475,7 @@ public final void prepareSource( } ``` 继续看prepareSourceInternal()方法,该方法是子类去实现的,这里我们用普通视频格式的ProgressiveMediaSource类来看: -``` +```java public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { transferListener = mediaTransferListener; notifySourceInfoRefreshed(timelineDurationUs, timelineIsSeekable); @@ -497,7 +500,7 @@ protected final void refreshSourceInfo(Timeline timeline, @Nullable Object manif } ``` 而这里的listener是谁呢? 是ExoPlayerImplInternal,继续看ExoPlayerImplInternal.onSourceInfoRefreshed()方法: -``` +```java public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, Object manifest) { handler.obtainMessage(MSG_REFRESH_SOURCE_INFO, new MediaSourceRefreshInfo(source, timeline, manifest)).sendToTarget(); @@ -505,7 +508,7 @@ public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, Object ``` 接着就是发送MSG_REFRESH_SOURCE_INFO消息,然后我们到handleMessage()中看一下: -``` +```java public boolean handleMessage(Message msg) { try { switch (msg.what) { @@ -528,7 +531,7 @@ Message发送过来的是MediaSourceRefreshInfo对象,然后将其作为参数 #### MSG_DO_SOME_WORK消息 handleMessage方法中在收到MSG_DO_SOME_WORK后调用了doSomeWork()方法,我们看一下他里面的实现: -``` +```java private void doSomeWork() throws ExoPlaybackException, IOException { // 获取系统时间 long operationStartTimeMs = clock.uptimeMillis(); @@ -618,7 +621,7 @@ private void doSomeWork() throws ExoPlaybackException, IOException { ``` 可以看出,doSomeWork()方法会不断的去绘制,然后每次绘制完一部分就会继续循环调用该方法去绘制下一个媒体片段。上面可以看到核心功能在updatePeriods()方法,通过循环来不断的去加载下一个媒体片段,来达到播放的功能,所以接下来看一下该方法: -``` +``` java private void updatePeriods() throws ExoPlaybackException, IOException { if (mediaSource == null) { // The player has no media source yet. @@ -686,7 +689,7 @@ private void doSomeWork() throws ExoPlaybackException, IOException { ``` maybeUpdateLoadingPeriod()是用来检测是否加载下一个媒体片段的: -``` +```java private void maybeUpdateLoadingPeriod() throws IOException { // 如果现在有一个正在loading的片段,会重新去评估 queue.reevaluateBuffer(rendererPositionUs); @@ -724,7 +727,7 @@ private void maybeUpdateLoadingPeriod() throws IOException { #### 先看获取MediaPeriod的部分 MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: -``` +```java public MediaPeriod enqueueNextMediaPeriod( RendererCapabilities[] rendererCapabilities, TrackSelector trackSelector, @@ -758,7 +761,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: } ``` 而MediaPeriodHolder的构造函数是: -``` +```java public MediaPeriodHolder( RendererCapabilities[] rendererCapabilities, long rendererPositionOffsetUs, @@ -780,7 +783,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: } ``` 接着是createMediaPeriod(): -``` +```java /** Returns a media period corresponding to the given {@code id}. */ private static MediaPeriod createMediaPeriod( MediaPeriodId id, @@ -798,7 +801,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: } ``` 然后就是MediaSource.createPeriod()方法,我们用ProgressiveMediaPeriod来看: -``` +```java public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator, long startPositionUs) { DataSource dataSource = dataSourceFactory.createDataSource(); if (transferListener != null) { @@ -819,7 +822,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: #### 再看MediaPeriod.prepare部分 这里还是用普通视频的ProgressiveMediaPeriod来看: -``` +```java public void prepare(Callback callback, long positionUs) { this.callback = callback; loadCondition.open(); @@ -829,7 +832,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: ``` 接着看startLoading()方法: -``` +```java private void startLoading() { // 注意这个loadable,里面有uri和DataSource ExtractingLoadable loadable = @@ -865,7 +868,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: } ``` 接着看一下Loader类的startLoading()方法: -``` +```java public long startLoading( T loadable, Callback callback, int defaultMinRetryCount) { Looper looper = Looper.myLooper(); @@ -878,7 +881,7 @@ MediaPeriodQueue.enqueueNextMediaPeriod方法的实现如下: ``` 里面启动了LoadTask,LoadTask是一个Runnable的实现类,我们就直接看它的run方法: -``` +```java private final class LoadTask extends Handler implements Runnable { public void run() { try { @@ -935,7 +938,7 @@ private final class LoadTask extends Handler implements Runn ``` 要想看ExtractingLoadable.load()方法,需要先看一下ExtractingLoadable类,以及他的构造函数: -``` +```java /** Loads the media stream and extracts sample data from it. */ final class ExtractingLoadable implements Loadable, IcyDataSource.Listener { // DataSource是从流中读取数据的部分 @@ -1018,7 +1021,7 @@ final class ExtractingLoadable implements Loadable, IcyDataSource.Listener { ``` 我们看到数据加载完成后会执行到onContinueLoadingRequestedRunnable中: 而该Runnable的实现: -``` +```java onContinueLoadingRequestedRunnable = () -> { if (!released) { @@ -1028,14 +1031,14 @@ onContinueLoadingRequestedRunnable = }; ``` 会调用到onContinueLoadingRequested,该实现类就是ExoPlayerImplInternal类: -``` +``` java @Override public void onContinueLoadingRequested(MediaPeriod source) { handler.obtainMessage(MSG_SOURCE_CONTINUE_LOADING_REQUESTED, source).sendToTarget(); } ``` 又是发消息,我们继续看下handleMessage方法里面的MSG_SOURCE_CONTINUE_LOADING_REQUESTED,收到该message会执行以下方法: -``` +``` java private void handleContinueLoadingRequested(MediaPeriod mediaPeriod) { if (!queue.isLoading(mediaPeriod)) { // Stale event. @@ -1075,8 +1078,8 @@ private void handleContinueLoadingRequested(MediaPeriod mediaPeriod) { -[上一篇: 2. ExoPlayer MediaSource简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md) -[下一篇: 4. ExoPlayer源码分析之prepare序列图](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/4.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E5%BA%8F%E5%88%97%E5%9B%BE.md) +[上一篇: 2. ExoPlayer MediaSource简介](./VideoDevelopment/ExoPlayer/2.%20ExoPlayer%20MediaSource%E7%AE%80%E4%BB%8B.md) +[下一篇: 4. ExoPlayer源码分析之prepare序列图](./VideoDevelopment/ExoPlayer/4.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E5%BA%8F%E5%88%97%E5%9B%BE.md) --- diff --git "a/VideoDevelopment/ExoPlayer/4. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\345\272\217\345\210\227\345\233\276.md" "b/VideoDevelopment/ExoPlayer/4. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\345\272\217\345\210\227\345\233\276.md" index 61d0babf..f2c794bc 100644 --- "a/VideoDevelopment/ExoPlayer/4. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\345\272\217\345\210\227\345\233\276.md" +++ "b/VideoDevelopment/ExoPlayer/4. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213prepare\345\272\217\345\210\227\345\233\276.md" @@ -35,8 +35,8 @@ Renderer->Renderer: if (isPlaying) {renderer.start()} -[上一篇: 3. ExoPlayer源码分析之prepare方法](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md) -[下一篇: 5. ExoPlayer源码分析之PlayerView](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/ExoPlayer/5.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8BPlayerView.md) +[上一篇: 3. ExoPlayer源码分析之prepare方法](./VideoDevelopment/ExoPlayer/3.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bprepare%E6%96%B9%E6%B3%95.md) +[下一篇: 5. ExoPlayer源码分析之PlayerView](./VideoDevelopment/ExoPlayer/5.%20ExoPlayer%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8BPlayerView.md) --- diff --git "a/VideoDevelopment/ExoPlayer/5. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213PlayerView.md" "b/VideoDevelopment/ExoPlayer/5. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213PlayerView.md" index f9b839f7..c3077271 100644 --- "a/VideoDevelopment/ExoPlayer/5. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213PlayerView.md" +++ "b/VideoDevelopment/ExoPlayer/5. ExoPlayer\346\272\220\347\240\201\345\210\206\346\236\220\344\271\213PlayerView.md" @@ -4,7 +4,7 @@ 前面两篇文章大体看了一下ExoPlayer.prepare()部分,接下来,我们要看一下UI部分的封装,PlayerView: xml声明: -``` +```xml 顶点着色器 -> 图元装配 -> 几何着色器 -> 光栅化 -> 片段着色器 -> 逐片段处理 -> 帧缓冲 +OpenGL渲染管线的流程为: + + 顶点数据 + -> 顶点着色器 -> 图元装配 -> 几何着色器 + -> 光栅化 -> 片段着色器 -> 逐片段处理 -> 帧缓冲 OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规范组成:OpenGL ES3.0 API规范和OpenGL ES着色语言3.0规范(OpenGL ES SL)。 @@ -67,11 +69,18 @@ OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规 -- 顶点着色器(Vertex Shader): 用来渲染图形顶点的OpenGL ES代码。生成每个顶点的最终位置 +- 顶点着色器(**Vertex Shader**): 用来渲染图形顶点的OpenGL ES代码。生成每个顶点的最终位置 + + 着色器(shader)是在GPU上运行的小程序。 + 从名称可以看出,可通过处理它们来处理顶点。此程序使用OpenGL ES SL语言来编写。 + 它是一个描述顶点或像素特性的简单程序。 + + OpenGL最本质的概念之一就是着色器,它是图形硬件设备所执行的一类特殊函数。 + 理解着色器最好的办法就是把它看做是专为图形处理单元(即GPU)编译的一种小型程序。 - 着色器(shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点。此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。OpenGL最本质的概念之一就是着色器,它是图形硬件设备所执行的一类特殊函数。理解着色器最好的办法就是把它看做是专为图形处理单元(即GPU)编译的一种小型程序。任何一种OpenGL程序本质上都可以被分为两部分:CPU端运行的部分,采用C++、Java之类的语言编写;以及GPU端运行的部分,使用GLSL语言编写。 + 任何一种OpenGL程序本质上都可以被分为两部分:CPU端运行的部分,采用C++、Java之类的语言编写;以及GPU端运行的部分,使用GLSL语言编写。 - 顶点着色器可以操作的属性有: 位置、颜色、纹理坐标,但是不能创建新的顶点。最终产生纹理坐标、颜色、点位置等信息送往后续阶段。 + 顶点着色器可以操作的属性有: **位置、颜色、纹理坐标**,但是不能创建新的顶点。最终产生纹理坐标、颜色、点位置等信息送往后续阶段。 - 图元装配(Primitive Assembly) @@ -81,7 +90,7 @@ OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规 - GL_LINES:以线的形式绘制 - GL_TRIANGLE_STRIP:以三角形的形式绘制,所有二维图像的渲染都会使用这种方式。 - 该过程还有两个重要操作:裁剪和淘汰。 + 该过程还有两个重要操作:**裁剪和淘汰**。 - 裁剪是指对于不在视椎体(屏幕上可见的3D区域)内的图元进行裁剪。 @@ -89,11 +98,11 @@ OpenGL ES 3.0实现了具有可编程着色功能的图形管线,有两个规 - 光栅化阶段(Rasterization Stage) - 这里会把图元映射为最终屏幕上相应的像素,生成供片段着色器(fragment shader)使用的片段。在图元装配后传递过来的图元数据中,这些图元信息只是顶点而已。顶点处都还没有像素点,直线段端点之间是空的、多边形的边和内部也是空的,光栅化的任务就是构造这些。将图片转化为片段(fragment)的过程叫做光栅化。 这个阶段会将图元数据分解成更小的单元并对应于帧缓冲区的各个像素,这些单元成为片元,一个片元可能包含窗口颜色、纹理坐标等属性。 + 这里会**把图元映射为最终屏幕上相应的像素**,生成供片段着色器(fragment shader)使用的片段。在图元装配后传递过来的图元数据中,这些图元信息只是顶点而已。顶点处都还没有像素点,直线段端点之间是空的、多边形的边和内部也是空的,光栅化的任务就是构造这些。将图片转化为片段(fragment)的过程叫做光栅化。 这个阶段会将图元数据分解成更小的单元并对应于帧缓冲区的各个像素,这些单元成为片元,一个片元可能包含窗口颜色、纹理坐标等属性。 光栅化其实是一种将几何图元变成二维图像的过程。在这里,虚拟3D世界中的物体投影到平面上,并生成一系列的片段。 -- 片段着色器或片元着色器(Fragment Shader):使用颜色或纹理(texture)渲染图形表面的OpenGLES代码。 +- 片段着色器或片元着色器(**Fragment Shader**) : 使用颜色或纹理(texture)渲染图形表面的OpenGLES代码。 主要目的是计算一个像素的最终颜色。光栅化操作构造了像素点,这个阶段就是处理这些像素点,根据自己的业务,例如高亮、饱和度调节、高斯模糊等来变化这个片元的颜色。为组成点、直线和三角形的每个片元生成最终颜色/纹理,针对每个片元都会执行一次,一个片元是一个小的、单一颜色的长方形区域,类似于计算机屏幕上的一个像素。一旦最终颜色生成,OpenGL就会把它们写到一块成为帧缓冲区的内存块中,然后Android就会把这个帧缓冲区显示到屏幕上。 @@ -186,7 +195,7 @@ EGL为双缓冲工作模式,既有一个Back Frame Buffer和一个Front Frame 1. 获取显示设备(EGL Display) - 获取将要用于显示的设备,有些系统具有多个显示器,会存在多个display,在Android上通过调用EGL10的eglGetDisplay(Object native_display)方法获得EGLDisplay对象,通常传入的参数为EGL10.EGL_DEFAULT_DISPLAY。 + **获取将要用于显示的设备**,有些系统具有多个显示器,会存在多个display,在Android上通过调用EGL10的eglGetDisplay(Object native_display)方法获得EGLDisplay对象,通常传入的参数为EGL10.EGL_DEFAULT_DISPLAY。 2. 初始化EGL @@ -236,7 +245,7 @@ Android 框架中有如下两个基本类,用于通过 OpenGL ES API 来创建 -[下一篇: 2.GLSurfaceView简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md) +[下一篇: 2.GLSurfaceView简介](./VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md) --- diff --git "a/VideoDevelopment/OpenGL/10.GLSurfaceView+MediaPlayer\346\222\255\346\224\276\350\247\206\351\242\221.md" "b/VideoDevelopment/OpenGL/10.GLSurfaceView+MediaPlayer\346\222\255\346\224\276\350\247\206\351\242\221.md" index 88ca3e35..98eafc3b 100644 --- "a/VideoDevelopment/OpenGL/10.GLSurfaceView+MediaPlayer\346\222\255\346\224\276\350\247\206\351\242\221.md" +++ "b/VideoDevelopment/OpenGL/10.GLSurfaceView+MediaPlayer\346\222\255\346\224\276\350\247\206\351\242\221.md" @@ -326,8 +326,8 @@ public class VideoPlayerRender extends BaseGLSurfaceViewRenderer { -[上一篇: 9.OpenGL ES纹理](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md) -[下一篇: 11.OpenGL ES滤镜](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/11.OpenGL%20ES%E6%BB%A4%E9%95%9C.md) +[上一篇: 9.OpenGL ES纹理](./VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md) +[下一篇: 11.OpenGL ES滤镜](./VideoDevelopment/OpenGL/11.OpenGL%20ES%E6%BB%A4%E9%95%9C.md) --- diff --git "a/VideoDevelopment/OpenGL/11.OpenGL ES\346\273\244\351\225\234.md" "b/VideoDevelopment/OpenGL/11.OpenGL ES\346\273\244\351\225\234.md" index ed330195..c72d49d5 100644 --- "a/VideoDevelopment/OpenGL/11.OpenGL ES\346\273\244\351\225\234.md" +++ "b/VideoDevelopment/OpenGL/11.OpenGL ES\346\273\244\351\225\234.md" @@ -373,7 +373,7 @@ public class BaseFilter { -[上一篇: 10.GLSurfaceView+MediaPlayer播放视频](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md) +[上一篇: 10.GLSurfaceView+MediaPlayer播放视频](./VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md) --- diff --git "a/VideoDevelopment/OpenGL/2.GLSurfaceView\347\256\200\344\273\213.md" "b/VideoDevelopment/OpenGL/2.GLSurfaceView\347\256\200\344\273\213.md" index dab69c89..2066c0db 100644 --- "a/VideoDevelopment/OpenGL/2.GLSurfaceView\347\256\200\344\273\213.md" +++ "b/VideoDevelopment/OpenGL/2.GLSurfaceView\347\256\200\344\273\213.md" @@ -2,7 +2,7 @@ Android 通过其框架 API 和原生开发套件 (NDK) 来支持 OpenGL。 -Android 框架中有如下两个基本类,用于通过 OpenGL ES API 来创建和操控图形:`GLSurfaceView` 和 `GLSurfaceView.Renderer`。也就是说我们想在Android中使用OpenGL ES的最简单的方法就是将我们要显示的图像渲染到GLSurfaceView上,但它只是一个展示类,至于怎么渲染到上面我们就要自己去实现GLSurfaceView.Renderer来生成我们自己的渲染器从而完成渲染操作,这里是不是感觉Android框架提供的类太少了,怎么没有GLTextureView,后面在分析完GLSurfaceView的源码后,可以直接拷贝自己去实现GLTextureView,[有关SurfaceView与TextureView的区别可以看这篇文章](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/SurfaceView%E4%B8%8ETextureView.md)。 +Android 框架中有如下两个基本类,用于通过 OpenGL ES API 来创建和操控图形:`GLSurfaceView` 和 `GLSurfaceView.Renderer`。也就是说我们想在Android中使用OpenGL ES的最简单的方法就是将我们要显示的图像渲染到GLSurfaceView上,但它只是一个展示类,至于怎么渲染到上面我们就要自己去实现GLSurfaceView.Renderer来生成我们自己的渲染器从而完成渲染操作,这里是不是感觉Android框架提供的类太少了,怎么没有GLTextureView,后面在分析完GLSurfaceView的源码后,可以直接拷贝自己去实现GLTextureView,[有关SurfaceView与TextureView的区别可以看这篇文章](./VideoDevelopment/SurfaceView%E4%B8%8ETextureView.md)。 ### GLSurfaceView(使用OpenGL绘制的图形的视图容器) @@ -40,11 +40,11 @@ OpenGL ES 3.0/3.1 API 软件包: ### GLSurfaceView类 ```java package android.opengl; -/** - * An implementation of SurfaceView that uses the dedicated surface for - * displaying OpenGL rendering. - */ - public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback2 { + /** + * An implementation of SurfaceView that uses the dedicated surface for + * displaying OpenGL rendering. + */ + public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback2 { } ``` @@ -176,16 +176,19 @@ GLSurfaceView默认采用的是RENDERMODE_CONTINUOUSLY连续渲染的方式, 说到GLSurfaceView就一定要提一下SurfaceTexture。 -和SurfaceView功能类似,区别是,SurfaceTexure可以不显示在界面中。使用OpenGl对图片流进行美化,添加水印,滤镜这些操作的时候我们都是通过SurfaceTexre去处理,处理完之后再通过GlSurfaceView显示。缺点,可能会导致个别帧的延迟。本身管理着BufferQueue,所以内存消耗会多一点。 +和SurfaceView功能类似,区别是,SurfaceTexure可以不显示在界面中。使用OpenGL对图片流进行美化,添加水印,滤镜这些操作的时候我们都是通过SurfaceTexre去处理,处理完之后再通过GlSurfaceView显示。 + +缺点,可能会导致个别帧的延迟。本身管理着BufferQueue,所以内存消耗会多一点。 SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象,接下来,就可以像操作普通GL纹理一样操作它了。 SurfaceTexture 可以将 Surface 中最近的图像数据更新到 GL Texture 中。通过 GL Texture 我们就可以拿到视频帧,然后直接渲染到 GLSurfaceView 中。 通过 **setOnFrameAvailableListener(listener)** 可以向 SurfaceTexture 注册监听事件,当 Surface 有新的图像可用时,调用 SurfaceTexture 的 **updateTexImage()** 方法将图像内容更新到 GL Texture 中,然后做绘制操作。SurfaceTexture中的attachToGLContext()和detachToGLContext()可以让多个GL context共享同一个内容源。 + SurfaceTexture对象可以在任何线程上创建。 updateTexImage()只能在包含纹理对象的OpenGL ES上下文的线程上调用。 在任意线程上调用frame-available回调函数,不与updateTexImage()在同一线程上出现。 -[上一篇: 1.OpenGL简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/1.OpenGL%E7%AE%80%E4%BB%8B.md) -[下一篇: 3.GLSurfaceView源码解析](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md) +[上一篇: 1.OpenGL简介](./VideoDevelopment/OpenGL/1.OpenGL%E7%AE%80%E4%BB%8B.md) +[下一篇: 3.GLSurfaceView源码解析](./VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md) --- diff --git "a/VideoDevelopment/OpenGL/3.GLSurfaceView\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/VideoDevelopment/OpenGL/3.GLSurfaceView\346\272\220\347\240\201\350\247\243\346\236\220.md" index d5c9e8ab..8364ada2 100644 --- "a/VideoDevelopment/OpenGL/3.GLSurfaceView\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/VideoDevelopment/OpenGL/3.GLSurfaceView\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -690,8 +690,8 @@ public void setRenderer(Renderer renderer) { -[上一篇: 2.GLSurfaceView简介](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md) -[下一篇: 4.GLTextureView实现](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md) +[上一篇: 2.GLSurfaceView简介](./VideoDevelopment/OpenGL/2.GLSurfaceView%E7%AE%80%E4%BB%8B.md) +[下一篇: 4.GLTextureView实现](./VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md) --- diff --git "a/VideoDevelopment/OpenGL/4.GLTextureView\345\256\236\347\216\260.md" "b/VideoDevelopment/OpenGL/4.GLTextureView\345\256\236\347\216\260.md" index 86affc03..c3fc06b2 100644 --- "a/VideoDevelopment/OpenGL/4.GLTextureView\345\256\236\347\216\260.md" +++ "b/VideoDevelopment/OpenGL/4.GLTextureView\345\256\236\347\216\260.md" @@ -1978,8 +1978,8 @@ public class GLTextureView extends TextureView implements TextureView.SurfaceTex -[上一篇: 3.GLSurfaceView源码解析](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md) -[下一篇: 5.OpenGL ES绘制三角形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md) +[上一篇: 3.GLSurfaceView源码解析](./VideoDevelopment/OpenGL/3.GLSurfaceView%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md) +[下一篇: 5.OpenGL ES绘制三角形](./VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md) --- diff --git "a/VideoDevelopment/OpenGL/5.OpenGL ES\347\273\230\345\210\266\344\270\211\350\247\222\345\275\242.md" "b/VideoDevelopment/OpenGL/5.OpenGL ES\347\273\230\345\210\266\344\270\211\350\247\222\345\275\242.md" index 6e9adc89..d11bb5da 100644 --- "a/VideoDevelopment/OpenGL/5.OpenGL ES\347\273\230\345\210\266\344\270\211\350\247\222\345\275\242.md" +++ "b/VideoDevelopment/OpenGL/5.OpenGL ES\347\273\230\345\210\266\344\270\211\350\247\222\345\275\242.md" @@ -187,45 +187,46 @@ TriangleRender的实现如下: ```java public class TriangleRender implements GLSurfaceView.Renderer { - //一个Float占用4Byte + // 一个Float占用4Byte private static final int BYTES_PER_FLOAT = 4; - //三个顶点 + // 三个顶点 private static final int POSITION_COMPONENT_COUNT = 3; - //顶点位置缓存 + // 顶点位置缓存 private final FloatBuffer vertexBuffer; - //顶点颜色缓存 + // 顶点颜色缓存 private final FloatBuffer colorBuffer; - //渲染程序 + // 渲染程序 private int mProgram; /*****************1.声明绘制图形的坐标和颜色数据 start**************/ - //三个顶点的位置参数 + // 三个顶点的位置参数 private float triangleCoords[] = { - 0.5f, 0.5f, 0.0f, // top + 0.5f, 0.5f, 0.0f, // top -0.5f, -0.5f, 0.0f, // bottom left - 0.5f, -0.5f, 0.0f // bottom right + 0.5f, -0.5f, 0.0f // bottom right }; - //三个顶点的颜色参数 + // 三个顶点的颜色参数 private float color[] = { - 1.0f, 0.0f, 0.0f, 1.0f,// top - 0.0f, 1.0f, 0.0f, 1.0f,// bottom left - 0.0f, 0.0f, 1.0f, 1.0f// bottom right + 1.0f, 0.0f, 0.0f, 1.0f, // top + 0.0f, 1.0f, 0.0f, 1.0f, // bottom left + 0.0f, 0.0f, 1.0f, 1.0f // bottom right }; - /*****************1.声明绘制图形的坐标和颜色数据 end**************/ + /***************** 1.声明绘制图形的坐标和颜色数据 **************/ public TriangleRender() { - /****************2.为顶点位置及颜色申请本地内存 start************/ - //将顶点数据拷贝映射到native内存中,以便OpenGL能够访问 - //分配本地内存空间,每个浮点型占4字节空间;将坐标数据转换为FloatBuffer,用以传入给OpenGL ES程序 + /**************** 2.为顶点位置及颜色申请本地内存 start************/ + // 将顶点数据拷贝映射到native内存中,以便OpenGL能够访问 + // 分配本地内存空间,每个浮点型占4字节空间;将坐标数据转换为FloatBuffer,用以传入给OpenGL ES程序 vertexBuffer = ByteBuffer.allocateDirect(triangleCoords.length * BYTES_PER_FLOAT) // 直接分配native内存 .order(ByteOrder.nativeOrder()) // 和本地平台保持一致的字节序 .asFloatBuffer(); // 将底层字节映射到FloatBuffer实例,方便使用 vertexBuffer.put(triangleCoords); // 将顶点数据拷贝到native内存中 + // 将数组数据put进buffer之后,指针并不是在首位,所以一定要position到0,至关重要!否则会有很多奇妙的错误!将缓冲区的指针移动到头部,保证数据是从最开始处读取 vertexBuffer.position(0); - //顶点颜色相关 + // 顶点颜色相关 colorBuffer = ByteBuffer.allocateDirect(color.length * BYTES_PER_FLOAT) .order(ByteOrder.nativeOrder()) .asFloatBuffer(); @@ -236,21 +237,24 @@ public class TriangleRender implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { - //将背景设置为白色 + // 将背景设置为白色 GLES30.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - /******************3.加载编译顶点着色器和片段着色器 start**********/ - //编译顶点着色程序 + /****************** 3.加载编译顶点着色器和片段着色器 **********/ + // 编译顶点着色程序 String vertexShaderStr = readResource(MyApplication.getInstance(), R.raw.triangle_vertex_shader); int vertexShaderId = compileVertexShader(vertexShaderStr); - //编译片段着色程序 + + // 编译片段着色程序 String fragmentShaderStr = readResource(MyApplication.getInstance(), R.raw.triangle_fragment_shader); int fragmentShaderId = compileFragmentShader(fragmentShaderStr); - /******************3.加载编译顶点着色器和片段着色器 end**********/ - /******************4.创建program,连接顶点和片段着色器并链接program start***********/ + + /****************** 3.加载编译顶点着色器和片段着色器 **********/ + /****************** 4.创建program,连接顶点和片段着色器并链接program start***********/ //连接程序 mProgram = linkProgram(vertexShaderId, fragmentShaderId); /******************4.创建program,连接顶点和片段着色器并链接program end***********/ + //在OpenGLES环境中使用程序 GLES30.glUseProgram(mProgram); } @@ -262,17 +266,19 @@ public class TriangleRender implements GLSurfaceView.Renderer { public void onDrawFrame(GL10 unused) { /**********6.绘制************/ - //把颜色缓冲区设置为我们预设的颜色,绘图设计到多种缓冲区类型:颜色、深度和模板。这里只是向颜色缓冲区中绘制图形 + // 把颜色缓冲区设置为我们预设的颜色,绘图设计到多种缓冲区类型:颜色、深度和模板。这里只是向颜色缓冲区中绘制图形 GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); + // glVertexAttribPointer是把顶点位置属性赋值给着色器程序 - //0是上面着色器中写的vPosition的变量位置(location = 0)。意思就是绑定vertex坐标数据,然后将在vertextBuffer中的顶点数据传给vPosition变量。 + // 0是上面着色器中写的vPosition的变量位置(location = 0)。意思就是绑定vertex坐标数据,然后将在vertextBuffer中的顶点数据传给vPosition变量。 // 你肯定会想,如果我在着色器中不写呢?int vposition = glGetAttribLocation(program, "vPosition");就可以获得他的属性位置了 // 第二个size是3,是因为上面我们triangleCoords声明的属性就是3位,xyz GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer); - //启用顶点变量,这个0也是vPosition在着色器变量中的位置,和上面一样,在着色器文件中的location=0声明的 + + // 启用顶点变量,这个0也是vPosition在着色器变量中的位置,和上面一样,在着色器文件中的location=0声明的 GLES30.glEnableVertexAttribArray(0); - //准备颜色数据 + // 准备颜色数据 /** * glVertexAttribPointer()方法的参数上面的也说过了,这里再按照这个场景说一下分别为: * index:顶点属性的索引.(这里我们的顶点位置和颜色向量在着色器中分别为0和1)layout (location = 0) in vec4 vPosition; layout (location = 1) in vec4 aColor; @@ -291,7 +297,7 @@ public class TriangleRender implements GLSurfaceView.Renderer { // GLES30.glDrawArrays(GLES30.GL_POINTS, 0, POSITION_COMPONENT_COUNT); //绘制三条线 -// GLES30.glLineWidth(3);//设置线宽 +// GLES30.glLineWidth(3); //设置线宽 // GLES30.glDrawArrays(GLES30.GL_LINE_LOOP, 0, POSITION_COMPONENT_COUNT); //绘制三角形 @@ -913,8 +919,8 @@ public class IsoTriangleRender implements GLTextureView.Renderer { -[上一篇: 4.GLTextureView实现](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md) -[下一篇: 6.OpenGL ES绘制矩形及圆形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md) +[上一篇: 4.GLTextureView实现](./VideoDevelopment/OpenGL/4.GLTextureView%E5%AE%9E%E7%8E%B0.md) +[下一篇: 6.OpenGL ES绘制矩形及圆形](./VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md) --- diff --git "a/VideoDevelopment/OpenGL/6.OpenGL ES\347\273\230\345\210\266\347\237\251\345\275\242\345\217\212\345\234\206\345\275\242.md" "b/VideoDevelopment/OpenGL/6.OpenGL ES\347\273\230\345\210\266\347\237\251\345\275\242\345\217\212\345\234\206\345\275\242.md" index 37e1661c..7cd74b30 100644 --- "a/VideoDevelopment/OpenGL/6.OpenGL ES\347\273\230\345\210\266\347\237\251\345\275\242\345\217\212\345\234\206\345\275\242.md" +++ "b/VideoDevelopment/OpenGL/6.OpenGL ES\347\273\230\345\210\266\347\237\251\345\275\242\345\217\212\345\234\206\345\275\242.md" @@ -422,8 +422,8 @@ public class CircleRender extends BaseGLSurfaceViewRenderer { } ``` -[上一篇: 5.OpenGL ES绘制三角形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md) -[下一篇: 7.OpenGL ES着色器语言GLSL](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md) +[上一篇: 5.OpenGL ES绘制三角形](./VideoDevelopment/OpenGL/5.OpenGL%20ES%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2.md) +[下一篇: 7.OpenGL ES着色器语言GLSL](./VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md) --- diff --git "a/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" "b/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" index 7e935fbd..ce10a73c 100644 --- "a/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" +++ "b/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" @@ -250,8 +250,8 @@ GLSL的类型转换与C不同。在GLSL中类型不可以自动提升,比如fl -[上一篇: 6.OpenGL ES绘制矩形及圆形](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md) -[下一篇: 8.GLES类及Matrix类](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md) +[上一篇: 6.OpenGL ES绘制矩形及圆形](./VideoDevelopment/OpenGL/6.OpenGL%20ES%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2%E5%8F%8A%E5%9C%86%E5%BD%A2.md) +[下一篇: 8.GLES类及Matrix类](./VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md) --- diff --git "a/VideoDevelopment/OpenGL/8.GLES\347\261\273\345\217\212Matrix\347\261\273.md" "b/VideoDevelopment/OpenGL/8.GLES\347\261\273\345\217\212Matrix\347\261\273.md" index 2eb24927..db76edd9 100644 --- "a/VideoDevelopment/OpenGL/8.GLES\347\261\273\345\217\212Matrix\347\261\273.md" +++ "b/VideoDevelopment/OpenGL/8.GLES\347\261\273\345\217\212Matrix\347\261\273.md" @@ -211,8 +211,8 @@ Matrix就是专门设计出来帮助我们简化矩阵和向量运算操作的 -[上一篇: 7.OpenGL ES着色器语言GLSL](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md) -[下一篇: 9.OpenGL ES纹理](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md) +[上一篇: 7.OpenGL ES着色器语言GLSL](./VideoDevelopment/OpenGL/7.OpenGL%20ES%E7%9D%80%E8%89%B2%E5%99%A8%E8%AF%AD%E8%A8%80GLSL.md) +[下一篇: 9.OpenGL ES纹理](./VideoDevelopment/OpenGL/9.OpenGL%20ES%E7%BA%B9%E7%90%86.md) --- diff --git "a/VideoDevelopment/OpenGL/9.OpenGL ES\347\272\271\347\220\206.md" "b/VideoDevelopment/OpenGL/9.OpenGL ES\347\272\271\347\220\206.md" index 962345b9..44bc046d 100644 --- "a/VideoDevelopment/OpenGL/9.OpenGL ES\347\272\271\347\220\206.md" +++ "b/VideoDevelopment/OpenGL/9.OpenGL ES\347\272\271\347\220\206.md" @@ -479,8 +479,8 @@ public class TextureUtil { -[上一篇: 8.GLES类及Matrix类](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md) -[下一篇: 10.GLSurfaceView+MediaPlayer播放视频](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md) +[上一篇: 8.GLES类及Matrix类](./VideoDevelopment/OpenGL/8.GLES%E7%B1%BB%E5%8F%8AMatrix%E7%B1%BB.md) +[下一篇: 10.GLSurfaceView+MediaPlayer播放视频](./VideoDevelopment/OpenGL/10.GLSurfaceView%2BMediaPlayer%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91.md) --- diff --git "a/VideoDevelopment/\346\222\255\346\224\276\345\231\250\346\200\247\350\203\275\344\274\230\345\214\226.md" "b/VideoDevelopment/\346\222\255\346\224\276\345\231\250\346\200\247\350\203\275\344\274\230\345\214\226.md" index b64ab96e..b3f19bb4 100644 --- "a/VideoDevelopment/\346\222\255\346\224\276\345\231\250\346\200\247\350\203\275\344\274\230\345\214\226.md" +++ "b/VideoDevelopment/\346\222\255\346\224\276\345\231\250\346\200\247\350\203\275\344\274\230\345\214\226.md" @@ -38,7 +38,7 @@ #### PCDN -有关CDN相关可参考[CDN及PCDN](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/CDN%E5%8F%8APCDN.md) +有关CDN相关可参考[CDN及PCDN](./VideoDevelopment/CDN%E5%8F%8APCDN.md) ### 秒开 @@ -96,7 +96,7 @@ #### Http DNS -有关DNS相关可参考[DNS及HTTPDNS](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/DNS%E5%8F%8AHTTPDNS.md) +有关DNS相关可参考[DNS及HTTPDNS](./VideoDevelopment/DNS%E5%8F%8AHTTPDNS.md) IP竞速 DNS解析加快,通常,DNS解析,意味着要把一个域名为xxx.com解析成ip过程,平时请求网页,网络差,就会打开网页半天。 diff --git "a/VideoDevelopment/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" "b/VideoDevelopment/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" index fd8ed21d..aa1043ad 100644 --- "a/VideoDevelopment/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" +++ "b/VideoDevelopment/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256/\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" @@ -327,7 +327,7 @@ HLS的整体流程为: HLS的最大缺点就是延迟高,但Apple在WWDC2019发布了新的解决方案,可以将延迟从8秒降低到1至2秒。 -[HLS的详细介绍](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HLS.md) +[HLS的详细介绍](./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/HLS.md) HDS --- @@ -374,7 +374,7 @@ DASH的整个流程: -[DASH详细介绍](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/DASH.md) +[DASH详细介绍](./VideoDevelopment/%E6%B5%81%E5%AA%92%E4%BD%93%E5%8D%8F%E8%AE%AE/DASH.md)