0

シナリオ時間のユーザ設定量の後にコードを発射する2つの方法:45分後..

ユーザーのEditTextに45(分)を入力し、「OK」ボタンを押下

しました私はコードのブロックを実行したいです。

私はこれを行うための2つの異なる方法の間で議論しています - WHYH IS BESTは&なぜですか?


オプション#1 - AlarmManager - > PendingIntent - >インテント - >でBroadcastListener
どの実装が最適ですか?

int timeValue = Integer.parseInt(editText_timer_value.getText().toString()); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    Intent intent = new Intent(this, TimerReceiver.class); 

    PendingIntent pendingIntent = PendingIntent 
      .getBroadcast(this.getApplicationContext(), 234324243, intent, 0); 

    alarmManager.set(AlarmManager.RTC_WAKEUP, 
      System.currentTimeMillis() + (timeValue * 60000), pendingIntent); 

    finish(); 

    // TimerReceiver.class fires when the time is up, and contains additional Code. 


(OR)

オプション#2 - インテント - >意図エクストラ - >サービス - > CountDownTimer

String timeValue = editText_timer_value.getText().toString(); 

    Intent intent = new Intent(this, TimerService.class); 

    intent.putExtra("TIMER_VALUE", timeValue); 

    getApplicationContext().startService(intent); 

    finish(); 

    // TimerService.class starts immediately and runs a CountDownTimer from intent Extras 



"より良い" または "正しい" で実装SO、そしてWHY?
ありがとうございます! :)

PS ..他の提案も非常に歓迎されています!

答えて

1

アラームマネージャー: このクラスは、システムアラームサービスへのアクセスを提供します。これにより、将来のある時点でアプリケーションを実行するようにスケジュールすることができます。アラームが解除されると、登録されたインテントがシステムによってブロードキャストされ、ターゲットアプリケーションがまだ実行されていない場合は自動的に開始されます。登録されたアラームは、デバイスがスリープしている間は保持されます(また、その時間中にデバイスがオフになった場合にデバイスを起動することもできます)が、オフになって再起動されるとクリアされます。

アラーム受信者のonReceive()メソッドが実行されている限り、アラームマネージャはCPUウェイクロックを保持します。これにより、ブロードキャストの処理が完了するまで、電話機がスリープ状態にならないことが保証されます。

注:アラームマネージャは、アプリケーションが現在実行されていなくても、特定の時刻にアプリケーションコードを実行したい場合に使用します。通常のタイミング操作(ティック、タイムアウトなど)では、Handlerを使用する方が簡単で効率的です。

はよりhttps://developer.android.com/reference/android/app/AlarmManager.html

サービスでそれについて学ぶ: サービスは、単にユーザがアプリケーションと相互作用していない場合でも、バックグラウンドで実行できるコンポーネントです。したがって、必要な場合にのみサービスを作成する必要があります。

メインスレッドの外で作業を行う必要があるが、ユーザーがアプリケーションとやりとりしている間だけ作業する必要がある場合は、代わりにサービスではなく新しいスレッドを作成する必要があります。たとえば、あなたのアクティビティが実行されている間だけ音楽を再生したい場合は、onCreate()でスレッドを作成し、onStart()で実行してからonStop()で停止します。また、従来のThreadクラスの代わりにAsyncTaskまたはHandlerThreadを使用することも検討してください。スレッドの詳細については、「プロセスとスレッド」のドキュメントを参照してください。

はマニュアルに従ってhttps://developer.android.com/guide/components/services.html

でのサービスについて学び、Androidはあなたが本当に実行時間の長い、重いタスクを実行するためにサービスを使用する必要があり、言います。特定の期間タイマーを使用したいのであれば、そのサービスを使用することは全くナンセンスであり、リソースを無駄にすることになります。

私はAlaramManagerを使用することをお勧めします。アンドロイドはドキュメントに記載しています。

+0

私の質問へのあなたの洞察力に感謝します..私のアラームマネージャの実装は正確に見えますか?再び、注意してください:ユーザーは、アラームが設定される時間(何分か選択します)を入力すると、タイマーがバックグラウンドで実行されている間にアクティビティウィンドウが閉じられます。だから私はタイマーがどうにか中断されないことを確認したい。電話機が再起動された場合、それ以外は問題ありませんが、タイマーが何とか殺されないようにしたいと思います。あなたはオプション#1が最善の選択肢であるというあなたの意見に支えられていますか? – StudioB

+0

あなたがドキュメントを読むと、AlarmManagerを使用してある程度の時間が経過した後にいくつかのタスクを実行しなくてはならないときに何をするべきか、そしてELAPSED_REALTIMEなどの4つの異なる方法でアラームを設定することができます。 ELAPSED_REALTIME_WAKEUP、RTC、RTC_WAKEUPここでは、4つ以上の異なるタイプの動作が異なるため、非常に注意する必要があります。少し実験を行い、ドキュメンテーションからそれらについて学び、あなたのニーズに最も適したものを見つけてください。 https://developer.android.com/training/scheduling/alarms.html – xFighter

+0

最後に2つの質問..アラームマネージャの拡張子 '.set'(' alarmManager.set'のように)が上の例で私のコードでは横切っていますか?それは減価償却される可能性があります..それは事実ですか?これは問題を引き起こす可能性があります..そして最後に、そうでなければ正しく実装されたように見えますか?たとえば、ユーザー入力の整数iに60,000を掛けてmsを分にすると、問題が発生する可能性があります。これは 'int'ではなく' long'である必要がありますか?私の例のように 'int'を使っても動作しますか?これらの2つの問題が両方とも大丈夫であることを確かめたいだけです..... – StudioB

関連する問題