三個關於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")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章