3

我知道 Android 没有 Activity 具有 onPause 的应用程序级 onPause,但看起来我需要类似的功能。不久前我问了一个(愚蠢的)问题(http://stackoverflow.com/questions/9508301/checking-the-manner-in-which-an-activity-has-been-reanimated)并意识到 onPause/onResume 会给我在寻找什么:知道活动是否已降级到后台的能力(通过主页按钮、打开不同的应用程序、手机睡眠等)。

问题是,当我从我的应用程序中的一个活动转到另一个活动时,onPause 也会在一个活动中触发。因此,我正在寻找用户可以在我的应用程序中从 Activity 转到 Activity 的每一种方式(其中有 15 到 25 种),并在每个用户启动的 Activity 切换之前设置一个标志。然后在 onResume 中检查该标志,如果它是 X,我知道它是用户启动的 onResume。如果标志是 Y,我知道这是按下 Home 键、手机休眠等的结果)。

这似乎是一个大杂烩。有没有更好的办法?

(我添加这个是为了帮助,而不是混淆:我的目标是有一个(非常烦人,我知道)密码屏幕,只要应用程序出于任何原因(甚至屏幕睡眠)离开前台,它就会弹出。我计划使用 onPause/onResume 检查何时弹出 Passcode 活动,但每次更改活动时都会触发 onPause,因此我需要添加更多。)

4

3 回答 3

0

这并不能真正回答您的问题,但也许作为一种替代方法,您是否可以创建一个活动基类来进行标志管理并让您的所有活动都继承自该类?你甚至可以做一些事情,比如在一个活动的 onPause 和另一个活动的 onResume 之间设置一个 5 秒的超时,以决定你正在进行应用外切换而不是应用内切换,尽管如果你只有一个您从活动基类调用的实用程序函数,用于启动活动更改,这仍然大大减少了您必须跟踪事物的表面积。

于 2012-03-05T17:14:16.977 回答
0

像 Pinnacle Locker 这样的应用程序做类似的事情——我相信它们会拦截特定包的 Intent,因此当系统切换到应用程序时会触发,但不会在用户在应用程序之间切换屏幕时触发。

我可能会误解您,但另一种方法是改变您的方法:每当您在应用程序内从一个屏幕切换到另一个屏幕时,您要么启动 Intent 要么完成()ing(例如当用户按下后退时)按钮),对吧?

然后你可以在你的内部 Intents 中设置一个标志,每当你直接调用 finish() 或在你的应用程序中调用 onBackPressed() 时,你都可以设置一个类似的标志。如果在您的应用程序中运行 onResume() 时未设置该标志,那么您可以显示锁屏。

于 2012-03-05T17:24:56.390 回答
0

如果您的应用程序不可见,您应该将 onPause() 函数与应用程序可见性状态结合起来并进一步处理。以下代码可能会有所帮助:

private boolean isVisible(String app) {
        ActivityManager activityManager = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        for (RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                Log.i("Foreground App", appProcess.processName);
                if (app.equalsIgnoreCase(appProcess.processName)) {
                    return true;
                }
            }
        }

        return false;
    }

同样,这可能不完全适合您当前的情况。

于 2012-03-05T17:33:19.260 回答