Android应用开发:Activity(5)

目录

8、Activity 的最佳实践

(1)知晓当前是在哪一个 Activity

(2)随时随地退出程序

(3)启动 Activity 的最佳写法


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")
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值