9

私のアプリケーションには機密性の高いユーザー情報が含まれており、ユーザーがアプリケーションを開くたびに表示されるパスコード画面を実装する必要があります。この投稿を読んだ後に試した 2 つのアプローチを次に示します。

  1. 静的変数を使用して各アクティビティでリセットしonStop()、各アクティビティで再度チェックしてonStart()、時間が最小しきい値 (1 ~ 2 秒) を超えた場合はパスコード画面を表示します。このアプローチの問題は、アプリケーションがインテントを使用してカメラやバーコード スキャナーを呼び出すこともあり、ユーザーがこれらの外部アプリで長時間過ごす可能性があることです。この場合、しきい値を上げることができますが、計算が複雑になり、あまり良い解決策ではありません。

  2. この方法を使用して、別のアプローチを試みました。

    protected boolean isAppOnForeground(final Context context) {
    List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
    
        if (appProcesses == null) {
            return false;
        }
    
        final String packageName = context.getPackageName();
    
        for (RunningAppProcessInfo appProcess : appProcesses) {
            if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
                 appProcess.processName.equals(packageName)) {
                return true;
            }
        }
        return false;
    }
    

ただし、各アクティビティの onStart メソッドでチェックすると、これは常に true を返します。これは、プロセスが onStart にある時点ですでに開始されているためです。

ユーザーがアプリケーションを開いたときにパスコードを表示するために使用できる他の方法はありますか? ユーザーがホーム画面をクリックしてアプリを終了し、最近のアプリからアプリに戻った場合でも表示される必要があります。

4

1 に答える 1

5

私はこの正確な機能を実装しました。私は本質的にあなたの#1をしましたが、少しきれいな方法で。

私がしたことは、 の抽象サブクラスActivityとオーバーライドを作成することでしたonResume()。そこで、ピン ロック画面を表示する必要があるかどうかを決定します。もしそうなら、あなた自身を終わらせて、ピンロック活動を始めてください。あなたのすべての活動がこの活動を拡張します。

どこにいたかを覚えておくために、ピン ロック アクティビティを開始するために使用されるインテントに「開始インテント」エクストラを追加できます。アプリのロックが解除されると、ピン ロック アクティビティはその追加機能を使用して、ユーザーを元の場所に戻すことができます。

アプリがフラグメントベースの場合、これは簡単です。すべてのフラグメントをホストするアクティビティが再開されるたびに、ピン ロック フラグメントを表示します。それで全部です。

一連のアクティビティで構成されるアプリの問題は、アプリを「開始」する明確な決定的な瞬間がないことです。概念は存在しません。これは本質的に、あなたの #1 ソリューションで見つけた問題です。onResume()良い選択のように思えますが、それには多くの理由があります。たとえば、ユーザーがアクティビティ A を開始すると、アクティビティ B が開始されます。ピンロックを表示しますか?

フォアグラウンド プロセスをチェックするスレッドを利用するソリューションは、バッテリーへの影響を考えると、ひどい考えです。

最後に、アプリがフォアグラウンドに移動するたびにピン ロックが必要であることに疑問を抱くかもしれません。テキスト メッセージを読むために外に出て、10 秒後に戻ってきたら、ピンを再入力する必要があるため、過剰に思えます。時間ベースの方が適切なようです。

于 2012-09-20T00:22:05.807 に答える