├── cocos
└── 基础.MD
├── kotlin
└── 基础.MD
├── 其他
├── 面向对象编程.md
└── overview.md
├── 进阶题
├── svga原理.md
├── 马甲包经验.MD
├── APP启动过程.md
├── EventBus原理.md
├── Fresco原理.md
├── OKhttp原理.md
├── 优先级任务队列如何设计.md
├── 组件化和插件化.MD
├── android视图显示过程.md
├── 线程进程APP之间的关系.md
├── RN性能优化.md
├── ANR解决.md
├── 跨进程通讯.md
├── 图片优化.md
├── 卡顿优化.md
├── RXJava.md
├── 两个viewpager嵌套实现左滑右滑子父view联动,解决滑动冲突.md
├── MVC,MVP,MVVM比较.md
├── 内存泄漏.md
└── overview.md
├── flutter
├── 基础.MD
├── Dart.MD
└── Flutter的渲染原理.MD
├── 海外项目经验
├── 上架流程.MD
└── GooglePay相关.MD
├── 算法
├── 两个栈实现一个队列.md
├── 加密算法.md
├── 非递归方式生成切比雪夫数列.md
├── 多线程计算1到100的求和.md
├── 常见题型和常见思路.MD
├── overview.md
└── 在算法中常用的Java语法小技巧.MD
├── git.md
├── android基础
├── ServiceDemo
│ ├── Readme.md
│ ├── app
│ │ ├── .gitignore
│ │ ├── src
│ │ │ ├── main
│ │ │ │ ├── res
│ │ │ │ │ ├── values
│ │ │ │ │ │ ├── dimens.xml
│ │ │ │ │ │ ├── strings.xml
│ │ │ │ │ │ ├── colors.xml
│ │ │ │ │ │ └── styles.xml
│ │ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ │ └── ic_launcher_round.png
│ │ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ │ ├── menu
│ │ │ │ │ │ └── menu_main.xml
│ │ │ │ │ ├── layout
│ │ │ │ │ │ ├── activity_b.xml
│ │ │ │ │ │ ├── content_main.xml
│ │ │ │ │ │ └── activity_main.xml
│ │ │ │ │ ├── drawable-v24
│ │ │ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ │ └── drawable
│ │ │ │ │ │ └── ic_launcher_background.xml
│ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── banana
│ │ │ │ │ │ └── servicedemo
│ │ │ │ │ │ ├── MainApp.java
│ │ │ │ │ │ ├── TestSyncUtil.java
│ │ │ │ │ │ ├── DemoService.java
│ │ │ │ │ │ ├── BActivity.java
│ │ │ │ │ │ ├── UmengCrashHandler.java
│ │ │ │ │ │ └── MainActivity.java
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── test
│ │ │ │ └── java
│ │ │ │ │ └── com
│ │ │ │ │ └── banana
│ │ │ │ │ └── servicedemo
│ │ │ │ │ └── ExampleUnitTest.java
│ │ │ └── androidTest
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── banana
│ │ │ │ └── servicedemo
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ ├── proguard-rules.pro
│ │ ├── build.gradle
│ │ └── app.iml
│ ├── .gradle
│ │ ├── 4.10.1
│ │ │ ├── gc.properties
│ │ │ ├── fileChanges
│ │ │ │ └── last-build.bin
│ │ │ ├── fileHashes
│ │ │ │ ├── fileHashes.bin
│ │ │ │ ├── fileHashes.lock
│ │ │ │ └── resourceHashesCache.bin
│ │ │ ├── javaCompile
│ │ │ │ ├── taskHistory.bin
│ │ │ │ ├── classAnalysis.bin
│ │ │ │ └── javaCompile.lock
│ │ │ ├── taskHistory
│ │ │ │ ├── taskHistory.bin
│ │ │ │ └── taskHistory.lock
│ │ │ └── fileContent
│ │ │ │ └── fileContent.lock
│ │ ├── vcs-1
│ │ │ └── gc.properties
│ │ └── buildOutputCleanup
│ │ │ ├── cache.properties
│ │ │ ├── outputFiles.bin
│ │ │ └── buildOutputCleanup.lock
│ ├── settings.gradle
│ ├── .idea
│ │ ├── caches
│ │ │ ├── gradle_models.ser
│ │ │ └── build_file_checksums.ser
│ │ ├── encodings.xml
│ │ ├── vcs.xml
│ │ ├── modules.xml
│ │ ├── libraries
│ │ │ ├── Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml
│ │ │ ├── Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3_jar.xml
│ │ │ ├── Gradle__com_google_android_play_core_1_6_0_aar.xml
│ │ │ ├── Gradle__junit_junit_4_12_jar.xml
│ │ │ ├── Gradle__net_sf_kxml_kxml2_2_3_0_jar.xml
│ │ │ ├── Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml
│ │ │ ├── Gradle__javax_inject_javax_inject_1_jar.xml
│ │ │ ├── Gradle__com_squareup_javawriter_2_1_1_jar.xml
│ │ │ ├── Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml
│ │ │ ├── Gradle__org_jetbrains_annotations_16_0_1_jar.xml
│ │ │ ├── Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml
│ │ │ ├── Gradle__androidx_arch_core_core_common_2_0_0_jar.xml
│ │ │ ├── Gradle__com_google_guava_listenablefuture_1_0_jar.xml
│ │ │ ├── Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml
│ │ │ ├── Gradle__androidx_annotation_annotation_1_1_0_alpha02_jar.xml
│ │ │ ├── Gradle__androidx_collection_collection_1_1_0_alpha03_jar.xml
│ │ │ ├── Gradle__androidx_test_runner_1_1_1_aar.xml
│ │ │ ├── Gradle__androidx_lifecycle_lifecycle_common_2_1_0_alpha03_jar.xml
│ │ │ ├── Gradle__androidx_loader_loader_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_test_monitor_1_1_1_aar.xml
│ │ │ ├── Gradle__androidx_cardview_cardview_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_concurrent_concurrent_futures_1_0_0_alpha02_jar.xml
│ │ │ ├── Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_customview_customview_1_0_0_aar.xml
│ │ │ ├── Gradle__com_jakewharton_timber_timber_4_7_1_aar.xml
│ │ │ ├── Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml
│ │ │ ├── Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_test_espresso_espresso_core_3_1_1_aar.xml
│ │ │ ├── Gradle__androidx_activity_activity_1_0_0_alpha05_aar.xml
│ │ │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml
│ │ │ ├── Gradle__androidx_savedstate_savedstate_1_0_0_alpha02_aar.xml
│ │ │ ├── Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml
│ │ │ ├── Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_vectordrawable_vectordrawable_1_1_0_alpha01_aar.xml
│ │ │ ├── Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_alpha03_aar.xml
│ │ │ ├── Gradle__androidx_test_espresso_espresso_idling_resource_3_1_1_aar.xml
│ │ │ ├── Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_appcompat_appcompat_resources_1_1_0_alpha03_aar.xml
│ │ │ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_alpha03_aar.xml
│ │ │ ├── Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_alpha02_aar.xml
│ │ │ ├── Gradle__androidx_print_print_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_core_core_1_1_0_alpha05_aar.xml
│ │ │ ├── Gradle__androidx_transition_transition_1_0_1_aar.xml
│ │ │ ├── Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml
│ │ │ ├── Gradle__androidx_fragment_fragment_1_1_0_alpha05_aar.xml
│ │ │ ├── Gradle__androidx_appcompat_appcompat_1_1_0_alpha03_aar.xml
│ │ │ ├── Gradle__androidx_viewpager2_viewpager2_1_0_0_alpha02_aar.xml
│ │ │ ├── Gradle__com_google_android_material_material_1_1_0_alpha06_aar.xml
│ │ │ ├── Gradle__androidx_recyclerview_recyclerview_1_1_0_alpha03_aar.xml
│ │ │ ├── Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml
│ │ │ └── Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_alpha01_aar.xml
│ │ ├── runConfigurations.xml
│ │ ├── gradle.xml
│ │ ├── inspectionProfiles
│ │ │ └── Project_Default.xml
│ │ ├── misc.xml
│ │ ├── codeStyles
│ │ │ └── Project.xml
│ │ └── dbnavigator.xml
│ ├── gradle
│ │ └── wrapper
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ ├── local.properties
│ ├── build.gradle
│ ├── gradle.properties
│ ├── ServiceDemo.iml
│ ├── gradlew.bat
│ └── gradlew
├── ActivtyStack.md
├── 保活.md
├── Fragment.md
├── 四大组件.md
├── ActivityManagerService.md
├── 布局.md
├── launcher启动app过程.md
├── 数据库.md
├── Context.md
├── 动画.md
├── BroadcastReceiver.md
├── 其他.md
├── Window.md
├── ContentProvider.md
├── View.md
├── SharedPreferences.md
├── bitmap.md
├── Activity.md
├── Service.md
├── touch事件分发.md
├── handler机制.md
├── 线程优先级进程优先级.md
└── overview.md
├── java基础
├── 接口.md
├── socket.md
├── 设计模式.md
├── 关键字相关问题.md
├── String.md
├── 类加载机制.md
├── JVM.md
├── ThreadLocal.md
├── 四种引用类型.md
├── 线程安全.md
├── 集合.md
├── overview.md
└── 线程池.md
├── 程序题.md
├── images
├── 生命周期.jpg
└── context使用范围.png
├── 拓展-好文章清单.md
├── 项目
└── overview.md
└── README.md
/cocos/基础.MD:
--------------------------------------------------------------------------------
1 | ##
2 |
--------------------------------------------------------------------------------
/kotlin/基础.MD:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/其他/面向对象编程.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/svga原理.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/马甲包经验.MD:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/flutter/基础.MD:
--------------------------------------------------------------------------------
1 | ##
2 |
--------------------------------------------------------------------------------
/其他/overview.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/海外项目经验/上架流程.MD:
--------------------------------------------------------------------------------
1 | ##
2 |
--------------------------------------------------------------------------------
/算法/两个栈实现一个队列.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/APP启动过程.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/EventBus原理.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/Fresco原理.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/OKhttp原理.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/优先级任务队列如何设计.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/组件化和插件化.MD:
--------------------------------------------------------------------------------
1 | ##
2 |
--------------------------------------------------------------------------------
/git.md:
--------------------------------------------------------------------------------
1 | ## git rebase 作用?
2 |
--------------------------------------------------------------------------------
/海外项目经验/GooglePay相关.MD:
--------------------------------------------------------------------------------
1 | ##
2 |
--------------------------------------------------------------------------------
/算法/加密算法.md:
--------------------------------------------------------------------------------
1 | ## MD5算法特性
2 |
--------------------------------------------------------------------------------
/算法/非递归方式生成切比雪夫数列.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/android视图显示过程.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/线程进程APP之间的关系.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/进阶题/RN性能优化.md:
--------------------------------------------------------------------------------
1 | ## 如何做RN性能优化
2 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/Readme.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/java基础/接口.md:
--------------------------------------------------------------------------------
1 | ## 接口和抽象类区别?
2 | ####
3 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/gc.properties:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/vcs-1/gc.properties:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/程序题.md:
--------------------------------------------------------------------------------
1 | ## 单例的各种写法?
2 |
3 | ##recyclerview的写法?
4 |
--------------------------------------------------------------------------------
/进阶题/ANR解决.md:
--------------------------------------------------------------------------------
1 | ## 导致ANR的原因
2 |
3 | ## ANR解决的方法
4 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/算法/多线程计算1到100的求和.md:
--------------------------------------------------------------------------------
1 | # 多线程计算1到100的求和,并有单独线程完成输出如何做到?
2 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/fileChanges/last-build.bin:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/android基础/ActivtyStack.md:
--------------------------------------------------------------------------------
1 |
2 | ## Activty栈由谁管理?
3 | #### 参考答案:AMS管理
4 |
--------------------------------------------------------------------------------
/java基础/socket.md:
--------------------------------------------------------------------------------
1 | ## 简述socket
2 | #### 网络传输层实现,一般会实现tcp或者udp协议,进行跨进程跨平台通信
3 |
--------------------------------------------------------------------------------
/android基础/保活.md:
--------------------------------------------------------------------------------
1 | 保活方案?
2 | 参考文档:https://juejin.im/post/5baedde6f265da0a8d369eb2
3 |
--------------------------------------------------------------------------------
/java基础/设计模式.md:
--------------------------------------------------------------------------------
1 | 1.代理模式
2 | https://www.runoob.com/design-pattern/proxy-pattern.html
3 |
--------------------------------------------------------------------------------
/android基础/Fragment.md:
--------------------------------------------------------------------------------
1 | ## Fragment的全部生命周期
2 | https://juejin.im/post/6844903752114126855
3 |
--------------------------------------------------------------------------------
/java基础/关键字相关问题.md:
--------------------------------------------------------------------------------
1 | ## final关键字用法?
2 | #### https://www.cnblogs.com/dolphin0520/p/3736238.html
3 |
--------------------------------------------------------------------------------
/images/生命周期.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/images/生命周期.jpg
--------------------------------------------------------------------------------
/java基础/String.md:
--------------------------------------------------------------------------------
1 | ## StringBuffer与StringBuilder区别?
2 | #### StringBuilder线程不安全
3 | #### StringBuffer线程安全
4 |
--------------------------------------------------------------------------------
/java基础/类加载机制.md:
--------------------------------------------------------------------------------
1 | ## java类加载机制是怎么样的?
2 | #### 加载-验证-准备-解析-初始化
3 | ## 类如何不被继承?
4 | #### 加final或基类构造函数声明为private
5 |
--------------------------------------------------------------------------------
/images/context使用范围.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/images/context使用范围.png
--------------------------------------------------------------------------------
/android基础/四大组件.md:
--------------------------------------------------------------------------------
1 | ## 四大组件是什么?
2 | #### Activity,Service,ContentProvider,BroadcastReceiver
3 | ## 四大组件分别是做什么的?
4 | ####
5 |
--------------------------------------------------------------------------------
/android基础/ActivityManagerService.md:
--------------------------------------------------------------------------------
1 | 参考文章
2 |
3 | https://wiki.jikexueyuan.com/project/deep-android-v2/activity.html
4 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/buildOutputCleanup/cache.properties:
--------------------------------------------------------------------------------
1 | #Sun May 26 16:02:43 CST 2019
2 | gradle.version=4.10.1
3 |
--------------------------------------------------------------------------------
/android基础/布局.md:
--------------------------------------------------------------------------------
1 | ## 问题1:android布局有哪些?
2 | #### LinearLayout,RelativeLayout,FrameLayout,TableLayout,GridLayout,AbsoluteLayout,ConstraintLayout
3 |
--------------------------------------------------------------------------------
/android基础/launcher启动app过程.md:
--------------------------------------------------------------------------------
1 | 参考文章:https://blog.csdn.net/qq_17250009/article/details/52204918
2 |
3 | 总体过程比较复杂,这里就放些参考文章,具体过程面试怎么达,还请小伙伴们自己总结自己提炼语言哈~
4 |
5 |
--------------------------------------------------------------------------------
/java基础/JVM.md:
--------------------------------------------------------------------------------
1 | ## JVM内存区域划分?
2 | #### 线程共享:堆、方法区,线程独享:虚拟机方法栈、本地方法栈、程序计数器
3 | #### 参考文档 https://www.cnblogs.com/ityouknow/p/5610232.html
4 |
5 | ## JVM上面和下面都有线程的说法对不对?
6 |
--------------------------------------------------------------------------------
/算法/常见题型和常见思路.MD:
--------------------------------------------------------------------------------
1 | 链表题-》经常使用快慢指针
2 | 堆类型题-》使用priorityQueen比较多
3 | O(1)时间要求,要考虑使用HashMap
4 | Tree题要掌握好,前中后三序遍历方法
5 | 递归的本质是使用系统栈,符合先入后出规则的算法题,基本都可以考虑递归
6 | 矩阵题,使用深度和广度优先算法
7 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/caches/gradle_models.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.idea/caches/gradle_models.ser
--------------------------------------------------------------------------------
/拓展-好文章清单.md:
--------------------------------------------------------------------------------
1 | 1.直播原理
2 | > https://github.com/f2e-journey/xueqianban/issues/61
3 |
4 | 2.长连接
5 | > https://www.zhihu.com/question/22677800
6 |
7 | > 长连接实现方案库:netty库(socket库)
8 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/caches/build_file_checksums.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.idea/caches/build_file_checksums.ser
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 | 50dp
4 |
5 |
--------------------------------------------------------------------------------
/android基础/数据库.md:
--------------------------------------------------------------------------------
1 |
2 | ## 问题1:android数据库支持多线程访问么?
3 | #### 参考答案:不支持,要使用SQLHelper管理,多线程只用一个SQLHelper对象
4 | ## 问题2:database is locked如何发生的?
5 | #### 参考答案:多线程同时读写,或者多线程多个SQLHelper对象同时写
6 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/fileHashes.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/fileHashes.bin
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/fileHashes.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/fileHashes.lock
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/taskHistory.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/taskHistory.bin
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/taskHistory/taskHistory.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/taskHistory/taskHistory.bin
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/buildOutputCleanup/outputFiles.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/buildOutputCleanup/outputFiles.bin
--------------------------------------------------------------------------------
/进阶题/跨进程通讯.md:
--------------------------------------------------------------------------------
1 | ## 跨进程通讯手段有哪些?
2 | #### AIDL、MESSAGER、Intent、Binder、共享内存、
3 | ## binder原理?
4 |
5 | ## binder通讯涉及多少块内存,几次内存拷贝?
6 |
7 | ## AIDL的实现方法?(具体过程,方法名,参数)
8 |
9 | ## 如何决定AIDL的方向?
10 |
--------------------------------------------------------------------------------
/android基础/Context.md:
--------------------------------------------------------------------------------
1 | ## 四大组件context哪些可以弹dialog?
2 |
3 | 
4 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/fileContent/fileContent.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/fileContent/fileContent.lock
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/classAnalysis.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/classAnalysis.bin
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/javaCompile.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/javaCompile/javaCompile.lock
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/taskHistory/taskHistory.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/taskHistory/taskHistory.lock
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ServiceDemo
3 | Settings
4 |
5 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/resourceHashesCache.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/4.10.1/fileHashes/resourceHashesCache.bin
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.gradle/buildOutputCleanup/buildOutputCleanup.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/.gradle/buildOutputCleanup/buildOutputCleanup.lock
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/进阶题/图片优化.md:
--------------------------------------------------------------------------------
1 | ## 常用图片区别
2 | png:可无损压缩,有A通道
3 | jpeg:无A通道,有损压缩
4 | webp:体积更小,可动画,有A通道
5 |
6 | 参考文章:
7 | > https://www.zhihu.com/question/27201061
8 |
9 | > https://juejin.im/post/5b32ea55e51d4558bf7c45e0
10 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knowledgeIsMoney/android-interveiw/HEAD/android基础/ServiceDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android基础/动画.md:
--------------------------------------------------------------------------------
1 | ## 动画种类?
2 | #### 帧动画,补间动画,属性动画
3 | ## 三种动画差别?
4 | #### 参考文章:https://blog.csdn.net/kifile/article/details/40584903,
5 | #### 参考答案:待补充
6 | ## 动画原理?
7 | ####
8 | ## 补间动画种类?
9 | #### 伸缩、位移、透明度、反转
10 |
--------------------------------------------------------------------------------
/java基础/ThreadLocal.md:
--------------------------------------------------------------------------------
1 |
2 | #### 参考文章
3 | ##### https://juejin.im/post/5ac2eb52518825555e5e06ee
4 | ##### http://www.jasongj.com/java/threadlocal/
5 | #### 参考答案
6 | ##### threadlocal是为thread提供子线程自有的对象的拷贝的方法,由map实现,每个线程的对象的值都可以不一样
7 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/flutter/Dart.MD:
--------------------------------------------------------------------------------
1 | 1. dart 所有变量都是对象
2 | 2.dart 可变变量类型dynamic 和 Object
3 | 3.dart final 运行时常量,const编译时常量
4 | 4.dart 级连运算符 .. new Person()..setName("Bob")..setAge(20)..save();
5 | 5.dart _代表私有,构造函数不能重载
6 | 6.dart with 方法相当于接口实现,但可以接类定义
7 | 7.
8 |
--------------------------------------------------------------------------------
/算法/overview.md:
--------------------------------------------------------------------------------
1 | 1.[多线程计算1到100的求和,并有单独线程完成输出如何做到?](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E7%AE%97%E6%B3%95/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%971%E5%88%B0100%E7%9A%84%E6%B1%82%E5%92%8C.md)
2 | 2.[切比雪夫序列第N项值]
3 | 3.[单链表如何判断是否有环]
4 |
--------------------------------------------------------------------------------
/android基础/BroadcastReceiver.md:
--------------------------------------------------------------------------------
1 |
2 | ## 注册广播有哪几种方式?
3 | #### 动态注册 不是常驻,应用关闭后不能监测
4 | #### 静态注册 常驻,应用不开也能接收广播
5 |
6 | ## 优先级谁高?
7 | ####
8 | #### 可以设置优先级
9 |
10 | ## 多次注册有啥问题?
11 | #### 一个消息处理多次
12 |
13 | ## 广播阻塞有啥问题?
14 |
--------------------------------------------------------------------------------
/进阶题/卡顿优化.md:
--------------------------------------------------------------------------------
1 | 卡顿原理:
2 | https://blog.csdn.net/LF_HYCZ/article/details/76034457
3 | https://blog.csdn.net/lmj623565791/article/details/58626355
4 | https://blog.csdn.net/lmj623565791/article/details/45556391/
5 | https://blog.csdn.net/u011240877/article/details/54347396
6 |
--------------------------------------------------------------------------------
/android基础/其他.md:
--------------------------------------------------------------------------------
1 | ## onCreate里用View post一个runnable,回调了是否可以get宽高
2 | #### 可以
3 | ## android 异步处理方式?
4 | #### https://www.jianshu.com/p/00b130319864
5 | ## 每个进程的主线程是一个线程么?
6 | #### 不是,每个进程一个主线程
7 |
8 | ## 两个等号和equels区别?
9 | #### https://www.jianshu.com/p/9cbed9f33a4d
10 |
--------------------------------------------------------------------------------
/android基础/Window.md:
--------------------------------------------------------------------------------
1 | ## Activity、Window、View三者之间的关系?
2 | #### Activity包含Window包含View相互管理
3 | #### 参考:https://blog.csdn.net/freekiteyu/article/details/79408969
4 | ## ViewRootImpl作用?
5 | #### https://dandanlove.com/2017/12/11/viewrootimpl-activity/
6 | #### 是View的根节点,管理View树的绘制流程
7 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #008577
4 | #00574B
5 | #D81B60
6 |
7 |
--------------------------------------------------------------------------------
/进阶题/RXJava.md:
--------------------------------------------------------------------------------
1 | ## 对RXJava的理解?
2 |
3 | #### 参考文章
4 | >https://blog.csdn.net/TellH/article/details/71534704
5 |
6 | >https://www.jianshu.com/p/88aacbed8aa5
7 |
8 | >https://www.jianshu.com/p/182278585aa5
9 |
10 | ## Rxjava中Observer和Subscriber的小区别
11 | #### Subscriber观察一次,Observer一直观察
12 |
--------------------------------------------------------------------------------
/进阶题/两个viewpager嵌套实现左滑右滑子父view联动,解决滑动冲突.md:
--------------------------------------------------------------------------------
1 | ## 问题3:两个viewpager嵌套实现左滑右滑子父view联动,解决滑动冲突?
2 | #### 内层viewpager重写dispatchTouchEvent方法,监听到touch事件时getParent().requestDisallowInterceptTouchEvent(true);getParent().requestDisallowInterceptTouchEvent(false);阻止父viewpager拦截事件,不过最新版本貌似直接嵌套两个viewpager就可以了不需要解决冲突
3 |
--------------------------------------------------------------------------------
/android基础/ContentProvider.md:
--------------------------------------------------------------------------------
1 | ## provider主要用途
2 | #### 数据共享
3 |
4 | ## provider的call方法干什么用的?
5 | #### call(@NonNull Uri uri, @NonNull String method, @Nullable String arg, @Nullable Bundle extras),调用provider方法获取数据用的
6 |
7 | ## ContentProvider对象实例化什么时候开始的?
8 | #### 应用启动时由AMS初始化的
9 |
10 | ##
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun May 26 11:01:49 CST 2019
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
7 |
--------------------------------------------------------------------------------
/项目/overview.md:
--------------------------------------------------------------------------------
1 | ## 如何展现自己工作中的亮点?
2 | #### 平时积累上,要主要把自己解决的难题记录下来,把相关的知识点学透吃透,这样讲出来可能就比较牛逼了,如果实在没有牛逼的亮点。也可以找找你做的项目中别人写的或解决的问题你觉得很牛逼的,把他的源码好好研究几遍,确保学透吃透,就好像是自己做过一遍一样,这样面试时拿出来讲也是很牛逼的,就跟自己做的一样,但是要切记一定要研究明白,否则被问住了就适得其反了。当然最重要的还是自己平时的积累,内功深了自然无招胜有招!
3 | #### 另外讲述的时候也要讲究技巧,就算不难的东西也能说的很难,请大家可以参考下: https://m.igetget.com/share/course/article/article_id/86140
4 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android基础/View.md:
--------------------------------------------------------------------------------
1 | ## 何时可以获取宽高?
2 | #### 参考文章:https://blog.csdn.net/hardworkingant/article/details/77278811
3 | #### onCreate,onstart,onresume都不可以获得view的宽高,最简单的获取方法是调用view的post方法在runnable中获取。其他方法在参考文章中
4 | ## 渲染经历的哪几个方法?
5 | #### onMeasure测量宽高,onLayout在父布局的位置及margin等,onDraw画的步骤
6 | ## onDraw的调用时机
7 | ## https://juejin.im/post/6844903502276198407
8 | ## 看draw使用调用,draw调用取决于PFLAG_SKIP_DRAW标志位,PFLAG_DIRTY_OPAQUE决定是否调用onDraw
9 |
--------------------------------------------------------------------------------
/java基础/四种引用类型.md:
--------------------------------------------------------------------------------
1 | ## 问题1:四种引用类型都是什么?区别是什么?
2 | #### 参考文章:https://blog.csdn.net/u014532217/article/details/79184412
3 | #### 参考答案:
4 | 强引用-FinalReference~~~强引用是默认引用类型,强引用在程序内存不足(OOM)的时候也不会被回收
5 | 软引用-SoftReference~~~软引用在程序内存不足时,会被回收,内存充足则不回收,用于易造成oom又常用的对象,如图片的bitmap
6 | 弱引用-WeakReference~~~弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,用于易造成oom又不常用或已回收就不需要处理的对象,如handler持有的activity对象
7 | 虚引用-PhantomReference~~~虚引用就是只要JVM垃圾回收器发现了它,就会将之回收,要搭配引用队列使用,回收时会标记引用队列,用于检查对象是否被回收
8 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/local.properties:
--------------------------------------------------------------------------------
1 | ## This file must *NOT* be checked into Version Control Systems,
2 | # as it contains information specific to your local configuration.
3 | #
4 | # Location of the SDK. This is only used by Gradle.
5 | # For customization when using a Version Control System, please read the
6 | # header note.
7 | #Sun May 26 11:01:50 CST 2019
8 | ndk.dir=/Users/bobsha/Downloads/android-sdk-macosx/ndk-bundle
9 | sdk.dir=/Users/bobsha/Downloads/android-sdk-macosx
10 |
--------------------------------------------------------------------------------
/java基础/线程安全.md:
--------------------------------------------------------------------------------
1 | ## 什么是线程安全?
2 | #### 线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题
3 | ## 同步锁是满足哪些条件才达到线程安全的?
4 | #### 1.原子性:操作是不可分,必须连续完成
5 | #### 2.可见性:可见性是指一个线程对共享变量的修改,对于另一个线程来说是否是可以看到的
6 | #### 3.有序性:有序性是指程序在执行的时候,程序的代码执行顺序和语句的顺序是一致的(Java编译器和处理器可能对指令重排序)
7 | ## volatile关键字作用?
8 | #### 保证可见性和有序性,直接读取内存数据,不使用工作内存,保证变量的操作是不会被重排序的
9 | #### https://www.cnblogs.com/dolphin0520/p/3920373.html
10 | ## 如何用四个线程实现1...N的自增,并通知另一线程打印结果
11 |
12 | ## 锁的参考文章:https://tech.meituan.com/2018/11/15/java-lock.html
13 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/MainApp.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.app.Application;
4 |
5 | import timber.log.Timber;
6 |
7 | /**
8 | * Created by bobsha on 2019/6/1.
9 | */
10 | public class MainApp extends Application {
11 | @Override
12 | public void onCreate() {
13 | super.onCreate();
14 | UmengCrashHandler.getInstance().init(this);
15 | Timber.plant(new Timber.DebugTree());
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/layout/activity_b.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/test/java/com/banana/servicedemo/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/进阶题/MVC,MVP,MVVM比较.md:
--------------------------------------------------------------------------------
1 | #### 参考文章
2 | https://juejin.im/post/5b3a3a44f265da630e27a7e6
3 |
4 | ## 三者的区别?
5 | MVC的V与M是可以相互通信的,
6 | MVP的V和M完全隔离,只通过P来链接,
7 | MVVM通过DataBinding实现双向绑定
8 | ## 三者的优缺点?
9 | MVC的VC都在activity管理之下,不容易完全解耦
10 | MVP的V和M完全解耦,如果业务逻辑复杂会创造大量view接口,适合工具类或者需要写很多业务逻辑的app
11 | MVVM不会产生大量View接口,代码简洁,但是出问题不容易定位是View层问题还是Model层问题,适合偏向展示型的app,绝大多数业务逻辑都在后端,app主要功能就是展示数据,交互等
12 |
13 | ## databinding实现原理?
14 | #### 参考文章:https://cloud.tencent.com/developer/article/1036190
15 | #### 参考答案:通过自动生成binding文件实现
16 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_google_android_play_core_1_6_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__junit_junit_4_12_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/SharedPreferences.md:
--------------------------------------------------------------------------------
1 | ## 问题1:SharedPreferences底层实现是什么?
2 | #### 参考答案:使用xml文件存储键值对
3 | ## 问题2:SharedPreferences的commit和apply的区别?
4 | #### 参考答案:commit是同步操作,apply是异步操作
5 | ## 问题3:SharedPreferences是线程安全的么?是进程安全的么?
6 | #### 参考答案:SharedPreferences 是线程安全的. 内部由大量 synchronized 关键字保障,SharedPreferences 不是进程安全的
7 | ## 问题4:SharedPreferences如何实现进程安全?
8 | #### 参考文章: https://juejin.im/entry/590833711b69e60058eb34b9
9 | #### 参考答案:使用ContentProvider封装,
10 | ## apply如何保证数据安全?
11 | #### 分使用场景、使用子线程commit、高频不要使用SP
12 |
13 | 参考文章:https://blog.csdn.net/qq_16188829/article/details/78597427
14 | apply可能会导致主线程anr,使用要谨慎,最好是使用子线程commit
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__org_jetbrains_annotations_16_0_1_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/bitmap.md:
--------------------------------------------------------------------------------
1 | ## 如何计算bitmap大小?
2 | ALPHA_8:只有alpha值,没有RGB值,占一个字节。计算:size=w*h
3 | ARGB_4444:一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites,共16bites,这种格式的图片,看起来质量太差,已经不推荐使用。计算:size=wh2
4 | ARGB_8888:一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites,共32bites,即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。android2.3开始的默认格式。计算:size=wh4
5 | RGB_565:一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节。对于没有透明和半透明颜色的图片并且不需要颜色鲜艳的来说,该格式的图片能够达到比较的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销,因此它是一个不错的选择。计算:size=wh2
6 |
7 | 作者:sligner
8 | 链接:https://www.jianshu.com/p/67cfd38c52dc
9 | 来源:简书
10 | 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
11 | ## bitmap如何优化?
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_arch_core_core_common_2_0_0_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_google_guava_listenablefuture_1_0_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | google()
6 | jcenter()
7 |
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.3.2'
11 |
12 | // NOTE: Do not place your application dependencies here; they belong
13 | // in the individual module build.gradle files
14 | }
15 | }
16 |
17 | allprojects {
18 | repositories {
19 | google()
20 | jcenter()
21 |
22 | }
23 | }
24 |
25 | task clean(type: Delete) {
26 | delete rootProject.buildDir
27 | }
28 |
--------------------------------------------------------------------------------
/java基础/集合.md:
--------------------------------------------------------------------------------
1 | ## ArrayList和LinkList区别?
2 | #### https://blog.csdn.net/eson_15/article/details/51145788
3 | 1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
4 |
5 | 2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;
6 |
7 | 3. 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但是实际情况并非这样,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢,下面会详细分析。
8 |
9 | ## Hashmap工作原理
10 | #### https://blog.csdn.net/login_sonata/article/details/76598675
11 | #### https://cllc.fun/2020/03/24/java-hash-map/
12 | ## Hashmap如何处理hash冲突
13 | #### 链表红黑二叉树
14 | ## Hashmap问题
15 |
16 | ## Hashmap红黑树时间复杂度
17 | logn
18 | ## Hashmap为什么要做二次hash?
19 |
20 | ## 为什么要链表和红黑树共存?
21 | #### 链表插入效率高,红黑树空间占用大
22 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0_alpha02_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_collection_collection_1_1_0_alpha03_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_test_runner_1_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0_alpha03_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_test_monitor_1_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_concurrent_concurrent_futures_1_0_0_alpha02_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/进阶题/内存泄漏.md:
--------------------------------------------------------------------------------
1 | ## 问题1:如何检测内存泄漏
2 | ###### 这块内容需要项目的积累,如果有好的办法希望可以拿出来分享哈
3 | #### 参考文章:https://segmentfault.com/a/1190000006884310
4 | #### LeakCanary工具可以检查出90%以上的内存泄漏
5 | ## 问题2:leakcanary原理?
6 | #### 参考文章:
7 | 1.https://juejin.im/entry/5928f6360ce463006b120c3c
8 | 2.https://juejin.im/post/5ab8d3d46fb9a028ca52f813
9 | 3.http://wingjay.com/2017/05/14/dig_into_leakcanary/
10 | 4.https://ivanljt.github.io/blog/2017/12/15/%E6%8B%86%E8%BD%AE%E5%AD%90%E7%B3%BB%E5%88%97%E2%80%94%E2%80%94LeakCanary%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/
11 | #### 参考答案:注册activty生命周期的监听,当activity执行ondestory的时候新建一个activity弱引用,并发起GC,如果GC后发现activity没有被回收,则证明内存泄漏了,打印堆栈信息找到泄漏的地方~另外leakcanary只针对activity,其他地方的内存泄漏还是要靠MAT(Memory Analysis Tool)分析。通过LeakCanary.install(app).watch(object)方法也可以分析其他对象。
12 | ## 如何检测底层库内存泄露?
13 |
--------------------------------------------------------------------------------
/android基础/Activity.md:
--------------------------------------------------------------------------------
1 | ## activity声明周期?
2 | 
3 | ## A启动B的生命周期过程?
4 | AActivity: onPause
5 | BActivity: onCreate
6 | BActivity: onStart
7 | BActivity: onResume
8 | AActivity: onStop
9 | ## B返回A的生命周期过程?
10 | BActivity: onPause
11 | AActivity: onRestart
12 | AActivity: onStart
13 | AActivity: onResume
14 | BActivity: onStop
15 | BActivity: onDestroy
16 |
17 | ## 启动模式有哪几种?
18 | standard、singleTop、singleTask、singleInstance
19 | https://blog.csdn.net/mynameishuangshuai/article/details/51491074
20 |
21 | ## AActivity是singleTop的再启动AActivity会怎么走声明周期?
22 | onPause
23 | onNewIntent
24 | onResume
25 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_jakewharton_timber_timber_4_7_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_alpha02_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # android高频面试题总结
2 | 水平有限难免有错误或不足之处,希望各路大佬都可以多多指正,提供意见哈
3 |
4 | 1.[android基础](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/overview.md)
5 |
6 | 2.[java基础](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/overview.md)
7 |
8 | 3.[进阶题](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/overview.md)
9 |
10 | 4.[算法](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E7%AE%97%E6%B3%95/overview.md)
11 |
12 | 5.[项目](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E9%A1%B9%E7%9B%AE/overview.md)
13 |
14 | 6.[其他](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E5%85%B6%E4%BB%96/overview.md)
15 |
16 |
17 |
18 |
19 |
20 | 更多问题欢迎关注博客主页:https://blog.csdn.net/cngsb
21 |
22 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_alpha01_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_alpha03_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_alpha03_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_alpha03_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_alpha02_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/androidTest/java/com/banana/servicedemo/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.banana.servicedemo", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java基础/overview.md:
--------------------------------------------------------------------------------
1 | 1.[线程安全](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8.md)
2 |
3 | 2.接口和父类有同名函数,子类继承父类且实现接口是否可行?可行,会调用统一函数。
4 |
5 | 3.[ThreadLocal](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/ThreadLocal.md)
6 |
7 | 4.[对象的四种引用类型](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/%E5%9B%9B%E7%A7%8D%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B.md)
8 |
9 | 5.[线程池](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/%E7%BA%BF%E7%A8%8B%E6%B1%A0.md)
10 |
11 | 6.[设计模式](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md)
12 |
13 | 7.[内存划分](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/%E5%86%85%E5%AD%98%E5%88%92%E5%88%86.md)
14 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | android.useAndroidX=true
15 | android.enableJetifier=true
16 | android.enableD8.desugaring=false
17 | android.enableD8=false
18 |
19 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/ServiceDemo.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/android基础/Service.md:
--------------------------------------------------------------------------------
1 | ## 生命周期
2 | 参考文章:https://blog.csdn.net/carson_ho/article/details/53160137
3 |
4 | startservice:onCreate,onStartCommand,onStart,onDestory
5 |
6 | bindservice:onCreate,onBind,onUnbind,onDestory
7 |
8 | 注意点:
9 |
10 | 1.onCreate若service已启动则不再调用
11 | 2.多次bindservice只会走一次onbind
12 | 3.所有bind全部unbind,bind、unbind的关键是以ServiceConnection对象为核心的,如果startservice要有stopservice,否则service不会走ondestory停止服务。
13 | 4.多次绑定可能会出问题,要特别小心
14 |
15 | 多次绑定问题参考文章:https://blog.csdn.net/u013553529/article/details/54754491
16 | ## service中该如何做耗时操作?
17 | #### 使用IntentService,在IntentService的onCreate中初始化了一个HandlerThread,在onHandleIntent方法中就是异步线程了
18 | ##### 其他异步方法
19 | ## startService与bindService区别?
20 | #### startService启动service,不能交互,Service自己运行
21 | #### bindService 可以绑定service建立连接,可以通过Ibinder与service通讯
22 | ## service如何保活
23 | #### 矩阵拉起
24 | #### 设置高优先级
25 | #### https://segmentfault.com/a/1190000018424447
26 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_core_core_1_1_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/java基础/线程池.md:
--------------------------------------------------------------------------------
1 | ## 问题1:线程池简介
2 | #### 参考文章:https://www.cnblogs.com/dolphin0520/p/3932921.html
3 | ## 问题2:线程池如何规划?
4 | #### 参考文章:http://youzhixueyuan.com/thread-pool-principle-configuration-four-implementations.html
5 | #### 参考答案:
6 | 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1
7 | 如果是IO密集型任务,参考值可以设置为2*NCPU
8 | (1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
9 | (2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
10 | (3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
11 | (4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
12 | ## 问题3:如何设置任务优先级?
13 | #### 参考文章:http://liuxiang.github.io/2017/06/26/%E4%BE%9D%E6%8D%AE%E4%BB%BB%E5%8A%A1%E4%BC%98%E5%85%88%E7%BA%A7,%E5%AE%9E%E7%8E%B0%E5%8F%AF%E6%8F%92%E9%98%9F%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0-%E7%AE%80%E8%A3%85/
14 | https://blog.csdn.net/bohu83/article/details/51249888
15 | #### 参考答案:使用PriorityBlockingQueue实现任务队列,并声明实现了Runnable和Comparable的类,从而实现优先级比较。
16 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_transition_transition_1_0_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
19 |
20 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/TestSyncUtil.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import timber.log.Timber;
4 |
5 | /**
6 | * Created by bobsha on 2019-06-26.
7 | */
8 | public class TestSyncUtil {
9 | private static TestSyncUtil inst;
10 |
11 | private TestSyncUtil() {
12 | }
13 |
14 | public static synchronized TestSyncUtil ins() {
15 | Timber.e("ins in");
16 | if (inst == null) {
17 | inst = new TestSyncUtil();
18 | }
19 | try {
20 | Thread.sleep(500);
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | Timber.e("ins out");
25 | return inst;
26 | }
27 |
28 | public synchronized void sleep() {
29 | Timber.e("sleep in");
30 | try {
31 | Thread.sleep(2000);
32 | } catch (InterruptedException e) {
33 | e.printStackTrace();
34 | }
35 | Timber.e("sleep out");
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_alpha03_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_alpha02_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_alpha06_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_alpha03_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/进阶题/overview.md:
--------------------------------------------------------------------------------
1 |
2 | 1.[内存泄漏](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F.md)
3 |
4 | 2.[两个viewpager嵌套实现左滑右滑子父view联动,解决滑动冲突?](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/%E4%B8%A4%E4%B8%AAviewpager%E5%B5%8C%E5%A5%97%E5%AE%9E%E7%8E%B0%E5%B7%A6%E6%BB%91%E5%8F%B3%E6%BB%91%E5%AD%90%E7%88%B6view%E8%81%94%E5%8A%A8%EF%BC%8C%E8%A7%A3%E5%86%B3%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81.md)
5 |
6 | 3.[MVC,MVP,MVVM比较](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/MVC%EF%BC%8CMVP%EF%BC%8CMVVM%E6%AF%94%E8%BE%83.md)
7 |
8 | 4.[卡顿优化](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/%E5%8D%A1%E9%A1%BF%E4%BC%98%E5%8C%96.md)
9 |
10 | 5.[图片优化](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96.md)
11 |
12 | 6.[RXJAVA概述与原理](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/进阶题/RXJava.md)
13 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_alpha01_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
15 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/android基础/touch事件分发.md:
--------------------------------------------------------------------------------
1 | ## 问题1:touch事件分发流程?
2 | #### 参考文章:
3 | https://juejin.im/post/58d8cba45c497d005702d46b
4 | https://blog.csdn.net/timshinlee/article/details/75093872
5 | #### 参考答案:activity通过phoneWindow分发touch事件,phoneWindow再交给DecorView,由DecorView开始向子view分发(dispatchTouchEvent),ViewGroup的dispatchTouchEvent方法中,首先判断临时变量intercepted,如果是ACTION_DOWN且mFirstTouchTarget!=null,由onInterceptTouchEvent方法判断是否拦截事件,不拦截则向下分发,拦截则交由本级onTouchEvent处理,子view由onTouchEvent处理,以上为Down事件机制,之后的事件会先判断mFirstTouchTarget是否为空mFirstTouchTarget不为空则直接由此向下分发,提高分发效率
6 | ## 问题2:什么条件会收到ACTION_CANCEL?
7 | #### 参考答案:子控件消费down事件后,如果父控件拦截了后续事件,则子控件将收到cancel事件,例如滑动到父view的外面去
8 | ## 问题3:两个viewpager嵌套实现左滑右滑子父view联动,解决滑动冲突?
9 | #### 参考答案:(https://github.com/knowledgeIsMoney/android-interveiw/blob/master/%E8%BF%9B%E9%98%B6%E9%A2%98/%E4%B8%A4%E4%B8%AAviewpager%E5%B5%8C%E5%A5%97%E5%AE%9E%E7%8E%B0%E5%B7%A6%E6%BB%91%E5%8F%B3%E6%BB%91%E5%AD%90%E7%88%B6view%E8%81%94%E5%8A%A8%EF%BC%8C%E8%A7%A3%E5%86%B3%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81.md)
10 |
11 | ## 滑动冲突解决的各种例子?
12 | #### https://juejin.im/post/6844903806308712456
13 | #### 外部拦截和内部拦截法,
14 | #### 外部拦截重写父布局onInterceptTouchEvent拦截move事件,
15 | #### 内部拦截重写父布局onInterceptTouchEvent-move事件默认拦截,再重写子布局dispatchTouchEvent,通过getParent().requestDisallowInterceptTouchEvent(true);和getParent().requestDisallowInterceptTouchEvent(false);控制是否让父布局处理。
16 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 28
5 | defaultConfig {
6 | applicationId "com.banana.servicedemo"
7 | minSdkVersion 16
8 | targetSdkVersion 28
9 | versionCode 1
10 | versionName "1.0"
11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
17 | }
18 | debug {
19 |
20 | }
21 | dexOptions {
22 | // release & debug is in project animators
23 | matchingFallbacks = ['release', 'debug']
24 | }
25 | }
26 | }
27 |
28 | dependencies {
29 | implementation fileTree(include: ['*.jar'], dir: 'libs')
30 | implementation 'androidx.appcompat:appcompat:1.0.2'
31 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
32 | implementation 'com.google.android.material:material:1.1.0-alpha06'
33 | implementation 'com.google.android.play:core:1.6.0'
34 | implementation 'com.jakewharton.timber:timber:4.7.1'
35 | testImplementation 'junit:junit:4.12'
36 | androidTestImplementation 'androidx.test:runner:1.1.1'
37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
38 | }
39 |
--------------------------------------------------------------------------------
/flutter/Flutter的渲染原理.MD:
--------------------------------------------------------------------------------
1 | setState 是如何更新 UI 的?
2 | ----
3 |
4 | Widget、Element、RenderObject 三棵树之间的关系是怎样的?Layer Tree 又是什么,又为什么要搞这么多 Tree ?
5 | ----
6 | 我们常用的 StatefulWidget、StatelessWidget,再加上 ProxyWidget 和 RenderObjectWidget 都继承于 Widget 基类,他们整体构成了 Widget 的骨架。
7 |
8 | https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/254b3dba38824ed6975cb017dc46aa92~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp
9 | https://i-blog.csdnimg.cn/blog_migrate/a659f04dad082c6b95c09be1a6283b5d.png
10 |
11 | https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f0ca986759a04a43bf940a00b99208eb~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp
12 | performRebuild 内部先通过调用 build 方法产生一个 newWidget。
13 | 为了提升渲染性能,我们希望尽可能少的对 Element 进行操作,需要对新老 Widget 进行比较。
14 | 先验空,新 widget 是空、老 widget 非空,相当于目前 Widget Tree 子树已经没了,而原来有,所以需要将 老 widget 对应的老 Element 移除出 Element Tree,流程结束;反之,新 widget 非空、老 widget 为空,需要将新 widget 对应的 Element 创建出来,并挂载到 Element Tree (inflateWidget)。
15 | 如果二者都不为空,则开始真正的比较过程。
16 | 先用 “==” 比较引用,如果引用都相等,说明是完全相同的两个 Widget,对于有 multichild 的 widget,需要进一步比较 slot,slot 为子 widget 在父 widget 的位置标识,如果更新只需要交换兄弟节点的位置即可,流程结束。
17 | 如果二者引用值不同,将进一步调用 Widget 的静态方法 canUpdate,如果返回 true,则表示可以直接更新 widget,而不需要变更 Element;反之,则还是认为新老 Widget 有本质的不同,此时需要将原 Element 从 Tree 中移除,并 inflate 新的 Element。
18 | 持续循环,如果碰到没有上述中断流程,将一直遍历到子树的叶子节点。
19 |
20 |
21 | 主题 Theme 变化为何可以全局换肤?
22 | -----
23 |
24 |
25 | skia简介
26 | ----
27 | https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3d5bf360cf944e2ab413b60b93c31515~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp
28 |
29 |
30 |
31 |
32 |
33 | 参考文章:
34 | https://juejin.cn/post/6874737011325059086
35 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/android基础/handler机制.md:
--------------------------------------------------------------------------------
1 | ## 问题1:简述handler机制?
2 | ##### 参考文章:
3 | ##### https://xujiaojie.github.io/2017/08/06/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Android%E7%9A%84Handler%E6%9C%BA%E5%88%B6/
4 | ##### https://cloud.tencent.com/developer/article/1011551
5 | ##### 参考答案:
6 | ##### handler向MessageQueue发送消息,Looper.loop()死循环查找消息,查找到消息后执行msg.target.dispatchMessage(msg),及handler的dispatchMessage方法来执行消息。
7 | ## 问题2:Looper.loop()如何实现死循环阻塞等待而不死机?
8 | #### 参考文章: https://blog.csdn.net/happylishang/article/details/77747250
9 | #### 参考答案: 在MessageQueue的next()函数中调用了native方法,native通过linux的epoll机制实现睡眠唤醒和CPU资源的出让
10 | ## 问题3:Handler,MessageQueue,Looper三者的持有关系?
11 | #### 参考答案: Looper通过ThreadLocal实现每个Thread都有一个副本(必须调用prepare该线程才有副本),在类初始化的时候初始化一个MessageQueue,handler通过当所在Thread获取Looper对象,并同时持有Looper的MessageQueue对象,子线程初始化handler如果没有先执行Looper.prepare()会崩溃报错!
12 | ## 问题4:ThreadLocal在Looper中如何运用的?
13 | #### [ThreadLocal](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/java%E5%9F%BA%E7%A1%80/ThreadLocal.md)
14 | ## 问题5:message执行的优先级?
15 | #### 优先级靠事件时间管理when属性
16 | ## 问题6:handler导致内存泄漏原因?
17 | #### 参考文章:https://www.jianshu.com/p/49a70aeb555b
18 | #### 参考答案:Message会持有一个对Handler的引用,当这个Handler是非静态内部类的时候,又会持有一个对外部类比如activity的引用,如果发送一条延时的Message,这个message会长时间持有这个activity的引用导致activity内存不释放
19 | ## 问题7:handler导致内存泄漏解决办法?
20 | #### 参考答案:静态内部类加弱引用持有activity对象,另一种优雅的写法:将WeakReference封装在BaseHandler类中(http://www.ishenping.com/ArtInfo/177913.html)
21 | ## 问题8:handler如何去除所有消息
22 | #### Looper.myLooper().quit();
23 | ## 延时msg是如何达到延时效果
24 | #### 靠when字段确定处理事件,如果队列有数据则根据when排队,如果没消息则睡眠等待when时间到了唤醒
25 | ## handler如何知道发到哪个消息队列的?
26 | #### handler持有MessageQueue对象是创建是Loop那里获得的
27 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/DemoService.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.app.Service;
4 | import android.content.Intent;
5 | import android.os.Binder;
6 | import android.os.IBinder;
7 | import android.util.Log;
8 |
9 | /**
10 | * Created by bobsha on 2019/5/26.
11 | */
12 | public class DemoService extends Service {
13 | final String TAG = this.getClass().getName();
14 |
15 | @Override
16 | public void onCreate() {
17 | Log.e(TAG, "onCreate");
18 | super.onCreate();
19 | }
20 |
21 | @Override
22 | public void onStart(Intent intent, int startId) {
23 | Log.e(TAG, "onStart");
24 | super.onStart(intent, startId);
25 | }
26 |
27 | @Override
28 | public int onStartCommand(Intent intent, int flags, int startId) {
29 | Log.e(TAG, "onStartCommand");
30 | return super.onStartCommand(intent, flags, startId);
31 | }
32 |
33 | @Override
34 | public IBinder onBind(Intent intent) {
35 | Log.e(TAG, "onBind");
36 | return new MyBinder();
37 | }
38 |
39 | @Override
40 | public void onRebind(Intent intent) {
41 | Log.e(TAG, "onRebind");
42 | super.onRebind(intent);
43 | }
44 |
45 | @Override
46 | public boolean onUnbind(Intent intent) {
47 | Log.e(TAG, "onUnbind");
48 | return super.onUnbind(intent);
49 | }
50 |
51 | @Override
52 | public void onDestroy() {
53 | Log.e(TAG, "onDestroy");
54 | super.onDestroy();
55 | }
56 |
57 | public class MyBinder extends Binder {
58 | //返回Service实例的引用
59 | public DemoService getId() {
60 | return DemoService.this;
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/android基础/线程优先级进程优先级.md:
--------------------------------------------------------------------------------
1 | ## 线程优先级如何调?
2 | #### android.os.Process.setThreadPriority
3 | #### java.lang.Thread.setPriority
4 | #### 数字越大优先级越高
5 |
6 | ## 进程优先级如何调?
7 | #### https://blog.csdn.net/wuseyukui/article/details/48004687
8 | 一.前台进程(Foreground process)
9 | 前台进程是用户当前做的事所必须的进程,如果满足下面各种情况中的一种,一个进程被认为是在前台:
10 |
11 | 进程持有一个正在与用户交互的Activity。
12 |
13 | 进程持有一个Service,这个Service处于这几种状态:①Service与用户正在交互的Activity绑定。②Service是在前台运行的,即它调用了 startForeground()。③Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。
14 |
15 | 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。
16 |
17 | 杀死前台进程需要用户交互,因为前台进程的优先级是最高的。
18 |
19 | 二.可见进程(Visible process)
20 | 如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:
21 |
22 | 进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态,比如,前台的activity打开了一个对话框,这样activity就会在其后可见)。
23 |
24 | 进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。
25 |
26 | 可见的进程也被认为是很重要的,一般不会被销毁,除非是为了保证所有前台进程的运行而不得不杀死可见进程的时候。
27 |
28 | 三.服务进程 (Service process)
29 | 如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。
30 |
31 | 尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。
32 |
33 | 四.后台进程 (Background process)
34 | 如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。
35 |
36 | 后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。
37 |
38 | 通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。
39 |
40 | 五.空进程
41 | 如果一个进程不包含任何活跃的应用组件,则认为是空进程。
42 | 例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。
43 | 保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。
44 |
45 | ## 如何通知退出线程?
46 | 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
47 |
48 | 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
49 |
50 | 3. 使用interrupt方法中断线程。
51 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/android基础/overview.md:
--------------------------------------------------------------------------------
1 | 1.[四大组件](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6.md)
2 |
3 | 2.[Activity](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/Activity.md)
4 |
5 | 3.[Service](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/Service.md)
6 |
7 | 4.[ContentProvider](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/ContentProvider.md)
8 |
9 | 5.[BroadcastReceiver](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/BroadcastReceiver.md)
10 |
11 | 6.[handler机制](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/handler%E6%9C%BA%E5%88%B6.md)
12 |
13 | 7.[SharedPreferences](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/SharedPreferences.md)
14 |
15 | 8.[touch事件分发](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91.md)
16 |
17 | 9.[数据库](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E5%BA%93.md)
18 |
19 | 10.[保活](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/%E4%BF%9D%E6%B4%BB.md)
20 |
21 | 11.[launcher启动app过程](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/launcher%E5%90%AF%E5%8A%A8app%E8%BF%87%E7%A8%8B.md)
22 |
23 | 12.[ActivtyStack栈相关问题](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/ActivtyStack.md)
24 |
25 | 13.[AMS](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/ActivityManagerService.md)
26 |
27 | 14.[布局](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/%E5%B8%83%E5%B1%80.md)
28 |
29 | 15.硬件加速软件加速的区别?硬件加速就是打开GPU渲染
30 |
31 | 16.[动画](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/%E5%8A%A8%E7%94%BB.md)
32 |
33 | 17.[View](https://github.com/knowledgeIsMoney/android-interveiw/blob/master/android%E5%9F%BA%E7%A1%80/View.md)
34 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/BActivity.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.app.Service;
4 | import android.content.ComponentName;
5 | import android.content.Intent;
6 | import android.content.ServiceConnection;
7 | import android.os.Bundle;
8 | import android.os.IBinder;
9 | import android.util.Log;
10 | import android.view.View;
11 | import android.widget.Button;
12 |
13 | import androidx.annotation.Nullable;
14 | import androidx.appcompat.app.AppCompatActivity;
15 |
16 | import timber.log.Timber;
17 |
18 | /**
19 | * Created by bobsha on 2019/5/26.
20 | */
21 | public class BActivity extends AppCompatActivity {
22 | final String TAG = this.getClass().getName();
23 | ServiceConnection mServiceConnection;
24 | @Override
25 | protected void onCreate(@Nullable Bundle savedInstanceState) {
26 | Log.e(TAG, "onCreate");
27 | super.onCreate(savedInstanceState);
28 | setContentView(R.layout.activity_b);
29 | Button bind_service = findViewById(R.id.bind_service);
30 | bind_service.setOnClickListener(new View.OnClickListener() {
31 | @Override
32 | public void onClick(View v) {
33 | Log.e(TAG, "bind_service click");
34 | mServiceConnection = new ServiceConnection() {
35 | @Override
36 | public void onServiceConnected(ComponentName name, IBinder service) {
37 | Log.e(TAG, "onServiceConnected");
38 | }
39 |
40 | @Override
41 | public void onServiceDisconnected(ComponentName name) {
42 | Log.e(TAG, "onServiceDisconnected");
43 | }
44 | };
45 | bindService(new Intent(BActivity.this, DemoService.class), mServiceConnection, Service.BIND_AUTO_CREATE);
46 | }
47 | });
48 | }
49 |
50 | @Override
51 | protected void onStart() {
52 | super.onStart();
53 | Log.e(TAG, "onStart");
54 | Timber.e("onStart Timber");
55 | }
56 |
57 | @Override
58 | protected void onRestart() {
59 | super.onRestart();
60 | Log.e(TAG, "onRestart");
61 | Timber.e("");
62 | }
63 |
64 | @Override
65 | protected void onResume() {
66 | super.onResume();
67 | Log.e(TAG, "onResume");
68 | }
69 |
70 | @Override
71 | protected void onPause() {
72 | super.onPause();
73 | Log.e(TAG, "onPause");
74 | }
75 |
76 | @Override
77 | protected void onStop() {
78 | super.onStop();
79 | Log.e(TAG, "onStop");
80 | }
81 |
82 | @Override
83 | protected void onDestroy() {
84 | super.onDestroy();
85 | Log.e(TAG, "onDestroy");
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
40 |
41 |
48 |
49 |
56 |
57 |
64 |
65 |
72 |
73 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | xmlns:android
62 |
63 | ^$
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | xmlns:.*
73 |
74 | ^$
75 |
76 |
77 | BY_NAME
78 |
79 |
80 |
81 |
82 |
83 |
84 | .*:id
85 |
86 | http://schemas.android.com/apk/res/android
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | .*:name
96 |
97 | http://schemas.android.com/apk/res/android
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | name
107 |
108 | ^$
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 | style
118 |
119 | ^$
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | .*
129 |
130 | ^$
131 |
132 |
133 | BY_NAME
134 |
135 |
136 |
137 |
138 |
139 |
140 | .*
141 |
142 | http://schemas.android.com/apk/res/android
143 |
144 |
145 | ANDROID_ATTRIBUTE_ORDER
146 |
147 |
148 |
149 |
150 |
151 |
152 | .*
153 |
154 | .*
155 |
156 |
157 | BY_NAME
158 |
159 |
160 |
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/算法/在算法中常用的Java语法小技巧.MD:
--------------------------------------------------------------------------------
1 | 位运算
2 | -----------------
3 | |或,&与,^异或,<<右移,>>左移(补符号位,0补0,1补1),>>>无符号右移(永远补0),同或使用异或取反~(a^b)
4 |
5 | String
6 | -----------------
7 | new String(arr , 1 , arr.length-1);
8 |
9 | Char
10 | -----------------
11 | Character.isLetterOrDigit char 判断是不是字母数字
12 | Character.toLowerCase char 转小写
13 | char[] arr = s.toCharArray(); String 转 char数组
map putifabsent 可以在没有的时候推默认值
14 |
15 | Array
16 | -----------------
17 | Arrays.sort(nums); 数组排序
18 |
19 | int[][] dp = new int[n][m];
20 | Arrays.stream(dp).forEach(ar -> Arrays.fill(ar, -1)); 数组填充
21 | Arrays.fill(array, value); 数组填充
22 |
23 | Queue
24 | -----------------
25 | * Boolean offer() – 如果可能,将一个新元素插入队列
26 | * Boolean add(E e) – 如果可能,将一个新元素插入队列。如果成功则返回 true,如果没有空间则抛出 IllegalStateException。
27 | * Object poll() – 从 的头部检索并删除一个元素。如果队列为空,则返回 null。
28 | * Object remove() – 从队列头部检索并删除一个元素。
29 | * Object peek() – 检索但不从队列头部移除元素。如果队列为空,则返回 null。
30 | * Object element() – 检索但不从队列头部移除元素
31 | Queue 和 Stack 数据结构都可以用LinkedList实现
32 |
33 |
34 |
35 | StringBuilder 方法
36 | -----------------
37 | StringBuilder append(boolean b)
38 | 将 boolean参数的字符串表示形式追加到序列中。
39 |
40 | StringBuilder append(char c)
41 | 将 char参数的字符串表示形式追加到此序列。
42 |
43 | StringBuilder append(char[] str)
44 | 将 char数组参数的字符串表示形式追加到此序列。
45 |
46 | StringBuilder append(char[] str, int offset, int len)
47 | 将 char数组参数的子数组的字符串表示形式追加到此序列。
48 |
49 | StringBuilder append(double d)
50 | 将 double参数的字符串表示形式追加到此序列。
51 |
52 | StringBuilder append(float f)
53 | 将 float参数的字符串表示形式追加到此序列。
54 |
55 | StringBuilder append(int i)
56 | 将 int参数的字符串表示形式追加到此序列。
57 |
58 | StringBuilder append(long lng)
59 | 将 long参数的字符串表示形式追加到此序列。
60 |
61 | StringBuilder append(CharSequence s)
62 | 将指定的字符序列追加到此 Appendable 。
63 |
64 | StringBuilder append(CharSequence s, int start, int end)
65 | 将指定的 CharSequence序列追加到此序列。
66 |
67 | StringBuilder append(Object obj)
68 | 追加 Object参数的字符串表示形式。
69 |
70 | StringBuilder append(String str)
71 | 将指定的字符串追加到此字符序列。
72 |
73 | StringBuilder append(StringBuffer sb)
74 | 将指定的 StringBuffer追加到此序列。
75 |
76 | StringBuilder appendCodePoint(int codePoint)
77 | 将 codePoint参数的字符串表示形式追加到此序列。
78 |
79 | int capacity()
80 | 返回当前容量。
81 |
82 | char charAt(int index)
83 | 返回指定索引处的此序列中的 char值。
84 |
85 | IntStream chars()
86 | 返回 int的流,对此序列中的 char值进行零扩展。
87 |
88 | int codePointAt(int index)
89 | 返回指定索引处的字符(Unicode代码点)。
90 |
91 | int codePointBefore(int index)
92 | 返回指定索引之前的字符(Unicode代码点)。
93 |
94 | int codePointCount(int beginIndex, int endIndex)
95 | 返回此序列的指定文本范围内的Unicode代码点数。
96 |
97 | IntStream codePoints()
98 | 返回此序列中的代码点值流。
99 |
100 | int compareTo(StringBuilder another)
101 | StringBuilder字典顺序比较两个 StringBuilder实例。
102 |
103 | StringBuilder delete(int start, int end)
104 | 删除此序列的子字符串中的字符。
105 |
106 | StringBuilder deleteCharAt(int index)
107 | 按此顺序删除指定位置的 char 。
108 |
109 | void ensureCapacity(int minimumCapacity)
110 | 确保容量至少等于指定的最小值。
111 |
112 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
113 | 将字符从此序列复制到目标字符数组 dst 。
114 |
115 | int indexOf(String str)
116 | 返回指定子字符串第一次出现的字符串中的索引。
117 |
118 | int indexOf(String str, int fromIndex)
119 | 从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
120 |
121 | StringBuilder insert(int offset, boolean b)
122 | 将 boolean参数的字符串表示形式插入此序列中。
123 |
124 | StringBuilder insert(int offset, char c)
125 | 将 char参数的字符串表示形式插入此序列中。
126 |
127 | StringBuilder insert(int offset, char[] str)
128 | 将 char数组参数的字符串表示形式插入此序列中。
129 |
130 | StringBuilder insert(int index, char[] str, int offset, int len)
131 | 将 str数组参数的子数组的字符串表示形式插入此序列中。
132 |
133 | StringBuilder insert(int offset, double d)
134 | 将 double参数的字符串表示形式插入此序列中。
135 |
136 | StringBuilder insert(int offset, float f)
137 | 将 float参数的字符串表示形式插入此序列中。
138 |
139 | StringBuilder insert(int offset, int i)
140 | 将第二个 int参数的字符串表示形式插入此序列中。
141 |
142 | StringBuilder insert(int offset, long l)
143 | 将 long参数的字符串表示形式插入此序列中。
144 |
145 | StringBuilder insert(int dstOffset, CharSequence s)
146 | 将指定的 CharSequence插入此序列。
147 |
148 | StringBuilder insert(int dstOffset, CharSequence s, int start, int end)
149 | 将指定的 CharSequence序列插入此序列。
150 |
151 | StringBuilder insert(int offset, Object obj)
152 | 将 Object参数的字符串表示形式插入此字符序列中。
153 |
154 | StringBuilder insert(int offset, String str)
155 | 将字符串插入此字符序列。
156 |
157 | int lastIndexOf(String str)
158 | 返回指定子字符串最后一次出现的字符串中的索引。
159 |
160 | int lastIndexOf(String str, int fromIndex)
161 | 返回指定子字符串最后一次出现的字符串中的索引,从指定索引开始向后搜索。
162 |
163 | int length()
164 | 返回长度(字符数)。
165 |
166 | int offsetByCodePoints(int index, int codePointOffset)
167 | 返回此序列中的索引,该索引从给定的 index偏移 codePointOffset代码点。
168 |
169 | StringBuilder replace(int start, int end, String str)
170 | 使用指定的 String的字符替换此序列的子字符串中的字符。
171 |
172 | StringBuilder reverse()
173 | 导致此字符序列被序列的反向替换。
174 |
175 | void setCharAt(int index, char ch)
176 | 指定索引处的字符设置为 ch 。
177 |
178 | void setLength(int newLength)
179 | 设置字符序列的长度。
180 |
181 | CharSequence subSequence(int start, int end)
182 | 返回一个新的字符序列,它是该序列的子序列。
183 |
184 | String substring(int start)
185 | 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
186 |
187 | String substring(int start, int end)
188 | 返回一个新的 String ,其中包含当前包含在此序列中的字符的子序列。
189 |
190 | void trimToSize()
191 | 尝试减少用于字符序列的存储空间。
192 |
193 | StringBuffer 方法
194 | -----------------
195 | 1 public StringBuffer append(String s)
196 | 将指定的字符串追加到此字符序列。
197 |
198 | 2 public StringBuffer reverse()
199 | 将此字符序列用其反转形式取代。
200 |
201 | 3 public delete(int start, int end)
202 | 移除此序列的子字符串中的字符。
203 |
204 | 4 public insert(int offset, int i)
205 | 将 int 参数的字符串表示形式插入此序列中。
206 |
207 | 5 insert(int offset, String str)
208 | 将 str 参数的字符串插入此序列中。
209 |
210 | 6 replace(int start, int end, String str)
211 | 使用给定 String 中的字符替换此序列的子字符串中的字符。
212 |
213 | 序号 方法描述
214 | 1 int capacity()
215 | 返回当前容量。
216 |
217 | 2 char charAt(int index)
218 | 返回此序列中指定索引处的 char 值。
219 |
220 | 3 void ensureCapacity(int minimumCapacity)
221 | 确保容量至少等于指定的最小值。
222 |
223 | 4 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
224 | 将字符从此序列复制到目标字符数组 dst。
225 |
226 | 5 int indexOf(String str)
227 | 返回第一次出现的指定子字符串在该字符串中的索引。
228 |
229 | 6 int indexOf(String str, int fromIndex)
230 | 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
231 |
232 | 7 int lastIndexOf(String str)
233 | 返回最右边出现的指定子字符串在此字符串中的索引。
234 |
235 | 8 int lastIndexOf(String str, int fromIndex)
236 | 返回 String 对象中子字符串最后出现的位置。
237 |
238 | 9 int length()
239 | 返回长度(字符数)。
240 |
241 | 10 void setCharAt(int index, char ch)
242 | 将给定索引处的字符设置为 ch。
243 |
244 | 11 void setLength(int newLength)
245 | 设置字符序列的长度。
246 |
247 | 12 CharSequence subSequence(int start, int end)
248 | 返回一个新的字符序列,该字符序列是此序列的子序列。
249 |
250 | 13 String substring(int start)
251 | 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
252 |
253 | 14 String substring(int start, int end)
254 | 返回一个新的 String,它包含此序列当前所包含的字符子序列。
255 |
256 | 15 String toString()
257 | 返回此序列中数据的字符串表示形式。
258 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/UmengCrashHandler.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.accounts.NetworkErrorException;
4 | import android.content.Context;
5 | import android.content.pm.PackageInfo;
6 | import android.content.pm.PackageManager;
7 | import android.content.pm.PackageManager.NameNotFoundException;
8 | import android.os.Build;
9 | import android.os.Environment;
10 | import android.util.Log;
11 |
12 | import java.io.File;
13 | import java.io.FileOutputStream;
14 | import java.lang.Thread.UncaughtExceptionHandler;
15 | import java.lang.reflect.Field;
16 | import java.text.DateFormat;
17 | import java.text.SimpleDateFormat;
18 | import java.util.Date;
19 | import java.util.HashMap;
20 | import java.util.Map;
21 |
22 | /**
23 | * Created by bobsha on 15/4/30.
24 | */
25 | public class UmengCrashHandler implements UncaughtExceptionHandler {
26 |
27 | public static final String TAG = "UmengCrashHandler";
28 | private static final int ERROR_STACK = 1;
29 | private static final int ERROR_ID = 0;
30 | private static final String TOO_LARGE_IMAGE = "Canvas: trying to draw too large";
31 | //CrashHandler实例
32 | private static UmengCrashHandler INSTANCE = new UmengCrashHandler();
33 | //系统默认的UncaughtException处理类
34 | private Thread.UncaughtExceptionHandler mDefaultHandler;
35 | //程序的Context对象
36 | private Context mContext;
37 | //用来存储设备信息和异常信息
38 | private Map infos;
39 |
40 | //用于格式化日期,作为日志文件名的一部分
41 | private DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
42 | private File crashDir;
43 |
44 | private UmengCrashHandler() {
45 | }
46 |
47 |
48 | public static UmengCrashHandler getInstance() {
49 | return INSTANCE;
50 | }
51 |
52 | /**
53 | * 初始化
54 | *
55 | * @param context
56 | */
57 | public void init(Context context) {
58 | mContext = context;
59 | getFileDir();
60 | // reportTooLargeBitmapError();
61 | //获取系统默认的UncaughtException处理器
62 | mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
63 | //设置该CrashHandler为程序的默认处理器
64 | Thread.setDefaultUncaughtExceptionHandler(this);
65 | }
66 |
67 | /**
68 | * 当UncaughtException发生时会转入该函数来处理
69 | */
70 | @Override
71 | public void uncaughtException(Thread thread, Throwable ex) {
72 | handleException(ex);
73 | // if (mDefaultHandler != null) // FIXME: 2017/12/19 系统默认的处理方式为直接退出APP,不符合需求,请勿打开注释
74 | // mDefaultHandler.uncaughtException(thread, ex);
75 | }
76 |
77 | /**
78 | * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
79 | *
80 | * @param ex
81 | * @return true:如果处理了该异常信息;否则返回false.
82 | */
83 | private void handleException(final Throwable ex) {
84 | if (ex == null) {
85 | return;
86 | }
87 | Log.e(TAG, "异常:" + ex.getMessage());
88 | if ((ex instanceof NetworkErrorException)) {
89 | Log.e(TAG, "网络层出现异常:" + ex.getMessage());
90 | }
91 |
92 | if ((ex instanceof NullPointerException)) {
93 | Log.e(TAG, "空指针异常:" + ex.getMessage());
94 | }
95 | //使用Toast来显示异常信息
96 | if(!BuildConfig.DEBUG) {
97 | //退出程序
98 | android.os.Process.killProcess(android.os.Process.myPid());
99 | System.exit(1);
100 | }
101 | }
102 |
103 | // private void handleCrash(Throwable ex) {
104 | // if (crashDir == null)
105 | // return;
106 | // String time = formatter.format(new Date());
107 | // String[] errorInfo = getErrorInfo(ex);
108 | // for (File file : crashDir.listFiles()) {
109 | // if (file.getName().startsWith("crash-" + errorInfo[ERROR_ID]))
110 | // return;
111 | // }
112 | //
113 | // String filePrefix = crashDir.getAbsolutePath() + File.separator + "crash-" + errorInfo[ERROR_ID] + "-" + time;
114 | // //保存日志文件
115 | // saveCrashInfo2File(ex, filePrefix + ".log", errorInfo);
116 | // }
117 |
118 | private void getFileDir() {
119 | if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
120 | return;
121 | if (crashDir == null)
122 | crashDir = new File(mContext.getExternalCacheDir(), "crash");
123 | if (!crashDir.exists() || !crashDir.isDirectory()) {
124 | crashDir.delete();
125 | crashDir.mkdirs();
126 | }
127 | if (crashDir == null || !crashDir.exists() || !crashDir.isDirectory())
128 | crashDir = null;
129 | }
130 |
131 | /**
132 | * 获取崩溃信息摘要,摘要相同的崩溃不会重复上传
133 | *
134 | * @param ex
135 | * @return
136 | */
137 | // private String[] getErrorInfo(Throwable ex) {
138 | // ByteArrayOutputStream baos = new ByteArrayOutputStream();
139 | // PrintWriter printWriter = new PrintWriter(baos);
140 | // ex.printStackTrace(printWriter);
141 | // printWriter.close();
142 | // String errorStack = new String(baos.toByteArray());
143 | // try {
144 | // baos.close();
145 | // } catch (IOException e) {
146 | // SentryUtil.sendSentryExcepiton(new EventBuilder()
147 | // .withMessage("try catch msg")
148 | // .withLevel(Event.Level.WARNING)
149 | // .withLogger(this.getClass().getName())
150 | // .withSentryInterface(new ExceptionInterface(e)));
151 | //
152 | // LogUtils.e(e);
153 | // }
154 | // String error = Build.HARDWARE + ":" + Build.MODEL + ":" + Build.CPU_ABI + ":" + Build.VERSION.SDK_INT +
155 | // ":" + Build.VERSION.RELEASE + ":" + "\n" + errorStack;
156 | // String errorId = DigestUtil.stringMD5(error);
157 | // LogUtils.e("along error " + errorId + "\n" + error);
158 | // return new String[]{errorId, errorStack};
159 | // }
160 |
161 | /**
162 | * 收集设备参数信息
163 | *
164 | * @param ctx
165 | */
166 | public void collectDeviceInfo(Context ctx) {
167 | if (infos != null)
168 | return;
169 | infos = new HashMap<>();
170 | try {
171 | PackageManager pm = ctx.getPackageManager();
172 | PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);
173 | if (pi != null) {
174 | String versionName = pi.versionName == null ? "null" : pi.versionName;
175 | String versionCode = pi.versionCode + "";
176 | infos.put("versionName", versionName);
177 | infos.put("versionCode", versionCode);
178 | infos.put("sysVersionCode", Build.VERSION.SDK_INT + "");
179 | infos.put("sysVersionName", Build.VERSION.RELEASE);
180 | }
181 | } catch (NameNotFoundException e) {
182 | }
183 | Field[] fields = Build.class.getDeclaredFields();
184 | for (Field field : fields) {
185 | try {
186 | field.setAccessible(true);
187 | infos.put(field.getName(), field.get(null).toString());
188 | Log.d(TAG, field.getName() + " : " + field.get(null));
189 | } catch (Exception e) {
190 | }
191 | }
192 | }
193 |
194 | /**
195 | * 保存错误信息到文件中
196 | *
197 | * @param ex
198 | * @return 返回文件名称, 便于将文件传送到服务器
199 | */
200 | private String saveCrashInfo2File(Throwable ex, String filePath, String[] errorInfo) {
201 | //收集设备参数信息
202 | collectDeviceInfo(mContext);
203 | StringBuffer sb = new StringBuffer();
204 | sb.append(errorInfo[ERROR_ID] + "\n");
205 | sb.append(formatter.format(new Date()) + "\n");
206 | for (Map.Entry entry : infos.entrySet()) {
207 | String key = entry.getKey();
208 | String value = entry.getValue();
209 | sb.append(key + "=" + value + "\n");
210 | }
211 | sb.append(errorInfo[ERROR_STACK]);
212 | try {
213 | FileOutputStream fos = new FileOutputStream(filePath);
214 | fos.write(sb.toString().getBytes());
215 | fos.close();
216 | return filePath;
217 | } catch (Exception e) {
218 | }
219 | return null;
220 | }
221 | }
222 |
223 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/src/main/java/com/banana/servicedemo/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.banana.servicedemo;
2 |
3 | import android.app.Service;
4 | import android.content.ComponentName;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.content.ServiceConnection;
8 | import android.os.Bundle;
9 | import android.os.IBinder;
10 | import android.util.Log;
11 | import android.view.Menu;
12 | import android.view.MenuItem;
13 | import android.view.View;
14 | import android.view.inputmethod.InputMethodManager;
15 | import android.widget.Button;
16 |
17 | import androidx.appcompat.app.AppCompatActivity;
18 | import androidx.appcompat.widget.Toolbar;
19 | import androidx.viewpager2.widget.ViewPager2;
20 |
21 | import com.google.android.material.floatingactionbutton.FloatingActionButton;
22 |
23 | import java.util.ArrayList;
24 |
25 | import timber.log.Timber;
26 |
27 |
28 | public class MainActivity extends AppCompatActivity {
29 | final String TAG = this.getClass().getName();
30 | ServiceConnection mServiceConnection = null;
31 | ServiceConnection mServiceConnection1 = null;
32 | Button start_b;
33 | ViewPager2 viewPager;
34 | ArrayList views = new ArrayList<>();
35 | ArrayList viewPagers = new ArrayList<>();
36 |
37 | @Override
38 | protected void onCreate(Bundle savedInstanceState) {
39 | super.onCreate(savedInstanceState);
40 | Log.e(TAG, "onCreate");
41 | setContentView(R.layout.activity_main);
42 | Toolbar toolbar = findViewById(R.id.toolbar);
43 | viewPager = findViewById(R.id.viewPager);
44 | // viewPager.setAdapter();
45 | setSupportActionBar(toolbar);
46 |
47 | FloatingActionButton fab = findViewById(R.id.fab);
48 | Button start_service = findViewById(R.id.start_service);
49 | Button bind_service = findViewById(R.id.bind_service);
50 | Button unbind_service = findViewById(R.id.unbind_service);
51 | Button stop_service = findViewById(R.id.stop_service);
52 | start_b = findViewById(R.id.start_b);
53 | final IfSwitchCompareObj ifSwitchCompareObj = new IfSwitchCompareObj();
54 | fab.setOnClickListener(new View.OnClickListener() {
55 | @Override
56 | public void onClick(View view) {
57 | ifSwitchCompareObj.startIfTest();
58 | //
59 | // Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
60 | // .setAction("Action", null).show();
61 | }
62 | });
63 | start_service.setOnClickListener(new View.OnClickListener() {
64 | @Override
65 | public void onClick(View v) {
66 | Log.e(TAG, "startService click");
67 | ifSwitchCompareObj.startSwitchTest();
68 | // startService(new Intent(MainActivity.this, DemoService.class));
69 | }
70 | });
71 | bind_service.setOnClickListener(new View.OnClickListener() {
72 | @Override
73 | public void onClick(View v) {
74 | Log.e(TAG, "bind_service click");
75 | if (mServiceConnection == null) {
76 | mServiceConnection = new ServiceConnection() {
77 | @Override
78 | public void onServiceConnected(ComponentName name, IBinder service) {
79 | Log.e(TAG, "onServiceConnected");
80 | }
81 |
82 | @Override
83 | public void onServiceDisconnected(ComponentName name) {
84 | Log.e(TAG, "onServiceDisconnected");
85 | }
86 | };
87 | bindService(new Intent(MainActivity.this, DemoService.class), mServiceConnection, Service.BIND_AUTO_CREATE);
88 | } else {
89 | mServiceConnection1 = new ServiceConnection() {
90 | @Override
91 | public void onServiceConnected(ComponentName name, IBinder service) {
92 | Log.e(TAG, "onServiceConnected 1");
93 | }
94 |
95 | @Override
96 | public void onServiceDisconnected(ComponentName name) {
97 | Log.e(TAG, "onServiceDisconnected 1");
98 | }
99 | };
100 | // bindService(new Intent(MainActivity.this, DemoService.class), mServiceConnection, Service.BIND_AUTO_CREATE);
101 | bindService(new Intent(MainActivity.this, DemoService.class), mServiceConnection1, Service.BIND_AUTO_CREATE);
102 | }
103 | }
104 | });
105 | unbind_service.setOnClickListener(new View.OnClickListener() {
106 | @Override
107 | public void onClick(View v) {
108 | Log.e(TAG, "unbind_service click");
109 | try {
110 | unbindService(mServiceConnection);
111 | unbindService(mServiceConnection1);
112 | } catch (IllegalArgumentException e) {
113 | e.printStackTrace();
114 | finish();
115 | }
116 | }
117 | });
118 | stop_service.setOnClickListener(new View.OnClickListener() {
119 | @Override
120 | public void onClick(View v) {
121 | Log.e(TAG, "stop_service click");
122 | stopService(new Intent(MainActivity.this, DemoService.class));
123 | }
124 | });
125 | start_b.setOnClickListener(new View.OnClickListener() {
126 | @Override
127 | public void onClick(View v) {
128 | Log.e(TAG, "start_b click");
129 | startActivity(new Intent(MainActivity.this, BActivity.class));
130 | }
131 | });
132 | Log.e(TAG, start_b.getLayoutParams().height + "");
133 | }
134 |
135 | @Override
136 | public boolean onCreateOptionsMenu(Menu menu) {
137 | // Inflate the menu; this adds items to the action bar if it is present.
138 | getMenuInflater().inflate(R.menu.menu_main, menu);
139 | return true;
140 | }
141 |
142 | @Override
143 | public boolean onOptionsItemSelected(MenuItem item) {
144 | // Handle action bar item clicks here. The action bar will
145 | // automatically handle clicks on the Home/Up button, so long
146 | // as you specify a parent activity in AndroidManifest.xml.
147 | int id = item.getItemId();
148 |
149 | //noinspection SimplifiableIfStatement
150 | if (id == R.id.action_settings) {
151 | return true;
152 | }
153 |
154 | return super.onOptionsItemSelected(item);
155 | }
156 |
157 | @Override
158 | protected void onStart() {
159 | super.onStart();
160 | Timber.e("onStart Timber");
161 | Log.e(TAG, "onStart");
162 | Log.e(TAG, start_b.getWidth() + "");
163 | Log.e(TAG, start_b.getMeasuredWidth() + "");
164 | start_b.post(new Runnable() {
165 | @Override
166 | public void run() {
167 | Log.e(TAG, start_b.getWidth() + "");
168 | Log.e(TAG, start_b.getMeasuredWidth() + "");
169 | }
170 | });
171 | new Thread(new Runnable() {
172 | @Override
173 | public void run() {
174 | TestSyncUtil.ins().sleep();
175 | }
176 | }).start();
177 | }
178 |
179 | @Override
180 | protected void onRestart() {
181 | super.onRestart();
182 | Log.e(TAG, "onRestart");
183 | }
184 |
185 | @Override
186 | protected void onResume() {
187 | super.onResume();
188 | Log.e(TAG, "onResume");
189 | Log.e(TAG, start_b.getWidth() + "");
190 | Log.e(TAG, start_b.getMeasuredWidth() + "");
191 | // start_b.post(new Runnable() {
192 | // @Override
193 | // public void run() {
194 | // Log.e(TAG, start_b.getWidth()+"");
195 | // }
196 | // });
197 |
198 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
199 | if (imm != null) {
200 | Timber.e("showSoftInput ");
201 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
202 | } else {
203 | Timber.e("imm null");
204 | }
205 |
206 |
207 | TestSyncUtil.ins().sleep();
208 | }
209 |
210 | @Override
211 | protected void onPause() {
212 | super.onPause();
213 | Log.e(TAG, "onPause");
214 | }
215 |
216 | @Override
217 | protected void onStop() {
218 | super.onStop();
219 | Log.e(TAG, "onStop");
220 | }
221 |
222 | @Override
223 | protected void onDestroy() {
224 | super.onDestroy();
225 | Log.e(TAG, "onDestroy");
226 | }
227 | }
228 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/app/app.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | generateDebugSources
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/android基础/ServiceDemo/.idea/dbnavigator.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
--------------------------------------------------------------------------------