Comments (5)
纠正一下,是Stack 不是stact
多试几次,顺序仍然不同
from androidproject.
小伙子,我没有 Get 到你的点,你为什么要执着于要让 mActivitySet
集合是有序的?你是在这块有什么需求么?
from androidproject.
那就是我理解错误了,我以为你原意做的就是有序的,我这确实是有个需求,顺序开了ABCDEF6个页面,然后在F做操作关闭C以后的页面,就是C-F,所以需要有序去处理
from androidproject.
小伙子,我优化了一下这个问题,你可以用下面的代码测试看看
public final class ActivityManager implements Application.ActivityLifecycleCallbacks {
private static volatile ActivityManager sInstance;
/** Activity 存放集合 */
private final List<Activity> mActivityList = new ArrayList<>();
/** 应用生命周期回调 */
private final ArrayList<ApplicationLifecycleCallback> mLifecycleCallbacks = new ArrayList<>();
/** 当前应用上下文对象 */
private Application mApplication;
/** 栈顶的 Activity 对象 */
private Activity mTopActivity;
/** 前台并且可见的 Activity 对象 */
private Activity mResumedActivity;
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;
mApplication.registerActivityLifecycleCallbacks(this);
}
/**
* 获取 Application 对象
*/
@NonNull
public Application getApplication() {
return mApplication;
}
/**
* 获取栈顶的 Activity
*/
@Nullable
public Activity getTopActivity() {
return mTopActivity;
}
/**
* 获取前台并且可见的 Activity
*/
@Nullable
public Activity getResumedActivity() {
return mResumedActivity;
}
/**
* 获取 Activity 集合
*/
@NonNull
public List<Activity> getActivityList() {
return mActivityList;
}
/**
* 判断当前应用是否处于前台状态
*/
public boolean isForeground() {
return getResumedActivity() != null;
}
/**
* 注册应用生命周期回调
*/
public void registerApplicationLifecycleCallback(ApplicationLifecycleCallback callback) {
mLifecycleCallbacks.add(callback);
}
/**
* 取消注册应用生命周期回调
*/
public void unregisterApplicationLifecycleCallback(ApplicationLifecycleCallback callback) {
mLifecycleCallbacks.remove(callback);
}
/**
* 销毁指定的 Activity
*/
public void finishActivity(Class<? extends Activity> clazz) {
if (clazz == null) {
return;
}
Iterator<Activity> iterator = mActivityList.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
if (!activity.getClass().equals(clazz)) {
continue;
}
if (!activity.isFinishing()) {
activity.finish();
}
iterator.remove();
}
}
/**
* 销毁所有的 Activity
*/
public void finishAllActivities() {
finishAllActivities((Class<? extends Activity>) null);
}
/**
* 销毁所有的 Activity
*
* @param classArray 白名单 Activity
*/
@SafeVarargs
public final void finishAllActivities(Class<? extends Activity>... classArray) {
Iterator<Activity> iterator = mActivityList.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
boolean whiteClazz = false;
if (classArray != null) {
for (Class<? extends Activity> clazz : classArray) {
if (activity.getClass().equals(clazz)) {
whiteClazz = true;
}
}
}
if (whiteClazz) {
continue;
}
// 如果不是白名单上面的 Activity 就销毁掉
if (!activity.isFinishing()) {
activity.finish();
}
iterator.remove();
}
}
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
Timber.i("%s - onCreate", activity.getClass().getSimpleName());
if (mActivityList.size() == 0) {
for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) {
callback.onApplicationCreate(activity);
}
Timber.i("%s - onApplicationCreate", activity.getClass().getSimpleName());
}
mActivityList.add(activity);
mTopActivity = activity;
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
Timber.i("%s - onStart", activity.getClass().getSimpleName());
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
Timber.i("%s - onResume", activity.getClass().getSimpleName());
if (mTopActivity == activity && mResumedActivity == null) {
for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) {
callback.onApplicationForeground(activity);
}
Timber.i("%s - onApplicationForeground", activity.getClass().getSimpleName());
}
mTopActivity = activity;
mResumedActivity = activity;
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
Timber.i("%s - onPause", activity.getClass().getSimpleName());
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
Timber.i("%s - onStop", activity.getClass().getSimpleName());
if (mResumedActivity == activity) {
mResumedActivity = null;
}
if (mResumedActivity == null) {
for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) {
callback.onApplicationBackground(activity);
}
Timber.i("%s - onApplicationBackground", activity.getClass().getSimpleName());
}
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
Timber.i("%s - onSaveInstanceState", activity.getClass().getSimpleName());
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
Timber.i("%s - onDestroy", activity.getClass().getSimpleName());
mActivityList.remove(activity);
if (mTopActivity == activity) {
mTopActivity = null;
}
if (mActivityList.size() == 0) {
for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) {
callback.onApplicationDestroy(activity);
}
Timber.i("%s - onApplicationDestroy", activity.getClass().getSimpleName());
}
}
/**
* 判断是否在主进程中
*/
public static boolean isMainProcess(Context context) {
String processName = getProcessName();
if (TextUtils.isEmpty(processName)) {
// 如果获取不到进程名称,那么则将它当做主进程
return true;
}
return TextUtils.equals(processName, context.getPackageName());
}
/**
* 获取当前进程名称
*/
@SuppressLint("PrivateApi, DiscouragedPrivateApi")
@Nullable
public static String getProcessName() {
String processName = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
processName = Application.getProcessName();
} else {
try {
Class<?> activityThread = Class.forName("android.app.ActivityThread");
Method currentProcessNameMethod = activityThread.getDeclaredMethod("currentProcessName");
processName = (String) currentProcessNameMethod.invoke(null);
} catch (ClassNotFoundException | ClassCastException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
if (!TextUtils.isEmpty(processName)) {
return processName;
}
// 利用 Linux 系统获取进程名
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("/proc/self/cmdline");
byte[] buffer = new byte[256];
int len = 0;
int b;
while ((b = inputStream.read()) > 0 && len < buffer.length) {
buffer[len++] = (byte) b;
}
if (len > 0) {
return new String(buffer, 0, len, StandardCharsets.UTF_8);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 应用生命周期回调
*/
public interface ApplicationLifecycleCallback {
/**
* 第一个 Activity 创建了
*/
void onApplicationCreate(Activity activity);
/**
* 最后一个 Activity 销毁了
*/
void onApplicationDestroy(Activity activity);
/**
* 应用从前台进入到后台
*/
void onApplicationBackground(Activity activity);
/**
* 应用从后台进入到前台
*/
void onApplicationForeground(Activity activity);
}
}
from androidproject.
好的
from androidproject.
Related Issues (20)
- 您好,在Android11机型上面,webview有时候会加载不出来。 HOT 2
- 把个人中心activity的布局,写在fragment里的时候点击头像条目下方的条目,头像条目有选中的效果 HOT 3
- androidx.appcompat:appcompat升级 HOT 3
- 关于目前App比较常态化得问题 HOT 1
- 布局中有androidx.core.widget.NestedScrollView组件会阻断BaseActivity中点击空白收起键盘的逻辑 HOT 2
- BaseActivity:startActivityForResult疑惑 HOT 2
- 日期dialog 设置当前日期为2018-12-31, 但页面上显示的是2018-12-30 HOT 3
- 项目缺少 com.hjq.demo.http.glide.GlideApp 文件 HOT 1
- Q群满了老哥 进不去啊 HOT 1
- 又出现了 不清楚是什么问题。 HOT 3
- 打开 AndroidProject APP,LeakCanary 检测启动页出现内存泄露 HOT 5
- gradle升到7+以后aop切面不适配了 HOT 2
- 关于使用TabAdapter配合ViewPager时,导航栏超出屏幕范围后滑动viewpager时导航栏item不显示 HOT 3
- AppActivity实现OnHttpListener意义是什么? HOT 1
- 查看大图模块中onItemClick position 返回值问题 HOT 3
- 建议增加一个下载网络图片到相册的功能 HOT 1
- Demo项目的BuildConfig.HOST_URL在不同环境中始终不变 HOT 3
- 缺少GlideApp文件 HOT 1
- 首次编译提示Your build is currently configured to use Java 17.0.6 and Gradle 6.5 HOT 1
- 是否有更新Gradle8+,Java17,替换通过Aspectjx实现的AOP? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from androidproject.