前言
你是否有如下需求:
- finish所有Activity,然后start一个新的Activity
- 想某些Activity不被finish,其它的Activity都被销毁
- 判断当前app是否处于前台
- 获取当前栈顶Activity
如果有的话,那么恭喜你,找到宝了!
Kotlin版本
import android.app.Activity
import android.app.Application
import android.os.Bundle
import androidx.annotation.NonNull
import androidx.collection.arrayMapOf
/**
* author : A Lonely Cat
* github : https://github.com/anjiemo
* gitee : https://gitee.com/anjiemo
* time : 2021/6/18
* desc : Activity 管理类
*/
object ActivityManager : Application.ActivityLifecycleCallbacks {
private lateinit var mApplication: Application
private val mActivityTaskMap = arrayMapOf<String, Activity>()
// 最后可见 Activity 对象的 TAG
private var mLastVisibleTag: String? = null
// 最后不可见 Activity 对象的 TAG
private var mLastInvisibleTag: String? = null
/**
* 初始化,仅第一次有效
*/
fun init(application: Application) {
if (::mApplication.isInitialized.not()) {
mApplication = application
application.registerActivityLifecycleCallbacks(this)
}
}
/**
* 获取 Application 对象
*/
fun getApplication() = mApplication
/**
* 最后一个可见的Activity和最后一个不可见的Activity不是同一个(换言之:是同一个 Activity,app则未处于前台),或栈顶 Activity不为null,则app处于前台
*
*/
fun appIsForeground() =
((mLastVisibleTag == mLastInvisibleTag).not() || getStackTopActivity() != null)
/**
* 获取在栈顶的 Activity
*/
fun getStackTopActivity() = mActivityTaskMap[mLastVisibleTag]
/**
* 销毁所有 Activity
*/
fun finishAllActivities() {
finishAllActivities(null)
}
/**
* 销毁除了参数列表中以外的所有 Activity
*/
fun finishAllActivities(vararg clazzArray: Class<out Activity>?) {
val keys: Array<String> = mActivityTaskMap.keys.toTypedArray()
for (key in keys) {
val activity: Activity? = mActivityTaskMap[key]
activity ?: continue
if (activity.isFinishing.not()) {
var isWhitelistActivity = false
for (clazz in clazzArray) {
if (activity.javaClass == clazz) {
isWhitelistActivity = true
}
}
// 如果不是白名单上面的 Activity 就销毁掉
if (!isWhitelistActivity) {
activity.finish()
mActivityTaskMap.remove(key)
}
}
}
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
setLastVisibleTag(activity)
mActivityTaskMap[mLastVisibleTag] = activity
}
override fun onActivityStarted(activity: Activity) {
setLastVisibleTag(activity)
}
override fun onActivityResumed(activity: Activity) {
setLastVisibleTag(activity)
}
override fun onActivityPaused(activity: Activity) {
setLastInvisibleTag(activity)
}
override fun onActivityStopped(activity: Activity) {
setLastInvisibleTag(activity)
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {
val objectTag = getObjectTag(activity)
mActivityTaskMap.remove(objectTag)
if (objectTag == mLastVisibleTag) {
// 清除当前标记
mLastVisibleTag = null
}
}
private fun setLastInvisibleTag(activity: Activity) {
mLastInvisibleTag = getObjectTag(activity)
}
private fun setLastVisibleTag(activity: Activity) {
mLastVisibleTag = getObjectTag(activity)
}
/**
* 对象所在的包名 + 对象的内存地址
*/
private fun getObjectTag(@NonNull any: Any): String =
any::class.java.name + Integer.toHexString(any.hashCode())
}
Java版本
/**
* author : Android 轮子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2018/11/18
* desc : Activity 管理类
*/
public final class ActivityManager implements Application.ActivityLifecycleCallbacks {
private static volatile ActivityManager sInstance;
private final ArrayMap<String, Activity> mActivitySet = new ArrayMap<>();
/** 当前应用上下文对象 */
private Application mApplication;
/** 最后一个可见的 Activity 对象标记 */
private String mLastVisibleTag;
/** 最后一个不可见的 Activity 对象标记 */
private String mLastInvisibleTag;
private ActivityManager() {}
public static ActivityManager getInstance() {
// 加入双重校验锁
if(sInstance == null) {
synchronized (ActivityManager.class) {
if(sInstance == null){
sInstance = new ActivityManager();
}
}
}
return sInstance;
}
public void init(Application application) {
mApplication = application;
application.registerActivityLifecycleCallbacks(this);
}
/**
* 获取 Application 对象
*/
public Application getApplication() {
return mApplication;
}
/**
* 获取栈顶的 Activity
*/
public Activity getTopActivity() {
return mActivitySet.get(mLastVisibleTag);
}
/**
* 判断当前应用是否处于前台状态
*
* @return appIsForeground
*/
public Boolean appIsForeground() {
// 最后一个可见的Activity和最后一个不可见的Activity是同一个,则app未处于前台
if (mLastVisibleTag.equals(mLastInvisibleTag)) {
return false;
}
return getTopActivity() != null;
}
/**
* 销毁所有的 Activity
*/
public void finishAllActivities() {
finishAllActivities((Class<? extends Activity>) null);
}
/**
* 销毁所有的 Activity,除这些 Class 之外的 Activity
*/
@SafeVarargs
public final void finishAllActivities(Class<? extends Activity>... classArray) {
String[] keys = mActivitySet.keySet().toArray(new String[]{});
for (String key : keys) {
Activity activity = mActivitySet.get(key);
if (activity != null && !activity.isFinishing()) {
boolean whiteClazz = false;
if (classArray != null) {
for (Class<? extends Activity> clazz : classArray) {
if (activity.getClass() == clazz) {
whiteClazz = true;
}
}
}
// 如果不是白名单上面的 Activity 就销毁掉
if (!whiteClazz) {
activity.finish();
mActivitySet.remove(key);
}
}
}
}
/**
* 获取一个对象的独立无二的标记
*/
private static String getObjectTag(Object object) {
// 对象所在的包名 + 对象的内存地址
return object.getClass().getName() + Integer.toHexString(object.hashCode());
}
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
mLastVisibleTag = getObjectTag(activity);
mActivitySet.put(getObjectTag(activity), activity);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
mLastVisibleTag = getObjectTag(activity);
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
mLastVisibleTag = getObjectTag(activity);
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
mLastInvisibleTag = getObjectTag(activity);
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
mLastInvisibleTag = getObjectTag(activity);
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
mActivitySet.remove(getObjectTag(activity));
if (getObjectTag(activity).equals(mLastVisibleTag)) {
// 清除当前标记
mLastVisibleTag = null;
}
}
}
欢迎同学们点赞、评论、打赏+关注,一键三连~
本文由
A lonely cat
原创发布于
阳光沙滩
,未经作者授权,禁止转载