3

アクティビティに onPause があるように、Android にはアプリケーション レベルの onPause がないことはわかっていますが、同様の機能が必要なようです。私は少し前に(ばかげた)質問をしました(http://stackoverflow.com/questions/9508301/checking-the-manner-in-which-an-activity-has-been-reanimated)そしてonPause/onResumeが与えることに気づきました私が探しているもの:アクティビティがバックグラウンドに追いやられているかどうかを知る機能(ホームボタン、別のアプリを開く、電話がスリープ状態など)。

問題は、アプリ内のあるアクティビティから別のアクティビティに移動すると、アクティビティでも onPause が起動することです。そのため、ユーザーがアプリでアクティビティからアクティビティに移動できるすべての方法を見つけ (15 から 25 まであります)、ユーザーが開始した各アクティビティ スイッチの直前にフラグを設定する道を進んでいます。次に、onResume でそのフラグをチェックしています。それが X の場合、ユーザーが開始した onResume であることがわかります。フラグが Y の場合、ホーム ボタンが押された、電話がスリープ状態になったなどの結果であることがわかります)。

これは、大きな厄介なクラッジのように思えます。より良い方法はありますか?

(混乱を避けるためにこれを追加します。私の目標は、アプリが何らかの理由でフォアグラウンドから離れたときにポップアップする(非常に迷惑なことはわかっています)パスコード画面を作成することです(画面がスリープ状態であっても)。 onPause/onResume を使用してパスコード アクティビティをポップするタイミングを確認しますが、アクティビティを変更するたびに onPause が起動するため、さらに追加する必要があります。)

4

3 に答える 3

0

これは実際にはあなたの質問に答えるものではありませんが、おそらく別のアプローチとして、フラグ管理を行うアクティビティ基本クラスを作成し、すべてのアクティビティをそれから継承することはできますか? たとえば、あるアクティビティの onPause と別のアクティビティの onResume の間に 5 秒のタイムアウトを設定して、アプリ内切り替えではなくアプリ外切り替えを行っていると判断することもできます。アクティビティの変更を開始するためにアクティビティの基本クラスから呼び出すユーティリティ関数ですが、それでも物事を追跡する必要がある場所の表面積を大幅に削減します。

于 2012-03-05T17:14:16.977 に答える
0

Pinnacle Locker のようなアプリも同様のことを行います。特定のパッケージのインテントをインターセプトするため、システムがアプリに切り替わるたびに起動されますが、ユーザーがアプリ間で画面を変更したときは起動されません。

私はあなたを誤解しているかもしれませんが、別のアプローチはあなたのアプローチを変えることです: アプリ内である画面から別の画面に変更するたびに、インテントを起動するか、finish() を実行します (ユーザーが背面を押したときなど)。ボタン)ですよね?

次に、内部インテントにフラグを設定し、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 に答える