2016-07-30 9 views
2

私が開発しているアプリでは、一部の画面をパスワードで保護する必要があります。したがって、ユーザーがアプリを離れるか(ホームを押すか別のアプリがフォアグラウンドになるか、スクリーンがオフになる)、一定時間(30秒)後に戻ってくると、アプリはパスワードを尋ねる彼が放った画面が表示されます。私はアプリがバックグラウンドで行くActivityLifecycleCallbacksとトリガー2つのイベント、1を使用して、アクティビティのライフサイクルを追跡アプリがバックグラウンドからフォアグラウンドに入るときに特定のアクティビティを起動する

  • クラスApplicationでは、それが前面に戻ってくる別のとき:私がこれまで試してみました何

    です。

  • 'background'イベントでは、私は現在のタイムスタンプを追跡します。そして、「フォアグラウンド」イベントで、アプリがバックグラウンドで30秒間確認されたかどうかを確認し、そうであれば現在のActivityにパスワード画面を起動するように指示します。

これは問題ありません。しかし、問題は、パスワードスクリーンが起動される(パスワードスクリーンがコンテンツスクリーン自体によって起動される)まで、保護されたコンテンツ/スクリーンがしばらく表示されることである。

パスワードの画面が最初に表示されるようにする方法がありますか?

+0

Applicationクラス自体からパスワードアクティビティ(clear_topフラグ付き)を開始しないのはなぜですか? – Shaishav

+0

@Shaishavそれはまさに私がやっていたことですが、それはその問題を解決しません。そして、パスワード保護が必要かどうかを知っているので、私はコンテンツ活動に打ち上げを委任しました。 – Mehedi

+0

アプリケーションクラスで 'onActivityPaused()'と 'onActivityResumed()'ライフサイクルメソッドを使用して、アプリケーションがフォアグラウンド/バックグラウンドに移動するかどうかを確認していますか? – Shaishav

答えて

0

説明していることは、アクティビティクラスから継承した基底クラスによって簡単に解決できるJava継承の基本的な優れた使用例です。

まず、我々は基本クラスを作成します。

public class NeedPasswordActivity extends AppCompatActivity { 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     //Check time stamp here 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     //Set time step here 
    } 
} 

次にパスワードする必要があり、それぞれの活動では、我々のNeedPasswordActivityから継承検証:

public class NeedToHavePassowrdActivity extends NeedPasswordActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); //call the code from our NeedPasswordActivity and check time stamp before loading the activity 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); //call the code from our NeedPasswordActivity and set time stamp 
    } 
} 

重要:super.は、最初の行でなければなりませんこのメソッドは、タイムスタンプが確認される前にアクティビティが呼び出されることはありません。

0

これは主にハックのように聞こえるかもしれません。

public class MyApplication extends Application implements ActivityLifecycleCallbacks { 

    public boolean userLoggedOff; 
    private Handler mHandler; 

    ... 

    @Override 
    public void onActivityResumed(Activity activity) { 
     Log.i("Activity Resumed", activity.getLocalClassName()); 

     if (userLoggedoff) 
      startPasswordActivity() 
     else { 
      mHandler.cancelCallbacksAndMessages(null); 
      userLoggedOff = false; 
     } 
    } 

    @Override 
    public void onActivityPaused(Activity activity) { 
     Log.i("Activity Paused", activity.getLocalClassName()); 

     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
        userLoggedOff = true; 
      } 
     }, 30000); 
    } 

    ... 

} 

これは、すぐにすべての活動を一時停止したが、いずれも30秒以内に再開されていないとして、ユーザーをログオフします:あなたは、あなたのアプリケーションクラスには、次のような背景/前景のロジックを決定することができます。今、敏感な情報が瞬時に表示される場合に対処するために、私たちがユーザーの正当性を判断するまで画面全体を覆うビューを各機密レイアウトに追加することができます。次に、このようなアクティビティごとに追加することができます:

@Override 
protected void onResume() { 
    if (!((MyApplication) getApplicatio()).userLoggedOff)) 
     (findViewByID(R.id.opaqueView)).setVisibility(View.INVISIBLE); 
} 

これはちょうどあなたのユースケースのために働くかもしれません。

+0

@Shaisabは、アプリケーションのフォアグラウンド/バックグラウンド状態を追跡するためのロジックがすでに存在し、動作しています。ビューオーバーレイを提案してくれてありがとうございました。問題の問題を解決できない場合は、機密コンテンツをぼかすことも考えていました。 – Mehedi

+0

ああ、そういうわけで私はあなたがそのために使っていた方法を尋ねました。しかし、私の家には電源が​​遮断されていましたので、電源が復帰するとすぐに私の回答を投稿する前にあなたの回答を得ることができませんでした。 :) – Shaishav

関連する問題