├── AAC ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── aac │ │ │ ├── activity │ │ │ ├── Activity1.kt │ │ │ ├── Activity2.kt │ │ │ ├── Activity3.kt │ │ │ ├── Activity4.kt │ │ │ ├── Activity5.kt │ │ │ ├── Activity6.kt │ │ │ ├── Activity7.kt │ │ │ └── MainActivity.kt │ │ │ ├── db │ │ │ ├── User.kt │ │ │ ├── UserDao.kt │ │ │ └── UserDatabase.kt │ │ │ ├── delegate │ │ │ └── ViewModelDelegate.kt │ │ │ ├── fragment │ │ │ ├── Fragment1.kt │ │ │ └── Fragment2.kt │ │ │ ├── lifecycle │ │ │ └── LifeCycleListener.kt │ │ │ ├── livedata │ │ │ └── MyLiveData.kt │ │ │ └── viewmodel │ │ │ ├── FruitViewModel.kt │ │ │ └── SharedViewModel.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── textview_border.xml │ │ ├── layout │ │ ├── activity_3.xml │ │ ├── activity_4.xml │ │ ├── activity_6.xml │ │ ├── activity_7.xml │ │ ├── activity_main.xml │ │ ├── fragment_1.xml │ │ └── fragment_2.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── Basic ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle └── src │ └── main │ ├── java │ ├── Color.java │ ├── Dog.java │ ├── Generic1.java │ ├── Generic2.java │ ├── Generic3.java │ ├── Generic4.java │ ├── TestSingleton1.java │ ├── User.java │ ├── dynamicproxy │ │ └── DynamicProxyDemo.java │ └── proxy │ │ └── ProxyDemo.java │ └── kotlin │ ├── Args1.kt │ ├── Args2.kt │ ├── Args3.kt │ ├── Extension1.kt │ ├── Extension2.kt │ ├── Extension3.kt │ ├── FunctionType.kt │ ├── HigherOrderFunctions1.kt │ ├── HigherOrderFunctions2.kt │ ├── HigherOrderFunctions3.kt │ ├── Infix1.kt │ ├── Infix2.kt │ ├── Inline.kt │ ├── Invoke.kt │ ├── Lambda.kt │ ├── Lazy.kt │ ├── LocalFunction.kt │ ├── Main.kt │ ├── MethodReference.kt │ ├── Noinline.kt │ ├── Nothing.kt │ ├── Polymorphism.kt │ ├── Recursive.kt │ ├── SAM.kt │ ├── Sequence.kt │ ├── TailRecursive.kt │ ├── classes │ ├── Color.kt │ ├── CompanionObject.kt │ ├── Constructor1.kt │ ├── Constructor2.kt │ ├── Constructor3.kt │ ├── Constructor4.kt │ ├── DataClass1.kt │ ├── DataClass2.kt │ ├── OutterAndInner.kt │ ├── OutterAndNested.kt │ ├── SealedClass.kt │ ├── Singleton1.kt │ └── Singleton2.kt │ ├── delegates │ ├── DatabaseDelegate.kt │ ├── Delegate.kt │ ├── Derived.kt │ ├── TestDelegateProperties.kt │ └── User.kt │ └── generic │ ├── Animal.kt │ ├── Generic1.kt │ ├── Generic2.kt │ ├── Generic3.kt │ └── Generic4.kt ├── Benchmark ├── .gitignore ├── README.md ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle └── src │ └── main │ └── kotlin │ └── benchmark │ ├── CoroutinesBenchmark.kt │ ├── InlineBenchmark.kt │ └── SequenceBenchmark.kt ├── Coroutines1 ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle └── src │ └── main │ └── kotlin │ ├── Actor.kt │ ├── Async1.kt │ ├── Async2.kt │ ├── Async3.kt │ ├── Async4.kt │ ├── Channel1.kt │ ├── Channel2.kt │ ├── Channel3.kt │ ├── Channel4.kt │ ├── Channel5.kt │ ├── ChildCoroutine1.kt │ ├── ChildCoroutine2.kt │ ├── ChildCoroutine3.kt │ ├── ChildCoroutine4.kt │ ├── CoroutineContext+Job.kt │ ├── CoroutineDispatchers1.kt │ ├── CoroutineDispatchers2.kt │ ├── CoroutineScope.kt │ ├── Delay.kt │ ├── Launch.kt │ ├── NonCancellable.kt │ ├── RunBlocking.kt │ ├── Select.kt │ ├── WithContext.kt │ └── Yield.kt ├── Coroutines2 ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── coroutines │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kotlin │ │ │ │ └── tutorial │ │ │ │ └── coroutines │ │ │ │ ├── activity │ │ │ │ ├── Demo4RetrofitActivity.kt │ │ │ │ └── MainActivity.kt │ │ │ │ ├── api │ │ │ │ └── APIService.kt │ │ │ │ ├── config │ │ │ │ └── Constant.kt │ │ │ │ ├── ext │ │ │ │ └── View+Extension.kt │ │ │ │ ├── http │ │ │ │ └── RetrofitManager.kt │ │ │ │ └── model │ │ │ │ ├── PM25Model.kt │ │ │ │ ├── SO2Model.kt │ │ │ │ └── ZipObject.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── ic_launcher_background.xml │ │ │ └── textview_border.xml │ │ │ ├── layout │ │ │ ├── activity_demo_4_retrofit.xml │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.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 │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kotlin │ │ └── tutorial │ │ └── coroutines │ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── DSL ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle └── src │ ├── main │ └── kotlin │ │ ├── Address.kt │ │ ├── Apply.kt │ │ ├── Dependency.kt │ │ ├── Invoke.kt │ │ ├── Receiver.kt │ │ ├── TestUserWrapper.kt │ │ ├── User.kt │ │ └── UserWrapper.kt │ └── test │ └── kotlin │ ├── Assertion.kt │ └── AssertionTest.kt ├── Dagger2 ├── .gitignore ├── app1 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── dagger2 │ │ │ ├── DemoService.kt │ │ │ ├── IService.kt │ │ │ ├── activity │ │ │ ├── Demo4ComponentBuilderActivity.kt │ │ │ ├── Demo4InjectActivity.kt │ │ │ ├── Demo4InjectWithParamActivity.kt │ │ │ ├── Demo4InterfaceInjectActivity.kt │ │ │ ├── Demo4ModuleActivity.kt │ │ │ └── MainActivity.kt │ │ │ ├── di │ │ │ ├── component │ │ │ │ ├── DemoComponent.kt │ │ │ │ ├── UserComponent1.kt │ │ │ │ ├── UserComponent2.kt │ │ │ │ ├── UserComponent3.kt │ │ │ │ └── UserComponent4.kt │ │ │ └── module │ │ │ │ ├── DemoModule.kt │ │ │ │ ├── UserModule2.kt │ │ │ │ ├── UserModule3.kt │ │ │ │ └── UserModule4.kt │ │ │ └── domain │ │ │ └── User.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── textview_border.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── app2 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── dagger2 │ │ │ └── app2 │ │ │ ├── activity │ │ │ ├── Demo4CustomerQualifierActivity.kt │ │ │ ├── Demo4LazyActivity.kt │ │ │ ├── Demo4ProviderInjectActivity.kt │ │ │ ├── Demo4RecursiveInjectActivity.kt │ │ │ ├── Demo4QualifierActivity.kt │ │ │ └── MainActivity.kt │ │ │ ├── di │ │ │ ├── component │ │ │ │ ├── AddressComponent.kt │ │ │ │ ├── UserComponent1.kt │ │ │ │ ├── UserComponent2.kt │ │ │ │ ├── UserComponent3.kt │ │ │ │ └── UserComponent4.kt │ │ │ ├── module │ │ │ │ ├── AddressModule.kt │ │ │ │ ├── StreetModule.kt │ │ │ │ ├── UserModule3.kt │ │ │ │ └── UserModule4.kt │ │ │ └── qualifier │ │ │ │ ├── Monica.kt │ │ │ │ └── Tony.kt │ │ │ └── domain │ │ │ ├── Address.kt │ │ │ ├── Street.kt │ │ │ └── User.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── textview_border.xml │ │ ├── layout │ │ ├── activity_demo_4_qualifier.xml │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── app3 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── dagger2 │ │ │ └── app3 │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kotlin │ │ │ │ └── tutorial │ │ │ │ └── dagger2 │ │ │ │ └── app3 │ │ │ │ ├── activity │ │ │ │ ├── Demo4ComponentDependenciesActivity.kt │ │ │ │ ├── Demo4ModuleIncludeActivity.kt │ │ │ │ └── MainActivity.kt │ │ │ │ ├── di │ │ │ │ ├── component │ │ │ │ │ ├── AddressComponent1.kt │ │ │ │ │ ├── AddressComponent2.kt │ │ │ │ │ └── StreetComponent2.kt │ │ │ │ └── module │ │ │ │ │ ├── AddressModule1.kt │ │ │ │ │ └── StreetModule.kt │ │ │ │ └── domain │ │ │ │ ├── Address.kt │ │ │ │ └── Street.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── ic_launcher_background.xml │ │ │ └── textview_border.xml │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.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 │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kotlin │ │ └── tutorial │ │ └── dagger2 │ │ └── app3 │ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── LICENSE ├── README.md ├── Retrofit ├── .gitignore ├── app1 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── retrofit │ │ │ └── app1 │ │ │ ├── activity │ │ │ └── MainActivity.kt │ │ │ ├── api │ │ │ └── APIService.kt │ │ │ ├── http │ │ │ └── RetrofitManager.kt │ │ │ └── model │ │ │ └── UserEventModel.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── app2 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kotlin │ │ │ └── tutorial │ │ │ └── retrofit │ │ │ └── app2 │ │ │ ├── activity │ │ │ └── MainActivity.kt │ │ │ ├── api │ │ │ └── APIService.kt │ │ │ ├── config │ │ │ └── Constant.kt │ │ │ ├── http │ │ │ └── RetrofitManager.kt │ │ │ └── model │ │ │ ├── PM25Model.kt │ │ │ ├── SO2Model.kt │ │ │ └── ZipObject.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle └── images └── content.png /AAC/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /AAC/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /AAC/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | apply plugin: 'kotlin-kapt' 5 | 6 | android { 7 | compileSdkVersion 28 8 | defaultConfig { 9 | applicationId "com.kotlin.tutorial.aac" 10 | minSdkVersion 15 11 | targetSdkVersion 28 12 | versionCode 1 13 | versionName "1.0" 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | implementation fileTree(dir: 'libs', include: ['*.jar']) 26 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 27 | implementation 'androidx.appcompat:appcompat:1.1.0' 28 | implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0" 29 | implementation "androidx.lifecycle:lifecycle-extensions:2.1.0" 30 | 31 | implementation "androidx.room:room-runtime:2.2.1" 32 | kapt "androidx.room:room-compiler:2.2.1" 33 | 34 | testImplementation 'junit:junit:4.12' 35 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 36 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 37 | } 38 | 39 | repositories { 40 | mavenCentral() 41 | } 42 | -------------------------------------------------------------------------------- /AAC/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 | -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity1.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.kotlin.tutorial.aac.lifecycle.LifeCycleListener 6 | 7 | /** 8 | * 9 | * @FileName: 10 | * com.kotlin.tutorial.aac.activity.Activity1 11 | * @author: Tony Shen 12 | * @date: 2018-10-09 00:13 13 | * @version: V1.0 <描述当前版本功能> 14 | */ 15 | class Activity1: AppCompatActivity() { 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | 20 | lifecycle.addObserver(LifeCycleListener()) 21 | } 22 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity2.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | import android.app.Activity 4 | import android.os.Bundle 5 | import androidx.lifecycle.Lifecycle 6 | import androidx.lifecycle.LifecycleOwner 7 | import androidx.lifecycle.LifecycleRegistry 8 | import com.kotlin.tutorial.aac.lifecycle.LifeCycleListener 9 | 10 | 11 | /** 12 | * 13 | * @FileName: 14 | * com.kotlin.tutorial.aac.activity.Activity2 15 | * @author: Tony Shen 16 | * @date: 2018-10-09 00:20 17 | * @version: V1.0 <描述当前版本功能> 18 | */ 19 | class Activity2: Activity(), LifecycleOwner { 20 | 21 | private lateinit var mLifecycleRegistry: LifecycleRegistry 22 | 23 | override fun onCreate(savedInstanceState: Bundle?) { 24 | super.onCreate(savedInstanceState) 25 | 26 | mLifecycleRegistry = LifecycleRegistry(this) 27 | mLifecycleRegistry.markState(Lifecycle.State.CREATED) 28 | getLifecycle().addObserver(LifeCycleListener()) 29 | } 30 | 31 | override fun getLifecycle(): Lifecycle = mLifecycleRegistry 32 | 33 | @Override 34 | override fun onStart() { 35 | super.onStart(); 36 | mLifecycleRegistry.markState(Lifecycle.State.STARTED); 37 | } 38 | 39 | @Override 40 | override fun onResume() { 41 | super.onResume(); 42 | mLifecycleRegistry.markState(Lifecycle.State.RESUMED); 43 | } 44 | 45 | @Override 46 | override fun onDestroy() { 47 | super.onDestroy(); 48 | mLifecycleRegistry.markState(Lifecycle.State.DESTROYED); 49 | } 50 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity3.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | import android.os.Bundle 4 | import android.util.Log 5 | import androidx.appcompat.app.AppCompatActivity 6 | import androidx.lifecycle.Observer 7 | import com.kotlin.tutorial.aac.R 8 | import com.kotlin.tutorial.aac.livedata.MyLiveData 9 | import kotlinx.android.synthetic.main.activity_3.* 10 | import java.util.concurrent.atomic.AtomicInteger 11 | 12 | 13 | /** 14 | * 15 | * @FileName: 16 | * com.kotlin.tutorial.aac.activity.Activity3 17 | * @author: Tony Shen 18 | * @date: 2019-03-01 14:00 19 | * @version: V1.0 <描述当前版本功能> 20 | */ 21 | class Activity3: AppCompatActivity() { 22 | 23 | var data = MyLiveData() 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | setContentView(R.layout.activity_3) 28 | 29 | text.setOnClickListener { 30 | 31 | data.updateValue(data.atomicInteger) 32 | } 33 | 34 | data.observe(this, Observer { t -> 35 | text.text = "点击次数:$t" //更新控件中的数据 36 | Log.d(TAG, "数据改变...$t") 37 | }) 38 | 39 | } 40 | 41 | companion object { 42 | private val TAG = Activity3::class.java.simpleName 43 | } 44 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity4.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | 4 | import android.os.Bundle 5 | import android.view.View 6 | import android.widget.ArrayAdapter 7 | import androidx.appcompat.app.AppCompatActivity 8 | import androidx.lifecycle.Observer 9 | import androidx.lifecycle.ViewModelProviders 10 | import com.kotlin.tutorial.aac.R 11 | import com.kotlin.tutorial.aac.viewmodel.FruitViewModel 12 | import kotlinx.android.synthetic.main.activity_4.* 13 | 14 | /** 15 | * 16 | * @FileName: 17 | * com.kotlin.tutorial.aac.activity.Activity4 18 | * @author: Tony Shen 19 | * @date: 2019-11-09 11:53 20 | * @version: V1.0 <描述当前版本功能> 21 | */ 22 | class Activity4: AppCompatActivity() { 23 | 24 | override fun onCreate(savedInstanceState: Bundle?) { 25 | super.onCreate(savedInstanceState) 26 | setContentView(R.layout.activity_4) 27 | 28 | this.progressbar.visibility = View.VISIBLE 29 | 30 | val viewModel: FruitViewModel = ViewModelProviders.of(this).get(FruitViewModel::class.java) 31 | 32 | viewModel.getFruitList().observe(this, Observer { 33 | 34 | var adapter: ArrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,it) 35 | this.listView.adapter = adapter 36 | this.progressbar.visibility = View.INVISIBLE 37 | }) 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity5.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.widget.ArrayAdapter 6 | import androidx.appcompat.app.AppCompatActivity 7 | import androidx.lifecycle.Observer 8 | import com.kotlin.tutorial.aac.R 9 | import com.kotlin.tutorial.aac.delegate.viewModelDelegate 10 | import com.kotlin.tutorial.aac.viewmodel.FruitViewModel 11 | import kotlinx.android.synthetic.main.activity_4.* 12 | 13 | /** 14 | * 15 | * @FileName: 16 | * com.kotlin.tutorial.aac.activity.Activity5 17 | * @author: Tony Shen 18 | * @date: 2019-11-09 12:46 19 | * @version: V1.0 <描述当前版本功能> 20 | */ 21 | class Activity5: AppCompatActivity() { 22 | 23 | private val viewModel by viewModelDelegate(FruitViewModel::class) 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | setContentView(R.layout.activity_4) 28 | 29 | this.progressbar.visibility = View.VISIBLE 30 | 31 | viewModel.getFruitList().observe(this, Observer { 32 | 33 | var adapter: ArrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,it) 34 | this.listView.adapter = adapter 35 | this.progressbar.visibility = View.INVISIBLE 36 | }) 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/activity/Activity7.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.activity 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.kotlin.tutorial.aac.R 6 | import com.kotlin.tutorial.aac.fragment.Fragment1 7 | import com.kotlin.tutorial.aac.fragment.Fragment2 8 | 9 | /** 10 | * 11 | * @FileName: 12 | * com.kotlin.tutorial.aac.activity.Activity7 13 | * @author: Tony Shen 14 | * @date: 2019-11-10 22:14 15 | * @version: V1.0 <描述当前版本功能> 16 | */ 17 | class Activity7: AppCompatActivity() { 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.activity_7) 22 | 23 | supportFragmentManager.beginTransaction() 24 | .add(R.id.frame1, Fragment1()) 25 | .add(R.id.frame2, Fragment2()) 26 | .commit() 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/db/User.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.db 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | /** 7 | * 8 | * @FileName: 9 | * com.kotlin.tutorial.aac.db.User 10 | * @author: Tony Shen 11 | * @date: 2019-11-09 16:32 12 | * @version: V1.0 <描述当前版本功能> 13 | */ 14 | @Entity(tableName = "users") 15 | data class User(val name: String) { 16 | 17 | @PrimaryKey(autoGenerate = true) 18 | var id: Long = 0 19 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/db/UserDao.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.db 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.room.Dao 5 | import androidx.room.Insert 6 | import androidx.room.Query 7 | 8 | /** 9 | * 10 | * @FileName: 11 | * com.kotlin.tutorial.aac.db.UserDao 12 | * @author: Tony Shen 13 | * @date: 2019-11-09 16:35 14 | * @version: V1.0 <描述当前版本功能> 15 | */ 16 | @Dao 17 | interface UserDao { 18 | 19 | @Insert 20 | fun insert(obj: User): Long 21 | 22 | @Query("SELECT * FROM users") 23 | fun getAll(): LiveData> 24 | 25 | @Query("SELECT Count(*) FROM users") 26 | fun getCount(): Int 27 | 28 | @Query("DELETE FROM users") 29 | fun deleteAll() 30 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/db/UserDatabase.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.db 2 | 3 | import android.content.Context 4 | import androidx.room.Database 5 | import androidx.room.Room 6 | import androidx.room.RoomDatabase 7 | 8 | /** 9 | * 10 | * @FileName: 11 | * com.kotlin.tutorial.aac.db.UserDatabase 12 | * @author: Tony Shen 13 | * @date: 2019-11-09 16:36 14 | * @version: V1.0 <描述当前版本功能> 15 | */ 16 | @Database( 17 | entities = [User::class], 18 | version = 2 19 | ) 20 | abstract class UserDatabase : RoomDatabase() { 21 | 22 | abstract fun userDao(): UserDao 23 | 24 | companion object { 25 | 26 | @Volatile 27 | private var database: UserDatabase? = null 28 | 29 | fun getInstance(context: Context): UserDatabase = 30 | database ?: synchronized(this) { 31 | database ?: buildDatabase(context).also{ database = it } 32 | } 33 | 34 | private fun buildDatabase(context: Context) = 35 | Room.databaseBuilder( 36 | context.applicationContext, 37 | UserDatabase::class.java, "db") 38 | .allowMainThreadQueries() 39 | .build() 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/fragment/Fragment1.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.fragment 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.Observer 9 | import com.kotlin.tutorial.aac.R 10 | import com.kotlin.tutorial.aac.delegate.viewModelDelegate 11 | import com.kotlin.tutorial.aac.viewmodel.SharedViewModel 12 | import kotlinx.android.synthetic.main.fragment_1.* 13 | import kotlinx.android.synthetic.main.fragment_1.view.* 14 | 15 | /** 16 | * 17 | * @FileName: 18 | * com.kotlin.tutorial.aac.fragment.Fragment1 19 | * @author: Tony Shen 20 | * @date: 2019-11-10 22:20 21 | * @version: V1.0 <描述当前版本功能> 22 | */ 23 | class Fragment1 : Fragment() { 24 | 25 | private val viewModel by viewModelDelegate(SharedViewModel::class) 26 | 27 | override fun onCreateView( 28 | inflater: LayoutInflater, container: ViewGroup?, 29 | savedInstanceState: Bundle? 30 | ): View? { 31 | val v = inflater.inflate(R.layout.fragment_1, container, false) 32 | 33 | v.button.setOnClickListener { 34 | viewModel.setText(edit.text.toString()) 35 | } 36 | 37 | return v 38 | } 39 | 40 | override fun onActivityCreated(savedInstanceState: Bundle?) { 41 | super.onActivityCreated(savedInstanceState) 42 | 43 | viewModel.getText().observe(viewLifecycleOwner, Observer { 44 | text -> edit.setText(text) 45 | }) 46 | } 47 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/fragment/Fragment2.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.fragment 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.Observer 9 | import com.kotlin.tutorial.aac.R 10 | import com.kotlin.tutorial.aac.delegate.viewModelDelegate 11 | import com.kotlin.tutorial.aac.viewmodel.SharedViewModel 12 | import kotlinx.android.synthetic.main.fragment_2.* 13 | import kotlinx.android.synthetic.main.fragment_2.view.* 14 | 15 | /** 16 | * 17 | * @FileName: 18 | * com.kotlin.tutorial.aac.fragment.Fragment2 19 | * @author: Tony Shen 20 | * @date: 2019-11-10 22:26 21 | * @version: V1.0 <描述当前版本功能> 22 | */ 23 | class Fragment2 : Fragment() { 24 | 25 | private val viewModel by viewModelDelegate(SharedViewModel::class) 26 | 27 | override fun onCreateView( 28 | inflater: LayoutInflater, container: ViewGroup?, 29 | savedInstanceState: Bundle? 30 | ): View? { 31 | val v = inflater.inflate(R.layout.fragment_2, container, false) 32 | 33 | v.button.setOnClickListener { 34 | viewModel.setText(edit.text.toString()) 35 | } 36 | 37 | return v 38 | } 39 | 40 | override fun onActivityCreated(savedInstanceState: Bundle?) { 41 | super.onActivityCreated(savedInstanceState) 42 | 43 | viewModel.getText().observe(viewLifecycleOwner, Observer { 44 | text -> edit.setText(text) 45 | }) 46 | } 47 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/lifecycle/LifeCycleListener.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.lifecycle 2 | 3 | import android.util.Log 4 | import androidx.lifecycle.Lifecycle 5 | import androidx.lifecycle.LifecycleObserver 6 | import androidx.lifecycle.OnLifecycleEvent 7 | 8 | 9 | /** 10 | * 11 | * @FileName: 12 | * com.kotlin.tutorial.aac.lifecycle.LifeCycleListener 13 | * @author: Tony Shen 14 | * @date: 2018-10-08 16:39 15 | * @version: V1.0 <描述当前版本功能> 16 | */ 17 | class LifeCycleListener : LifecycleObserver { 18 | 19 | @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 20 | fun onCreate() { 21 | Log.d(TAG, "onCreate") 22 | } 23 | 24 | @OnLifecycleEvent(Lifecycle.Event.ON_START) 25 | fun onStart() { 26 | Log.d(TAG, "onStart") 27 | } 28 | 29 | @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 30 | fun onResume() { 31 | Log.d(TAG, "onResume") 32 | } 33 | 34 | @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 35 | fun onPause() { 36 | Log.d(TAG, "onPause") 37 | } 38 | 39 | @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 40 | fun onStop() { 41 | Log.d(TAG, "onStop") 42 | } 43 | 44 | @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 45 | fun onDestroy() { 46 | Log.d(TAG, "onDestroy") 47 | } 48 | 49 | @OnLifecycleEvent(Lifecycle.Event.ON_ANY) 50 | fun onAny() { 51 | Log.d(TAG, "onAny") 52 | } 53 | 54 | companion object { 55 | private val TAG = LifeCycleListener::class.java.simpleName 56 | } 57 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/livedata/MyLiveData.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.livedata 2 | import android.util.Log 3 | import androidx.lifecycle.LiveData 4 | import java.util.concurrent.atomic.AtomicInteger 5 | 6 | 7 | /** 8 | * 9 | * @FileName: 10 | * com.kotlin.tutorial.aac.livedata.MyLiveData 11 | * @author: Tony Shen 12 | * @date: 2019-11-08 23:06 13 | * @version: V1.0 <描述当前版本功能> 14 | */ 15 | class MyLiveData : LiveData() { 16 | 17 | var atomicInteger:AtomicInteger = AtomicInteger(0) 18 | 19 | override fun onActive() { 20 | super.onActive() 21 | Log.d(TAG, "onActive") 22 | } 23 | 24 | override fun onInactive() { 25 | super.onInactive() 26 | Log.d(TAG, "onInactive") 27 | } 28 | 29 | override fun setValue(value: AtomicInteger?) { 30 | super.setValue(value) 31 | Log.d(TAG, "$value") 32 | } 33 | 34 | fun updateValue(value: AtomicInteger?) { 35 | value?.let { 36 | it.incrementAndGet() 37 | setValue(value) 38 | } 39 | } 40 | 41 | companion object { 42 | private val TAG = MyLiveData::class.java.simpleName 43 | } 44 | } -------------------------------------------------------------------------------- /AAC/app/src/main/java/com/kotlin/tutorial/aac/viewmodel/SharedViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.kotlin.tutorial.aac.viewmodel 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import androidx.lifecycle.ViewModel 5 | 6 | /** 7 | * 8 | * @FileName: 9 | * com.kotlin.tutorial.aac.viewmodel.SharedViewModel 10 | * @author: Tony Shen 11 | * @date: 2019-11-10 22:18 12 | * @version: V1.0 <描述当前版本功能> 13 | */ 14 | class SharedViewModel : ViewModel() { 15 | 16 | private val text : MutableLiveData = MutableLiveData() 17 | 18 | fun setText(input: CharSequence) { 19 | text.value = input 20 | } 21 | 22 | fun getText() = text 23 | } -------------------------------------------------------------------------------- /AAC/app/src/main/res/drawable/textview_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /AAC/app/src/main/res/layout/activity_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | -------------------------------------------------------------------------------- /AAC/app/src/main/res/layout/activity_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 17 | 18 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /AAC/app/src/main/res/layout/activity_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |