• Activity的最佳实践


    Activity的最佳实践

    知晓当前是在哪一个Activiy

    • 创建一个BaseActivity类,继承AppCompatActivity类.重写onCreate方法
    open class BaseActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            //Kotlin当中的javaClass表示获取当前实例的Class对象,相当于在java当中调用getClass()方法
            //而Kotlin当中的BaseActivity::class.java表示获取BaseActivity类的Class对象,相当于java当中的BaseActivity.class
            //javaClass.simpleName 表示获取当前实例的对象然后调用simpleName获取当前实例的类名
            Log.d("BaseActivity", javaClass.simpleName)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 修改FirstActivity等的代码,让他们不再继承AppCompatActivity而是继承自BaseAvtivity
    • 记住要想让自己能够被别人所继承,要在class前面加上open关键字
    • 运行项目代码依次点击按钮进入相应的Activity,观察日志输出,现在我们每当进入一个Activity的界面,该Activity的类名就会被打印出来了,这样我们就能够知道当前的界面是哪一个Activity了
      在这里插入图片描述

    随时随地退出程序

    • 创建一个单例类,用来管理所有的activity
    package com.zb.activitytest.util
    
    import android.app.Activity
    
    /**
     * 单例类,专门用来管理所有的Activity
     */
    object ActivityCollector {
        //创建一个ArrayList集合,用来存放所有的Activity
        private val activities = ArrayList<Activity>()
    
        //往集合当中添加Activity的方法
        fun addActivity(activity: Activity) {
            activities.add(activity)
        }
    
        //删除集合当中的Activity的方法
        fun removeActivity(activity: Activity) {
            activities.remove(activity)
        }
    
        //销毁所有的Activity的方法
        fun finishAll() {
            //遍历集合
            for (activity in activities) {
                //判断当前activity是否是正在销毁的状态
                if (!activity.isFinishing) {
                    //如果不是正在销毁的阶段,那么我们就调用activity的finish方法,将其进行销毁
                    activity.finish()
                }
            }
            activities.clear()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 修改BaseActivity中的代码
    open class BaseActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            //Kotlin当中的javaClass表示获取当前实例的Class对象,相当于在java当中调用getClass()方法
            //而Kotlin当中的BaseActivity::class.java表示获取BaseActivity类的Class对象,相当于java当中的BaseActivity.class
            //javaClass.simpleName 表示获取当前实例的对象然后调用simpleName获取当前实例的类名
            Log.d("BaseActivity", javaClass.simpleName)
            
            //当回调onCreate()方法的时候,应该往集合当中添加当前activity的实例
            ActivityCollector.addActivity(this)
        }
    
        override fun onDestroy() {
            super.onDestroy()
            //当回调onDestroy()方法的时候,应该删除集合当中的activity实例
            ActivityCollector.removeActivity(this)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 以后不论在程序的哪个位置,想要直接退出程序的话,只需要调用ActivityCollector.finishAll()方法即可
    • 当然还可以在销毁Activity的代码后面加上杀掉当前进程的代码,以保证程序可以完全的退出
    //杀死当前进程
    android.os.Process.killProcess(android.os.Process.myPid())
    
    • 1
    • 2

    启动Activity的最佳写法

    • 在自己的Activity中定义一个actionStart()方法,在里面包装自己需要的参数
    • 例如SecondActivity中写一个actionStart()方法
        /**
         * activity的最佳启动方式,方便告知别的activity(想要启动本activity)在启动activity时需要传递的数据是什么
         */
        companion object {
            fun actionStart(context: Context, data1: String, data2: String) {
                val intent = Intent(context, SecondActivity::class.java)
                intent.putExtra("data1", data1)
                intent.putExtra("data2", data2)
                context.startActivity(intent)
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • FirstActivity在跳转到SecondActivity的时候就知道自己要给对方传递什么数据了,而且这种方式启动activity只需要一行代码即可
    SecondActivity.actionStart(this, "1111", "2222")
    
    • 1
  • 相关阅读:
    cesium态势标会(面积测量 ---- 不可修改)
    视频号视频怎么保存?教你三种方法
    CMakeList 编写示例
    yii1 使用memcache 缓存不更新、过期时间不生效
    数据挖掘知识点整理(期末复习版)
    VSCode自定义闪烁光标
    【Linux】系统中安装Go环境
    金仓数据库KingbaseES客户端编程接口指南-JDBC(4. JDBC 创建语句对象)
    牛客网SQL基础强化
    突破编程_C++_设计模式(简单工厂模式)
  • 原文地址:https://blog.csdn.net/weixin_45809829/article/details/128019394