1

私が使用しているアプリは自動的にロックされます (パスワード入力画面が必要です)...

a) when the app starts for the first time
b) when another app is started and takes over the device
c) when the device "sleeps" automatically
d) when the user "sleeps" the device manually
(note: with c & d, if the user "awakens" the app within 5 seconds, it does NOT ask for the password)

私が書いているアプリでもこれを行いたいのでPasswordActivity、必要な検証手順を使用してアクティビティ ( ) を作成し、適切に動作させます。

私はもともとそれを(AndroidManifestでLAUNCHEDされた)に配置しましONCREATEMainActivity。それはうまくいったようです。しかし、その後、再ロック機能を開始しました。それで、ONSTARTまたはに移動してみましたONRESUME。しかし、その後、APP の別の ACTIVITY がフォーカスされるか、画面が回転すると、PasswordActivity再び発火しました。それはうまくいきません。

ここで、マニフェストで LAUNCHER アプリにすることを推奨するスレッドを見つけ、パスワードが OK になったら MainActivity を呼び出します。それはうまくいくように見えました...しかし、ユーザーがメイン画面から戻るボタンを押したときにのみ「再ロック」するという問題が発生し(アプリを停止すると仮定します)、アプリを再度起動しました。ただし、デバイスを引き継ぐ別のアプリをキャッチしません。

それに基づいて、ライフサイクルで見つけることができるすべてのドキュメントを見た後(ただし、それらのほとんどはアプリケーションベースではなくアクティビティベースです)、APP自体がフォーカスを失ったとき(別のアプリが引き継ぐとき)をキャッチする方法と処理方法がわかりません自動または手動のスリープ (上記の C & D) と時間遅延のチェック。いくつかの呼び出しまたはステップの組み合わせになると思いますが、現時点ではどれが正確かはわかりません。

推奨事項はありますか?

4

1 に答える 1

2

いくつかの提案といくつかの調査を使用して、それを理解したと思います。他の誰かを助けることができる場合、誰かがまだ見ていなかったり遭遇したりしていない明確な欠陥を見たり、誰かがそれを改善する可能性のある他の入力を持っている場合に備えて、ここに私のソリューションを投稿しています。

前述のように、私が知る限り最大の問題は、「アプリ」がフォアグラウンドにないときを判断できる組み込み関数呼び出しがないことです。onPauseとはonResume、アプリ ベースではなく、アクティビティ ベースです。そのため、アプリ内のアクティビティからアクティビティに変更したり、画面の回転を行ったりすると、それらが起動します。

これを回避するために... というグローバル変数を作成しましたgv.appPauseTime。アプリのどこからでも呼び出すことができる 2 つの個別のユニバーサル ユーティリティ関数を作成しました。

public static void lockAppStoreTime() {
    gv.appPauseTime=new Date();
}

public static void lockAppCheck(Activity act) {
    boolean bLock=false;

    // Check to see if this is the first time through app       
    if (gv.appPauseTime==null) {
       bLock = true;
    } else {
       Date currTime = new Date();
       long diffMillis = currTime.getTime() - gv.appPauseTime.getTime();
       long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffMillis);

       // Lock app if 120 seconds (2 minutes) has lapsed
       if (diffInSec > 120) {
           bLock=true;
       }
    }

    gv.appLastPause = new Date();
    if (bLock) {
       Intent j = new Intent(act, PasswordActivity.class);
       act.startActivity(j);
    }
}

すべてのアクティビティで、作成 (または変更)onPauseなどonResume...

@Override
public void onPause(){
    super.onPause();
    Util.lockAppStoreTime();
}

@Override
public void onResume(){
    super.onResume();
    Util.lockAppCheck(this);
}

onPause起動すると、現在の日付 (時刻) が格納されます。onResume関数で が起動すると、現在の日付 (時刻) と保存されている日付 (時刻) が比較されます。120 秒 (2 分) 経過すると、PasswordActivity が表示され、パスワードが検証されます。PasswordActivity を呼び出す前に現在の日付 (時刻) を「保存」して、繰り返しを繰り返さないようにします。

基本的に、アクティビティの一時停止とアクティビティの間に 2 分間のギャップがある場合、IN MY APP で再開 (または開始) すると、パスワードの入力が求められます。ユーザーが別の APP を開いてから自分の APP に戻った場合...もう一度、少なくとも 2 分経過すると、パスワードが求められます。ユーザーがアプリの電源を切るか閉じると、再起動によってもパスワードがトリガーされます。

私は 2 分間を選択しました。これは、一般的に私たちのアプリでは適切な「タイム ラプス」と思われるためです。もちろん、それも変更可能です。

ここまでは順調ですね。これが他の誰かに役立つことを願っています。

于 2016-05-27T01:25:32.413 に答える