Giter Club home page Giter Club logo

Comments (5)

fuchengxin avatar fuchengxin commented on June 15, 2024

纠正一下,是Stack 不是stact
image
多试几次,顺序仍然不同

from androidproject.

getActivity avatar getActivity commented on June 15, 2024

小伙子,我没有 Get 到你的点,你为什么要执着于要让 mActivitySet 集合是有序的?你是在这块有什么需求么?

from androidproject.

fuchengxin avatar fuchengxin commented on June 15, 2024

那就是我理解错误了,我以为你原意做的就是有序的,我这确实是有个需求,顺序开了ABCDEF6个页面,然后在F做操作关闭C以后的页面,就是C-F,所以需要有序去处理

from androidproject.

getActivity avatar getActivity commented on June 15, 2024

小伙子,我优化了一下这个问题,你可以用下面的代码测试看看

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.

fuchengxin avatar fuchengxin commented on June 15, 2024

好的

from androidproject.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.