目录
8、Activity 的最佳实践
(1)知晓当前是在哪一个 Activity
①新建一个 BaseActivity 类
右击 com.example.activitytest 包 --> New --> Kotlin File/Class,在弹出的窗口中输入 BaseActivity,创建类型选择 Class
② 让 BaseActivity 继承自 AppCompatActivity,并重写 onCreate( ) 方法
/* 为了使 BaseActivity 可以被继承,
成为 ActivityTest 项目中所有 Activity 的父类,
在类名前面加上 open 关键字
*/
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 打印当前实例的类名
// 获取当前实例的 Class 对象,再调用simpleName 获取当前实例的类名
Log.d("BaseActivity",javaClass.simpleName)
}
}
Kotlin 中的 javaClass 表示获取当前实例的 Class 对象,相当于在 Java 中调用 getClass( ) 方法;而 Kotlin 中的 BaseActivity::class.java 表示获取 BaseActivity 类的 Class 对象,相对于在 java 中调用 BaseActivity.class.
③ 修改 FirstActivity、SecondActivity、ThirdActivity 的继承结构,不再继承 自 AppCompatActivity,而是继承自 BaseActivity 。
④ 重新运行程序,点击按钮分别进入 FirstActivity、SecondActivity、ThirdActivity的界面,观察 Logcat 中的打印信息
(2)随时随地退出程序
停留在 ThirdActivity ,那么退出去需要连按三次 Back 键。按 Home 键只是把程序挂起,并没有退出程序。如果程序需要注销或者退出的功能该怎么办?用一个专门的集合对所有的 Activity 进行管理就可以了。
① 新建一个单例类 ActivityCollector 作为 Activity 的集合
使用单例类是因为全局只需要一个 Activity 集合
object ActivityCollector {
private val activities = ArrayList<Activity>()
fun addActivity(activity: Activity){
activities.add(activity)
}
fun removeActivity(activity:Activity){
activities.remove(activity)
}
// 将 ArrayList 中存储的 Activity 全部销毁
fun finishAll(){
for (activity in activities){
// 销毁 Activity 之前需要判断 Activity 是否正在销毁中
if(!activity.isFinishing){
activity.finish()
}
}
activities.clear()
}
}
② 修改 BaseActivity 中的代码
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 打印当前实例的类名
// 获取当前实例的 Class 对象,再调用simpleName 获取当前实例的类名
Log.d("BaseActivity",javaClass.simpleName)
// 将正在创建的 Activity 添加到集合
ActivityCollector.addActivity(this)
}
override fun onDestroy() {
super.onDestroy()
// 表示从集合里移除一个马上要销毁的 Activity
ActivityCollector.removeActivity(this)
}
}
③ 不管在哪里退出程序,只需要调用 ActivityCollector.finishAll( ) 方法就可以了
还可以在销毁所有 Activity 的代码后面再加上杀掉当前进程的代码,以保证程序完全退出
android.os.Process.killProcess(android.os.Process.myPid())
killProcess( ) 方法用于杀掉一个进程,接受一个进程id 参数,可以通过 myPid( ) 方法来获得当前程序的进程 id。killProcess( ) 方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。
(3)启动 Activity 的最佳写法
SecondActivity 需要两个非常重要的字符串参数,在启动 SecondActivity 的时候必须传递过来,
val intent = Intent(this,SecondActivity::class.java)
intent.putExtra("param1","data1")
intert.putExtra("param2","data2")
startActivity(intent)
但如果 SecondActivity 不是自己开发的,可能不清楚启动 SecondActivity 需要哪些数据,可以换成以下的写法,修改 SecondActivity 中的代码。
companion object{
fun actionStart(context:Context,data1:String,data2:String){
val intent = Intent(context,SecondActivity::class.java)
intent.putExtra("param1",data1)
intent.putExtra("param1",data2)
context.startActivity(intent)
}
}
所有定义在 companion object 中的方法都可以使用类似于 java 静态方法的形式调用。
现在可以清楚的知道启动 SecondActivity 需要传递哪些数据,同时也简化了启动 Activity 的代码,只需要一行代码就可以启动 SecondActivity
button1.setOnClickListner{
SecondActivity.actionStart(this,"data1","data2")
}