添加 Activity/Application 生命周期管理

* 关闭所有 Activity
* 应用前后台监听
This commit is contained in:
luyao 2019-08-06 15:36:40 +08:00
parent 9cb5665c61
commit a8d7d271b0
8 changed files with 209 additions and 6 deletions

View File

@ -1,10 +1,14 @@
package luyao.util.ktx.ui
import android.os.Handler
import kotlinx.android.synthetic.main.activity_lifecycle.*
import luyao.ktx.R
import luyao.util.ktx.MainActivity
import luyao.util.ktx.base.BaseActivity
import luyao.util.ktx.ext.loge
import luyao.util.ktx.ext.toast
import luyao.util.ktx.lifecycle.KtxHandler
import luyao.util.ktx.lifecycle.KtxManager
/**
* Created by luyao
@ -19,6 +23,9 @@ class LifeCycleActivity : BaseActivity() {
}
override fun initData() {
currentActivityBt.setOnClickListener { KtxManager.currentActivity?.let { toast(it.localClassName) } }
finishMainBt.setOnClickListener { KtxManager.finishActivity(MainActivity::class.java) }
finishAllBt.setOnClickListener { KtxManager.finishAllActivity() }
}
private val myHandler = KtxHandler(this, Handler.Callback {

View File

@ -4,4 +4,19 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/currentActivityBt"
android:text="currentActivity"
style="@style/NormalButton"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/finishMainBt"
android:text="finishMainActivity"
style="@style/NormalButton"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/finishAllBt"
android:text="finishAllActivity"
style="@style/NormalButton"/>
</LinearLayout>

View File

@ -2,9 +2,8 @@
package="luyao.util.ktx">
<application >
<application>
<provider
android:authorities="${applicationId}.fileprovider"
android:name="androidx.core.content.FileProvider"
@ -14,6 +13,11 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>
<provider
android:authorities="${applicationId}.KtxInstaller"
android:name=".Ktx"
android:exported="false"/>
</application>
</manifest>

View File

@ -0,0 +1,53 @@
package luyao.util.ktx
import android.app.Application
import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import androidx.lifecycle.ProcessLifecycleOwner
import luyao.util.ktx.lifecycle.KtxLifeCycleCallBack
import luyao.util.ktx.lifecycle.KtxLifeObserver
/**
* Created by luyao
* on 2019/8/6 14:22
*/
class Ktx : ContentProvider() {
companion object {
lateinit var app: Application
var watchActivityLife = true
var watchAppLife = true
}
override fun onCreate(): Boolean {
val application = context!!.applicationContext as Application
install(application)
return true
}
private fun install(application: Application) {
app = application
if (watchActivityLife) application.registerActivityLifecycleCallbacks(KtxLifeCycleCallBack())
if (watchAppLife) ProcessLifecycleOwner.get().lifecycle.addObserver(KtxLifeObserver())
}
override fun insert(uri: Uri, values: ContentValues?): Uri? = null
override fun query(
uri: Uri,
projection: Array<String>?,
selection: String?,
selectionArgs: Array<String>?,
sortOrder: String?
): Cursor? = null
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int = 0
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int = 0
override fun getType(uri: Uri): String? = null
}

View File

@ -1,7 +1,6 @@
package luyao.util.ktx.lifecycle
import android.os.Handler
import android.os.Message
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
@ -11,7 +10,7 @@ import androidx.lifecycle.OnLifecycleEvent
* Created by luyao
* on 2019/8/6 9:34
*/
class KtxHandler(lifecycleOwner: LifecycleOwner,callback: Callback) : Handler(callback), LifecycleObserver {
class KtxHandler(lifecycleOwner: LifecycleOwner, callback: Callback) : Handler(callback), LifecycleObserver {
private val mLifecycleOwner: LifecycleOwner = lifecycleOwner

View File

@ -0,0 +1,46 @@
package luyao.util.ktx.lifecycle
import android.app.Activity
import android.app.Application
import android.os.Bundle
import luyao.util.ktx.ext.loge
/**
* Created by luyao
* on 2019/8/6 10:45
*/
class KtxLifeCycleCallBack : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
KtxManager.pushActivity(activity)
"onActivityCreated : ${activity.localClassName}".loge()
}
override fun onActivityStarted(activity: Activity) {
"onActivityStarted : ${activity.localClassName}".loge()
}
override fun onActivityResumed(activity: Activity) {
"onActivityResumed : ${activity.localClassName}".loge()
}
override fun onActivityPaused(activity: Activity) {
"onActivityPaused : ${activity.localClassName}".loge()
}
override fun onActivityDestroyed(activity: Activity) {
"onActivityDestroyed : ${activity.localClassName}".loge()
KtxManager.popActivity(activity)
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
}
override fun onActivityStopped(activity: Activity) {
"onActivityStopped : ${activity.localClassName}".loge()
}
}

View File

@ -0,0 +1,24 @@
package luyao.util.ktx.lifecycle
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import luyao.util.ktx.Ktx
import luyao.util.ktx.ext.toast
/**
* Created by luyao
* on 2019/8/6 15:10
*/
class KtxLifeObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onForeground() {
Ktx.app.toast("应用进入前台")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onBackground() {
Ktx.app.toast("应用进入后台")
}
}

View File

@ -0,0 +1,55 @@
package luyao.util.ktx.lifecycle
import android.app.Activity
import java.util.*
import java.lang.Class
/**
* Created by luyao
* on 2019/8/6 10:58
*/
object KtxManager {
private val mActivityList = LinkedList<Activity>()
val currentActivity: Activity?
get() =
if (mActivityList.isEmpty()) null
else mActivityList.last
fun pushActivity(activity: Activity) {
if (mActivityList.contains(activity)) {
if (mActivityList.last != activity) {
mActivityList.remove(activity)
mActivityList.add(activity)
}
} else {
mActivityList.add(activity)
}
}
fun popActivity(activity: Activity) {
mActivityList.remove(activity)
}
fun finishCurrentActivity() {
currentActivity?.finish()
}
fun finishActivity(activity: Activity) {
mActivityList.remove(activity)
activity.finish()
}
fun finishActivity(clazz: Class<*>){
for (activity in mActivityList)
if (activity.javaClass == clazz)
activity.finish()
}
fun finishAllActivity() {
for (activity in mActivityList)
activity.finish()
}
}