安卓开发学习笔记_Activity_Activity的最佳实践
知晓当前是在哪一个Activity
在ActivityTest项目的基础上修改,首先需要新建一个BaseActivity类。右击com.example.activitytest包→New→Kotlin File/Class,在弹出的窗口中输入BaseActivity,创建类型选择Class.
BaseActivity的代码如下:
// 让BaseActivity成为Activity项目中所有Activity的父类,
open class BaseActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Kotlin中的javaClass表示获取当前实例的Class对象, 相当于java中调用getClass()方法'
// Kotlin的BaseActivity::class.java表示获取BaseActivity类的Class对象, 相当于在java中调用BaseActivity.class
// simpleName获取类名
Log.d("BaseActivity", javaClass.simpleName)
}
}
分别进入三个Activity, 打印如下:
随时随地退出程序
新建一个单例类ActivityCollector作为Activity的集合, 代码如下:
object ActivityCollector {
private val activities = ArrayList<Activity>()
fun addActivity(activity: Activity){
activities.add(activity)
}
fun removeActivity(activity: Activity) {
activities.remove(activity)
}
fun finishAll()
{
for (activity in activities) {
// 在销毁Activity之前, 调用activity.isFinishing来判断Activity是否在销毁中
// 因为Activity还可能通过按下Back键等方式被销毁
if(!activity.isFinishing){
activity.finish()
}
}
activities.clear()
}
}
再修改BaseActivity中的代码如下:
open class BaseActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseActivity", javaClass.simpleName)
ActivityCollector.addActivity(this)
}
override fun onDestroy() {
super.onDestroy()
ActivityCollector.removeActivity(this)
}
}
在ThirdActivity中添加按钮实现退出程序, 代码如下:
binding.button4.setOnClickListener {
ActivityCollector.finishAll()
}
还可以在销毁所有Activity的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示:
binding.button4.setOnClickListener {
ActivityCollector.finishAll()
// 杀掉当前进程, 接收一个进程id参数, 通过muPid()方法获取当前程序的进程id
// killProcess()方法只能杀掉当前程序的进程, 不能杀掉其他程序
android.os.Process.killProcess(android.os.Process.myPid())
}
启动Activity地最佳写法
假设SecondActivity需要用到两个重要的字符串参数, 容易写出如下代码:
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("param1", "data1")
intent.putExtra("param2", "data2")
startActivity(intent)
但是这样不清楚要传递哪些数据.
我们可以通过修改SecondActivity的代码, 解决这个问题, 代码如下:
class SecondActivity : BaseActivity() {
...
companion object{
fun actionStart(context: Context, data1: String, data2: String){
val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("param1", data1)
intent.putExtra("param2", data2)
context.startActivity(intent)
}
}
}
Kotlin规定, 定义在companion object中的方法可以使用类似于Java静态方法的形式调用.
而且现在只需要一行代码就可以启动SecondActivity, 代码如下:
SecondActivity.actionStart(this, "data1", "data2")