三个关于Activity的小技巧-android-kotlin

根据当前界面判断是哪一个Activity

比如说我们有两个界面:FirstActivitySecondActivity
默认情况下这两个类继承于AppCompatActivity父类

要想实现这个功能,我们只需要再创建一个普通的类BaseActivity用来打印当前实例的类名
然后实现下图的继承关系:

具体实现:

重写BaseActivityonCreate()方法:

//为了使BaseActivity可以被继承,需要在类名前加上open关键字
open class BaseActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //打印当前Activity的类名
        Log.d("BaseActivity",javaClass.simpleName)
    }
}

javaClass表示获取当前实例的Class对象,javaClass.simpleName表示获取当前实例的类名

然后让BaseActivity成为FirstActivitySecondActivity的父类

class FirstActivity : BaseActivity() {
    //.............
}
class SecondActivity : BaseActivity() {
    //.............
}

由于在调用子类时,也会调用父类的onCreate()方法,所以BaseActivity才可以打印其子类的类名

随时随地退出程序

想实现这个功能,只需要用一个专门的集合对所有的Activity进行管理。
创建一个单例类ActivityCollector

object ActivityCollector {
    //创建一个用来暂存Activity的集合
    private val activities = ArrayList<Activity>()
    //将Activity实例添加到集合中
    fun addActivity(activity:Activity){
        activities.add(activity)
    }
    //将Activity从集合中移除
    fun removeActivity(activity: Activity){
        activities.remove(activity)
    }
    //终止程序
    fun finishAll(){
        for(activity in activities){
            //检查是否正在被销毁中
            if(!activity.isFinishing){
                activity.finish()
            }
        }
        activities.clear()
    }
}

只需在其他Activity中调用这个单例类即可

class FirstActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_layout)
        //将当前实例添加到集合中
        ActivityCollector.addActivity(this)
    }

    override fun onDestroy() {
        super.onDestroy()
        //在销毁时将当前实例从集合中删除
        ActivityCollector.removeActivity(this)
    }

    button.setOnClickListener{
        //点击此按钮后即销毁程序 
        ActivityCollector.finishAll()
    }
}

启动Activity的最佳方式

如果在项目交接时,别人不知道启动SecondActivity需要传递哪些数据,就需要做如下改动
修改SecondActivity中的代码:

class SecondActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.secomd_layout)
    }
    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.startActivities(intent)
        }
    }
}

这样的话就可以简化启动SecondActivity的代码,还可以解决上面的问题:

button.setOnClickListener{
    SecondActivity.actionStart(this,"data1","data2")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章