2012-03-08 18 views
2

アプリがバックグラウンドに陥って5分後に戻ってきたら、アプリを再起動する必要があります。 私たちは再起動の部分を残すことができます。バックグラウンドとフォアグラウンドに移動するアプリはどのように検出されますか?助けてください。Android - アプリがバックグラウンドとフォアグラウンドに移動するのを検出する

公式の不可能または可能性の詳細に関するリンクがある場合は、お気軽にお申し込みください。

答えて

4

バックグラウンドに移動するとonPause()となり、再開するとonResume()となります。アクティビティのライフサイクルを参照してください。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

+0

請求書は正しいです。あまりにも多くの人々は、Androidのアプリケーションの動作をかなり「取得」していないようです。これは従来の方式ではありません。あなたのアプリは、コードの一部が現在実行されている場合を除いて、実際には実行中と見なすことはできません。それ以外の時間は存在していてもいなくてもかまいません。アンドロイドは状態を保存し、コードを再起動することも、起動しないこともあります。アクティビティのライフサイクルは誰もが10回以上読む必要があることの1つです。次に、すべてのOn [Whatever]イベントを含むテストアプリを作成して、いつ発生するのかを正確に確認します。 –

+8

onPause()は、別のアクティビティに移動するときにも起動されます。そして、そのアクティビティに戻るときのonResume()。 – Andy

+1

onResumeはうまくいきません。私はそれを試して、時には電話がロックされている間onResumeが呼び出されます。調べてみると、ドキュメントのonResumeの定義には、次のように書かれています。 onResumeは、あなたのアクティビティがユーザに見える最も良い指標ではありません。キーガードなどのシステムウィンドウが前面に表示されます。 onWindowFocusChanged(boolean)を使用して、ユーザーにアクティビティが表示されているかどうかを確認します(例:ゲームを再開する).http://developer.android.com/reference/android/app/Activity.html#onResume%28 %29 –

1

オーバーライドonStop()各活動に。このメソッドは、アクティビティがバックグラウンドになると呼び出されます。その後、時間をメモします。

オーバーライドonStart()です。これは、アクティビティがバックグラウンドからフォアグラウンドに移動するときに呼び出されます。次に、時間をメモします。

+1

あなたはonResume()とonPause()を意味すると思います。onStop()とonStart()は、アプリケーションを完全に終了し、完全にシャットダウンしたときに起動するときに使用されます。 onResume()とonPause()は、アプリケーションがバックグラウンドで実行されているときに使用されます。ホームボタンを押すと背景に移動し( 'onPause()')、戻るボタンを押すと閉じます( 'onStop()') – Andreas

1

バックグラウンドのフラグメントBから返されたアプリは、アクティビティのフラグメントAの出力に基づいて結果を再計算していました(フラグメントAはユーザー入力に基づいてフラグメントBにデータを送信します)。次のソリューションは、単純なブールチェックを使用しており、ほとんどの目的で機能するはずです。これは、私が古いFragmentBの結果を、アプリケーションから長い時間が経過しても保持することを可能にしました(FragmentBの結果がメモリーを必要としていないと仮定して、Androidがしばらく後にそれをきれいにする)。 ONSTART()onResume(の代わりに同じロジックを適用するサイドノートとして

//Code from Fragment B 
public class FragmentB extends Fragment { 
    Boolean app_was_in_background; 
    @Override public void onPause() { 
     super.onPause(); 
     app_was_in_background = true; 
    } 
    @Override public void onResume() { 
     super.onResume(); 
     if (getArguments() != null) { 
      String output_to_FragmentB = getArguments().getString("input_from_FragmentA"); 

      if (app_was_in_background == null || !app_was_in_background) { 
       app_was_in_background = false; 

       PerformMyAlgorithm(output_to_FragmentB); 
      } 
     } 
    } 
    public void PerformMyAlgorithm(String input) { 
     //Code that includes Spinners and calculations, where I want to app 
     //to return to the user's chosen spinner location and display 
     //results as the user saw them before switching to another app 
     //on the device. All this without explicitly "saving" the Spinner 
     //position and data in memory. 
    } 
} 

は)望ましくない結果をもたらすことができる:

PerformMyAlgorithmがFragmentA出力を受け取り、再び(すなわち文字列output_to_FragmentB。)自動的にをonResume()に入れずに、のユーザーがFragmentAのボタンをクリックすることで選択します(これは、AndroidがFragment lifecyclesを管理する方法によるものです)。

バックグラウンド(つまりonResume)からFragmentBビューと計算がリセットされ、再表示されるため、アプリをバックグラウンドに送信する前にすぐに結果を表示するのではなく、 )。

関連する問題