通过Application regist ActivityLifecycleCallbacks,监听栈顶Activity
不建议在onNewIntent、onRestart中处理当前UI,因为目标Activity仍未显示
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresPermission;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
public class TopActivityManager implements Application.ActivityLifecycleCallbacks {
private Reference<Activity> mCurActivity = null;
public static TopActivityManager getInstance() {
return SingleHolder.mInstance;
}
static class SingleHolder {
static final TopActivityManager mInstance = new TopActivityManager();
}
private TopActivityManager() {
}
private Reference<Application> mApplication = null;
public void init(Application app) {
app.registerActivityLifecycleCallbacks(this);
mApplication = new WeakReference<>(app);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (mCurActivity != null && mCurActivity.get() != null) {
mCurActivity.clear();
mCurActivity = null;
}
mCurActivity = new WeakReference<>(activity);
isTargetPrepared = true;
}
private boolean isTargetPrepared = true;// 目标页面是否可见
@Override
public void onActivityStarted(Activity activity) {
if (mCurActivity != null && mCurActivity.get() != null && !mCurActivity.get().equals(activity)) {
mCurActivity.clear();
mCurActivity = null;
}
if (mCurActivity == null || mCurActivity.get() == null) {
mCurActivity = new WeakReference<>(activity);
}
isTargetPrepared = true;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
if (activity != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {// 允许onPause使用
isTargetPrepared = false;
}
});
}
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
if (mCurActivity != null && mCurActivity.get() != null && mCurActivity.get().equals(activity)) {
mCurActivity.clear();
mCurActivity = null;
}
}
public static Context getContext() {
Context context = null;
if (getInstance().mApplication != null) {
context = getInstance().mApplication.get();
}
if (context == null && getInstance().mCurActivity != null) {
context = getInstance().mCurActivity.get().getApplication();
}
if (context == null){
context = YaboLib.getApp();
getInstance().mApplication = new WeakReference<>(XXXApplication.getApp());
}
if (context == null){
Log.e("TopActivity警告:", "请先注册该组件");
}
return context;
}
@Deprecated
public Activity getCurActivity() {
return getTopActivity();
}
private static void debugWarning(String issue) {
if (BuildConfig.DEBUG) {
Log.e("TopActivity警告:", issue);
Toast.makeText(getContext(), issue, Toast.LENGTH_LONG).show();
}
}
/**
* 判断Activity实例是否为栈顶Activity
*
* @param activity 活动页面
* @return boolean
*/
public static boolean isTopOfTask(Activity activity) {
try {
String meName = "isTopOfTask";
Method isTopOfTaskM = Activity.class.getDeclaredMethod(meName, (Class<?>) null);
isTopOfTaskM.setAccessible(true);
Object object = isTopOfTaskM.invoke(activity, (Object) null);
if (object instanceof Boolean) {// 不是TopActivity提醒
return (Boolean) object;
}
} catch (Exception ignored) {
}
return false;
}
/**
* 获取栈顶Activity
* 页面跳转有对应方法
*
* @return Activity
*/
public static Activity getTopActivity() {
if (getInstance().mCurActivity != null) {
Activity activity = getInstance().mCurActivity.get();
if (activity != null) {
if (!getInstance().isTargetPrepared) {
debugWarning("请勿在onNewIntent onRestart 生命方法中调用,目标Activity 还未显示");
}
return activity;
}
}
debugWarning("组件未注册 or TopActivity在后台已被系统回收");
return null;
}
public static void startActivity(Intent intent) {
startActivity(intent, null);
}
public static void startActivity(Intent intent, Bundle bundle) {
Context context = getContext();
if (context != null) {
context.startActivity(intent, bundle);
}
}
public static void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}
public static void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
Activity activity = getTopActivity();
if (activity != null) {
activity.startActivityForResult(intent, requestCode, options);
}
}
}