全局Context
将Context设置成静态变量很容易会产生内存泄漏的问题,但是applicationContext全局只有一份,生命周期和APP的生命周期一致,所以选择强制忽略。
1 2 3 4 5 6 7 8 9 10 11
| class MyApplication : Application() { companion object { @SuppressLint("StaticFieldLeak") lateinit var context: Context } override fun onCreate() { super.onCreate() context = applicationContext } }
|
还需要设置程序启动的时候应该初始化MyApplication类,而不是Application默认类,在AndroidManifest.xml文件中指定。
Intent传递对象
Serializable方式
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
至于序列化的方法需要让一个类去实现Serializable这个接口。
1 2 3 4 5 6 7 8 9 10 11 12
| class Person : Serializable { var name = "" var age = 0 }
val person = Person() person.name = "Tom" person.age = 20 val intent = Intent(this, SecondActivity::class.java) intent.putExtra("person_data", person) startActivity(intent)
|
取出数据:
1
| val person = intent.getSerializableExtra("person_data") as Person
|
Parcelable方式
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型。
必须重写describeContents()和writeToParcel()这两个方法。
还必须在类中提供一个名为CREATOR的匿名类实现,需要重写 createFromParcel()和newArray()这两个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Person : Parcelable { var name = "" var age = 0 override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(name) parcel.writeInt(age) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Person> { override fun createFromParcel(parcel: Parcel): Person { val person = Person() person.name = parcel.readString() ?: "" person.age = parcel.readInt() return person } override fun newArray(size: Int): Array<Person?> { return arrayOfNulls(size) } } }
|
取出数据:
1
| val person = intent.getParcelableExtra("person_data") as Person
|
Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率会比Parcelable方式低一些,所以在通常情况下,还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。
定制日志工具
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
| object LogUtil { private const val VERBOSE = 1 private const val DEBUG = 2 private const val INFO = 3 private const val WARN = 4 private const val ERROR = 5 private var level = VERBOSE fun v(tag: String, msg: String) { if (level <= VERBOSE) { Log.v(tag, msg) } } fun d(tag: String, msg: String) { if (level <= DEBUG) { Log.d(tag, msg) } } fun i(tag: String, msg: String) { if (level <= INFO) { Log.i(tag, msg) } } fun w(tag: String, msg: String) { if (level <= WARN) { Log.w(tag, msg) } } fun e(tag: String, msg: String) { if (level <= ERROR) { Log.e(tag, msg) } } }
|
这样可以通过调整源码的方式,随时使能或者失能日志调试。
调试代码
方法一就是从头到尾运行,打断点调试,不赘述。
方式二是运行到某一页面,中途进入调试模式,使用Attach Debugger to Android Process功能即可。
深色主题
Force Dark
Force Dark就是这样一种简单粗暴的转换方式,并且它的转换效果通常是不尽如人意的。
右击res目录→New→Directory,创建一个values-v29目录,然后右击values-v29目录→New→Values resource file,创建一个styles.xml文件:
1 2 3 4 5 6 7 8
| <resources> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:forceDarkAllowed">true</item> </style> </resources>
|
values-v29目录是只有Android 10.0及以上的系统才会去读取的,因此这是一种系统差异型编程的实现方式。
DayNight
更改values/styles.xml中的代码:
1 2 3 4 5 6 7 8 9 10
| <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> ... </resources>
|
右击res目录 →New→Directory,创建一个values-night目录,然后右击values-night目录→New→Values resource file,创建一个colors.xml文件。接着在这个文件中指定深色主题下的颜色值:
1 2 3 4 5
| <resources> <color name="colorPrimary">#303030</color> <color name="colorPrimaryDark">#232323</color> <color name="colorAccent">#008577</color> </resources>
|
Kotlin课堂
Java与Kotlin代码之间的转换:
- Java转Kotlin:Java赋值粘贴到kt文件中会自动提示转换,同时也可以使用导航栏中的Code→Convert Java File to Kotlin File功能,进行全项目转换。
- Kotlin转Java:先转化为字节码,在反编译转化为Java,点击Tools→Kotlin→Show Kotlin Bytecode,再点击这个窗口左上角的“Decompile”按钮,就可以将这些Kotlin字节码反编译成Java代码。