【Kotlin安卓开发】随时随地的退出程序

    科技2025-11-11  11

    随时随地的退出程序

    如果从初始界面跳转了很多个内嵌页面,你会发现退出当前程序会非常不方便,不要点击很多次back(点击home之后程序也只为挂起状态);或者需要设置退出当前程序的按钮,这就需要设置一个专门的集合对Activity进行管理。

    一、创建ActivityCollector集合

    新建一个ActivityCollector作为Activity的集合,注意本类不需要在AndroidManifest.xml中注册。

    object ActivityCollector { //注意这里是object不是class private val activities = ArrayList<Activity>() //创建一个单例类 // 用于在ArrayList中添加Activity fun addActivity(activity: Activity){ activities.add(activity) } // 用于在ArrayList中移除Activity fun removeActivity(activity: Activity){ activities.remove(activity) } // 用于将存储在ArrayList的Activity全部移除 fun finishAll() { for (activity in activities){ if (!activity.isFinishing){ activity.finish() } } activities.clear() } }

    二、修改BaseActivity

    前面一片文章中,创建了BaseActivity主要用于被Activity继承用于显示当前的Activity,现在也在BaseActivity添加ArrayList的addActivity()、removeActivity()等信息。

    open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //用于显示当前Activity Log.d("BaseActivity", javaClass.simpleName) //用于添加当前Activity到activities的List中:用于可以随时随地的退出程序 ActivityCollector.addActivity(this) } override fun onDestroy() { super.onDestroy() //用于删除当前Activity到activities的List中:用于可以随时随地的退出程序 ActivityCollector.removeActivity(this) } }

    三、调用finishAll()方法

    本实例用于在页面中创建一个按钮用于退出程序,代码如下

    class ThirdActivity : BaseActivity() {//将继承AppCompatActivity()修改为BaseActivity()可以显示当前Activity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.third_layout) Log.d("ThirdActivity", "Task id is $taskId: ") button3.setOnClickListener { ActivityCollector.finishAll() //退出当前程序 android.os.Process.killProcess(android.os.Process.myPid()) } } }

    当然也可以在销毁所有Activity之后杀掉当前进程,以保证的当前程序完全退出。

    android.os.Process.killProcess(android.os.Process.myPid())

    killProcess()方法用于杀掉一个进程,接受一个id参数,可以通过myPid()获取当前进程的id。

    另外:在退出程序前添加对话框确认信息

    class ThirdActivity : BaseActivity() {//将继承AppCompatActivity()修改为BaseActivity()可以显示当前Activity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.third_layout) Log.d("ThirdActivity", "Task id is $taskId: ") button3.setOnClickListener { AlertDialog.Builder(this) .setMessage("您确定要退出吗?") .setTitle("退出当前程序") .setPositiveButton("确定", DialogInterface.OnClickListener { dialogInterface, i -> Toast.makeText(this,"退出成功",Toast.LENGTH_LONG).show() // 退出所有进程的代码 ActivityCollector.finishAll() android.os.Process.killProcess(android.os.Process.myPid()) }) .setNeutralButton("取消", null) .create() .show() } } }

    以上代码又可以通过调用一个apply方法实现

    button4.setOnClickListener { AlertDialog.Builder(this).apply { setTitle("您确定要退出吗?") setMessage("退出当前程序") setCancelable(false) setPositiveButton("确定") { dialog, which -> //退出所有进程的代码 ActivityCollector.finishAll() android.os.Process.killProcess(android.os.Process.myPid()) } setNegativeButton("取消") { dialog, which -> } show() } }

    以上是直接在button.setOnClickListener {…}内书写提示代码,也可以用另外一种形式实现。

    具体是继承View.OnClickListener类,再重写onClick()方法

    class SecondActivity : BaseActivity(),View.OnClickListener {} // 备注这里的BaseActivity()等价于AppCompatActivity() override fun onCreate(savedInstanceState: Bundle?) { ... button5.setOnClickListener(this) ... } /* 创建本类是用于判断当前是那个Activity 工作中常用:因为有可能其他的Activity是由其他人编写 - 这个类不需要注册 - 注意要开启继承模式 */ open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 用于显示当前Activity Log.d("BaseActivity", javaClass.simpleName) // 用于添加当前Activity到activities的List中:用于可以随时随地的退出程序 ActivityCollector.addActivity(this) } override fun onDestroy() { super.onDestroy() // 用于删除当前Activity到activities的List中:用于可以随时随地的退出程序 ActivityCollector.removeActivity(this) } }

    特别注意的是:如果以这种方法实现的话,要在onCreate()中添加

    button5.setOnClickListener(this)
    Processed: 0.017, SQL: 8