1 Activity 的启动模式

启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在|AndroidManifest.xml中通过给标签指定,android: launchMode属性来选择启动模式

1.1 standard

Activity默认的启动模式,在不进行显式指定的情况下,所有Activity都会自动使用这种启动模式。

1.2 singleTop

在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例。不过当Activity并未处于栈顶位置时,再启动Activity还是会创建新的实例的。

1.3 singleTask

每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。

1.4 singleInstance

有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,都共用同一个返回栈,也就解决了共享Activity实例的问题。(如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)

2 创建BaseActivity类
1
2
3
4
5
6
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseActivity", javaClass.simpleName)
}
}

其它类在继承BaseActivity类,可以在BaseActivity实现一些共有的方法。

3 创建Activity管理工具

新建一个单例类ActivityCollector作为Activity的集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 ()
}
}
4 优雅的启动Activity

使用Kotlin的伴随对象来传递Activity需要传递的参数,在companion object中的方法都可以使用类似于Java静态方法的形式调用

1
2
3
4
5
6
7
8
9
10
11
class SecondActivity : BaseActivity() {
...
companion object {
fun actionStart(context: Context, data1: String, data2: String) {
val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("param1", data1)
intent.putExtra("param2", data2)
context.startActivity(intent)
}
}
}