2

アプリケーションにパスワードを適用するアプリケーションを構築しようとしています。ユーザーがアプリケーションを離れて再度開くと、パスワードを要求されます。たとえば、アプリケーションが実行されている場合、ユーザーがホームボタンをクリックすると、アプリケーションを離れてから再度開くと、アプリケーションがパスワードを要求します。

onResume()アクティビティ メソッドでパスワード ダイアログを作成しています。しかし問題は、ユーザーが次の画面に移動し、その画面に戻った場合にもonResume()実行され、パスワードを要求されることです。しかし、私はこれを望んでいません。彼がアプリケーションを離れて再び来た場合にのみ、パスワードアラートが発生するようにします。そのコードをどこに書くべきか、解決策を教えてください。

4

5 に答える 5

1

試してみる。

あなたがA、Bアクティビティを持っていると仮定し、AにloggedIn = falseとして静的変数を作成します。

ここで、A から B を開始したとします。B の onbackpress メソッドでは、常に LoggedIn=true を作成します。

アクティビティ A のレジューム メソッド チェックで

if(!loggedIn){ showLogin dialog } その後、再度 true を割り当て、loggedIn=true;

ユーザーがホーム ボタンを押すと、loggedIn フラグが false になり、アプリケーションが再開されると、ログイン ダイアログが呼び出されます。

于 2013-03-14T12:30:21.270 に答える
0

認証プロセスを処理するアクティビティを作成し、それを呼び出すことができます(A)。現在の活動を(B)と(C)とします。だから、これはそれがどうなるかです:

1-アクティビティ(A)はランチャーです。

2 -manifest.xmlのアクティビティ(A)のタグに追加android:noHistory="true"します<activity>

3-(A)から(B)、次に(C)に移動できます。

4-(C)から(B)に戻ることはできますが、(A)に戻ることはできません。

于 2013-03-14T12:35:50.367 に答える
0

ホームキーを押すと変数を設定できます

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

   if(keyCode == KeyEvent.KEYCODE_HOME)
    {
     fromHome = true;
    }

return false;
};

このアクティビティから移動するときは、変数をfalseに設定します

fromHome = false;

フラグをチェックインしますOnResume()

于 2013-03-14T12:37:30.873 に答える
0

2 つのアクティビティ a (ダイアログの表示) と b があると仮定します。1 つのアクティビティ a から別のアクティビティ b に移動するとき。アクティビティ a はバックグラウンドに移行します。アクティビティ b はフォアグラウンドにあります。両方ともアクティビティ バックスタックに置かれます。バックスタックは LIFO (後入れ先出し) のように機能します。戻るボタンをクリックしたとき。アクティビティ b がバックスタックからプッシュされ、アクティビティ a が表示されます。アクティビティが一時停止されたら、再開する必要があります。アクティビティが停止すると、onStart() が呼び出され、続いて onResume() が呼び出されます。したがって、onResume() でダイアログを呼び出すと、表示されます。

以下のリンクをご覧ください。

http://developer.android.com/training/basics/activity-lifecycle/index.html .

http://developer.android.com/guide/components/tasks-and-back-stack.html

注 上記のリンクから引用:複数のタスクを一度にバックグラウンドで保持できます。ただし、ユーザーが同時に多くのバックグラウンド タスクを実行している場合、システムはメモリを回復するためにバックグラウンド アクティビティを破棄し始め、アクティビティの状態が失われる可能性があります。アクティビティの状態については、次のセクションを参照してください。

編集

アクティビティの存続期間全体で 1 回だけ発生する基本的なアプリケーション起動ロジックを実行するには、onCreate() メソッドを実装する必要があります。そのため、onResume() ではなく onCreate() でダイアログを表示します。アクティビティが破棄されない限り、アクティビティは再び作成されません。

于 2013-03-14T12:08:41.163 に答える
0

あなたが実際に追跡しようとしているのは、アプリケーション内の「開始された」アクティビティの数であるように思われます: #(開始されたアクティビティ) > 0 は、アプリケーションがバックグラウンドに置かれていないことを意味します。ユーザーがホームを押すと、アプリのすべてのアクティビティで onStop() が呼び出されます。

「開始された」アクティビティの数を追跡するために、次のようにシングルトンを導入できます。

public class LifecycleTracker {

private LifecycleTracker mInstance;

private int mNrOfStarted;

private LifecycleTracker() {
    mNrOfStarted = 0;
}

public static LifecycleTracker getInstance() {
    if (mInstance == null) {
        mInstance = new LifecycleTracker();
    }
    return mInstance;
}

public void incrementStarted() {
    mNrOfStarted++;
}

public void decrementStarted() {
    mNrOfStarted--;
}

public boolean fromBackground() {
    return mNrOfStarted == 0;
}
}

次に、すべてのアクティビティの onStart() メソッドで、バックグラウンドから来ているかどうかを最初に確認する必要があります。

if (LifecycleTracker.getInstance().fromBackground()) {
    //start authentication
    //don't forget to increment after authentication as well!
} else {
    LifecycleTracker.getInstance().incrementStarted();
}

そして、すべてのアクティビティの onStop() メソッドでデクリメントする必要があります:

LifecycleTracker.getInstance().decrementStarted();

于 2013-03-14T13:27:41.210 に答える