知晓自己在哪个Activity的方法:
在你进入一家公司之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是当你需要在某个界面上修改一些非常简单的东西时,却半天找不到这个界面对应的Activity是哪一个。
解决办法为:创建一个BaseActivity类,让他继承AppCompatActivity类,然后让其它的Activity继承
BaseActivity类,代码如下:
class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
Log.d("BaseActivity", javaClass.simpleName)
}
}
Kotlin中的javaClass表示:获取当前实例的Class对象,相当于在Java中调用getClass()方法;
Kotlin中的BaseActivity::class.java表示获取BaseActivity类的Class对象,相当于在Java中调用BaseActivity.class。
在上述代码中,我们先是获取了当前实例的Class对象,然后再调用simpleName获取当前实例的类名。
这样在打开一个新的Activity会自动打印日志,获取当前实例的Class对象,再通过simpleName获取当前实例的类型!!!
随时随地退出程序实现方法:
当我们在ThirdActivity时,想退出程序,需要三次back操作,影响用户体验,Home键是把程序挂起,并不是退出,当我们需要随时能退出程序时,需要一个方案。
方案很简单,只需要使用一个集合对所有的Activity进行管理即可,当要退出时,直接遍历集合,关掉所有的Activity即可。
如果所有的Activity只需要一个集合,可以创建一个单例类来保存所有的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) {
if (!activity.isFinishing) {
activity.finish()
}
}
activities.clear()
}
}
添加了addActivity() removeActivity() 以及 finishAll() 函数,可以在创建、删除Activity时,向集合内添加元素,调用finishAll()直接通过遍历集合关闭所有Activity。这里进行了一个if判断,主要是用来判断当前Activity是否正在被销毁,因为有的Activity可能处于停止状态,自动被销毁!如果没有被销毁,则进行销毁。
修改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)
}
}
重写了onCreate函数,当每一次调用onCreate时,会调用ActivityCollector 中的 addActivity函数,将类添加进集合。
并重写了onDestroy函数,因为Activity处于不可见状态,即停止状态时,如果内存不足,会自动被回收,如果自动被回收,则直接调用ActivityCollector中的removeActivity,自动释放Activity。
此时,如果我们想在任何Activity中直接退出程序,可以直接调用ActivityCollector的finishAll函数,自动释放所有Activity,从而关闭程序,我们此时在ThirdActivity中的按钮上实现这个功能。
代码如下:
class ThirdActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.third_layout)
val btn3: Button = findViewById(R.id.button3)
btn3.setOnClickListener {
ActivityCollector.finishAll()
}
}
}
此时,点击按钮,即可退出程序。
退出程序后,该程序仍然会在后台有一个进程,可以在关闭Activity后,添加如下代码,直接一并杀死进程:
android.os.Process.killProcess(android.os.Process.myPid())
killProcess()方法用于杀掉一个进程,它接收一个进程id参数,我们可以通过myPid()方法来获得当前程序的进程id。需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。