安卓开发学习笔记_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") 

参考

郭霖. 《第一行代码 Android 第3版》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y_cen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值