2016-08-24 5 views
1

AccountActivity.classにタイマーを設定して、ユーザーがホームボタンを押さないようにして、カウントダウンを開始してユーザーをログアウトさせたり、ユーザーが画面をロックしたりしないようにします。タイマーは古いアクティビティで停止しません

しかし今、私はメソッドのために問題に直面しています。私のユーザがgetaccounttask()メソッドを呼び出すボタンをクリックし、ユーザをAccountInformationActivity.classにリダイレクトすると、メソッドも有効になり、タイマーはカウントダウンを開始します。

メソッドがカウントダウンしないようにする方法はありますか?AccountInformationActivity.classにキャンセルするタイマーはありますか?

私の意図が始まる前にタイマーをキャンセルしようとしましたが、まだ動作しません。

私もハンドラを使用しようとしましたが、同じ問題が発生しました。私はまだAndroidがどのように機能するかを把握しようとしていますので、あなたの助けや解決に深く感謝します。

public class AccountActivity extends AppCompatActivity { 

    private Timer timer; 

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

    private class getaccounttask extends AsyncTask<String, Void, String> 
    { 
     @Override 
     protected String doInBackground(String... urlaccount) 
     { 
     StringBuilder result = new StringBuilder(); 
     try 
     { 
      //My Codes 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return result.toString(); 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
     Intent intent = new Intent(); 
     intent.setClass(getApplicationContext(), AccountInformationActivity.class); 
     startActivity(intent); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     timer = new Timer(); 
     Log.i("Main", "Invoking logout timer"); 
     LogOutTimerTask logoutTimeTask = new LogOutTimerTask(); 
     timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (timer != null) { 
      timer.cancel(); 
      Log.i("Main", "cancel timer"); 
      timer = null; 
     } 
    } 

    private class LogOutTimerTask extends TimerTask { 

     @Override 
     public void run() { 

      //redirect user to login screen 
      Intent i = new Intent(AccountActivity.this, MainActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(i); 
      finish(); 
     } 
    } 
} 

答えて

0

これで、選択した実装アーキテクチャを改善することができました。私は後でそれに来るだろう。まず、このクイックフィックスを適用してアーキテクチャを修正します。

ホーム画面を使用してActivityを外出すると、明らかにTimerを開始します。ユーザーはIntentを使用してAccountActivityに切り替えることでActivityから出ることもできます。これはあなたが追跡することができます。したがって、shouldNavigateのようなブール値のフラグを保持してください。最初はfalseにする必要があります。 onResumeの場合はfalseに設定しますが、getcounttaskonPostExecuteになる場合はtrueに設定する必要があります。だからの場合、getcounttaskを経由して行く場合、はtrueになり、trueの場合は、Timerを開始してください。

コード:

public class AccountActivity extends AppCompatActivity { 

    private Timer timer; 
    private volatile boolean shouldNavigate = false; 

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

    private class getaccounttask extends AsyncTask<String, Void, String> 
    { 
     @Override 
     protected String doInBackground(String... urlaccount) 
     { 
     StringBuilder result = new StringBuilder(); 
     try 
     { 
      //My Codes 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return result.toString(); 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
     shouldNavigate = true; 
     Intent intent = new Intent(); 
     intent.setClass(getApplicationContext(), AccountInformationActivity.class); 
     startActivity(intent); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (!shouldNavigate){ 
      timer = new Timer(); 
      Log.i("Main", "Invoking logout timer"); 
      LogOutTimerTask logoutTimeTask = new LogOutTimerTask(); 
      timer.schedule(logoutTimeTask, 300000); 
     }else{ 
      if (timer != null){ 
        timer.cancel(); 
        timer = null; 
      } 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     shouldNavigate = false; 
     if (timer != null) { 
      timer.cancel(); 
      Log.i("Main", "cancel timer"); 
      timer = null; 
     } 
    } 

    private class LogOutTimerTask extends TimerTask { 

     @Override 
     public void run() { 

      //redirect user to login screen 
      shouldNavigate = false; 
      Intent i = new Intent(AccountActivity.this, MainActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(i); 
      finish(); 
     } 
    } 
} 

今より良いアプローチはServiceSingletonクラスを維持する可能性があります。 シングルトンクラスは

public Singleton{ 
    private static Singleton instance = null; 
    private Singleton(){ 
     activityMap = new HashMap<String, Activity>(); 
    } 

    public static Singleton getInstance(){ 
     if (instance == null) instance = new Singeton(); 
     return instance; 
    } 

    public HashMap<String, Activity> activityMap; 

} 

今、各アクティビティは、(その名のような)タグを持つことになりますされますので、履歴書は

Singleton.getInstance().activityMap.put(tag, this); 

を行うと、になるとする各アクティビティが

を行います
Singleton.getInstance().activityMap.remove(tag, this); 

したがって、サービスがSingleton.getInstance().activityMapのサイズがゼロであることが判明した場合、フォアグラウンド上にアクティビティが明確にないので、タイマーを開始します。タイマが期限切れになると、カウントがまだゼロであるかどうかを再度確認し、ゼロの場合はログアウトを実行します。

+0

こんにちは、私もハンドラを試してみましたが、私は同じ問題を抱えています。 shouldNavigateのトラッキングの部分については、私はまだAndroidとJavaの新機能ではありません。あなたがいくつかのコードを提供できるなら、わかりやすく助けになるでしょう。 – iOSAndroid

+0

編集を確認してください。あなたの必要性。 –

+1

OMG..最終的にはうまくいった!どうもありがとう!私はこのような問題のために何週間も立ち往生してきました!再びすべてのおかげで! – iOSAndroid

0

アクティビティのライフサイクルでonPause()とonResume()を混同していると思います。あなたのケースでは enter image description here

、あなたはonPause(に何をすべきか切り替えることができます)onResume(へ)

@Override 
    protected void onPause() { 
     super.onPause(); 
     if (timer != null) { 
      timer.cancel(); 
      Log.i("Main", "cancel timer"); 
      timer = null; 
     } 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     timer = new Timer(); 
     Log.i("Main", "Invoking logout timer"); 
     LogOutTimerTask logoutTimeTask = new LogOutTimerTask(); 
     timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes 
    } 

は、これが役立つことを願っています!

+0

こんにちは、しかし(私が間違っているなら、私を修正しない)を追加ホームボタン)を押して、タイマーを開始します。私が活動に戻ったときにonResumeそれはそれではない? ユーザーがアクティビティにいるときにカウントダウンを開始するのはなぜですか?ユーザーが自分のアプリケーションにもうログインしておらず、ユーザーがログアウトしなかった場合、タイムアウトのようなものを達成しようとしています。 – iOSAndroid

+0

onResume()は、画面の開始時または画面の再起動時に呼び出されます。あなたがホームボタンを押して、アプリが完全に閉じていないときの例。アプリケーションを再び起動すると、onResume()にトリガーされます。 逆に、onPause()はクローズ状態とみなされます。これは、画面を閉じるか、新しい画面を開始するときを意味します。 –

+0

ええ、でも、ユーザーがアプリ内にいるときにカウントダウンするのはなぜですか?ユーザーが画面上にいるときその場合、ユーザーはその特定の画面で5分しか持ちません。ユーザーがホームボタンを押すと、ユーザーはログアウトしません。ユーザーがホームボタンを押したときにアプリケーションからログアウトするようなことを達成しようとしているため、タイムアウトタスクはユーザーのためにログアウトします。 – iOSAndroid

0

私のバックグラウンドアクティビティは、(例えば、私が押したときにのみ起動するonPause onPause()にいくつかの変更を加えて、この権限

<uses-permission android:name="android.permission.GET_TASKS" />

@Override 
    protected void onPause() { 
     if (isApplicationSentToBackground(this)) { 
      // Do what you want to do on detecting Home Key being Pressed 
      timer = new Timer(); 
      Log.i("Main", "Invoking logout timer"); 
      LogOutTimerTask logoutTimeTask = new LogOutTimerTask(); 
      timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes 
      Log.i("Main", "Invoking Home Key pressed"); 
     } 
     super.onPause(); 

    } 

    public boolean isApplicationSentToBackground(final Context context) { 
     ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 
     if (!tasks.isEmpty()) { 
      ComponentName topActivity = tasks.get(0).topActivity; 
      if (!topActivity.getPackageName().equals(context.getPackageName())) { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

これを試してみましたか? –

関連する問題