From a8d7d271b0682315b1d95e1a5471974ba71109e9 Mon Sep 17 00:00:00 2001 From: luyao Date: Tue, 6 Aug 2019 15:36:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Activity/Application=20?= =?UTF-8?q?=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 关闭所有 Activity * 应用前后台监听 --- .../luyao/util/ktx/ui/LifeCycleActivity.kt | 7 +++ .../main/res/layout/activity_lifecycle.xml | 15 +++++ ktx/src/main/AndroidManifest.xml | 12 ++-- ktx/src/main/java/luyao/util/ktx/Ktx.kt | 53 ++++++++++++++++++ .../luyao/util/ktx/lifecycle/KtxHandler.kt | 3 +- .../ktx/lifecycle/KtxLifeCycleCallBack.kt | 46 ++++++++++++++++ .../util/ktx/lifecycle/KtxLifeObserver.kt | 24 ++++++++ .../luyao/util/ktx/lifecycle/KtxManager.kt | 55 +++++++++++++++++++ 8 files changed, 209 insertions(+), 6 deletions(-) create mode 100644 ktx/src/main/java/luyao/util/ktx/Ktx.kt create mode 100644 ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeCycleCallBack.kt create mode 100644 ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeObserver.kt create mode 100644 ktx/src/main/java/luyao/util/ktx/lifecycle/KtxManager.kt diff --git a/app/src/main/java/luyao/util/ktx/ui/LifeCycleActivity.kt b/app/src/main/java/luyao/util/ktx/ui/LifeCycleActivity.kt index 33d6312..5ad5f73 100644 --- a/app/src/main/java/luyao/util/ktx/ui/LifeCycleActivity.kt +++ b/app/src/main/java/luyao/util/ktx/ui/LifeCycleActivity.kt @@ -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 { diff --git a/app/src/main/res/layout/activity_lifecycle.xml b/app/src/main/res/layout/activity_lifecycle.xml index fb3d8a2..f1d19ab 100644 --- a/app/src/main/res/layout/activity_lifecycle.xml +++ b/app/src/main/res/layout/activity_lifecycle.xml @@ -4,4 +4,19 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + \ No newline at end of file diff --git a/ktx/src/main/AndroidManifest.xml b/ktx/src/main/AndroidManifest.xml index 593f50b..63391fb 100644 --- a/ktx/src/main/AndroidManifest.xml +++ b/ktx/src/main/AndroidManifest.xml @@ -2,9 +2,8 @@ package="luyao.util.ktx"> - - - + + - + + + diff --git a/ktx/src/main/java/luyao/util/ktx/Ktx.kt b/ktx/src/main/java/luyao/util/ktx/Ktx.kt new file mode 100644 index 0000000..37b9336 --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/Ktx.kt @@ -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?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? = null + + + override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = 0 + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0 + + override fun getType(uri: Uri): String? = null +} \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxHandler.kt b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxHandler.kt index fb1e243..98901f2 100644 --- a/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxHandler.kt +++ b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxHandler.kt @@ -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 diff --git a/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeCycleCallBack.kt b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeCycleCallBack.kt new file mode 100644 index 0000000..ca6301e --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeCycleCallBack.kt @@ -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() + } + + +} \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeObserver.kt b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeObserver.kt new file mode 100644 index 0000000..406ff39 --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxLifeObserver.kt @@ -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("应用进入后台") + } +} \ No newline at end of file diff --git a/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxManager.kt b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxManager.kt new file mode 100644 index 0000000..d75b9c4 --- /dev/null +++ b/ktx/src/main/java/luyao/util/ktx/lifecycle/KtxManager.kt @@ -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() + + 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() + } +} \ No newline at end of file