2016-06-13 11 views
7

これはここで繰り返し質問されるかもしれませんが、私はまだこの問題に直面しています。前もって感謝します。15分ごとにアンドロイド機能を実行する方法、特に毎日15分にアンドロイド機能を実行する方法は?

アラームマネージャを、15分間隔、たとえば毎日8時15分、8時15分、8時30分、8時45分、9時などのように、特に実行するように設定するにはアプリケーションが起動される時間に関係なく、

たとえば、アプリケーションのメインアクティビティが7:47に開始されたとします。アラームを8:00に開始し、8:15、8:30などに続けます。どうすればいいですか?任意の提案が与えられている場合、私は本当に良い

+0

あなたは1つではなく2つのアラームマネージャーを設定する必要があると思います。 – pooyan

+0

これはAndroid 6.0以降では実用的ではありません。ユーザーがバッテリー最適化ホワイトリストにあなたのアプリを追加しない限り、Dozeモードはタイミングの正確な制御を妨げます。この種の精度はもちろんのこと、バックグラウンドで作業する必要がないように、アプリを設計することを強くお勧めします。 – CommonsWare

+0

@CommonsWareは、コメントのおかげで、これはAndroidプラットフォームの上位バージョンでは実用的ではないことを理解しましたが、私は現在、デバイスが電源モードに依存するAndroid 2.3で動作する独自のデバイスで作業しています。トップ24×7は、そのような面倒な作業が必要ですので、そのような状況について何か提案がありますか? – XXX

答えて

1

セットアップ2つのアラームを管理する必要があります最初の1つのトリガ時間は、適切な時間(たとえば午前8時)までの残り時間を計算することによって行います。その後、15分ごとにトリガーする最初のアラームマネージャー内に別のアラームマネージャーを作成する必要があります。

Calendar c = Calendar.getInstance(); 
int m = calendar.get(Calendar.MINUTE); 
long start = System.currentTimeMillis(); 
int remain=0; 
if (m<15) 
{ 
remain = 15-m; 
} 
else if (m<30) 
{ 
remain = 30-m; 
} 
else if (m<45) 
{ 
remain = 45-m; 
} 
else 
{ 
remain = 60-m; 
} 
remain=start + remain*60*1000// convert it to milisecond and plus it to current time; 

編集

その後、セットアップ最初のアラーム管理するには以下のコードを使用することができます:

AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, FirstReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    am.set(AlarmManager.RTC_WAKEUP,remain, pi); 
怒鳴るコードを使用して設定された第1のアラームマネージャのための計算時間のため

FirstReceiverクラスでは、次のようになります。

public class FirstReceiver extends BroadcastReceiver 
{ 
//do what ever you want + code bellow to setup second alarm manager 
Intent intent = new Intent(this, SecAlarm.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager am= (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(), 
       15*60*60,pendingIntent); 
} 
+0

提案していただきありがとうございます、これは可能な解決策のように聞こえますが、この例がありますか? – XXX

+0

私はそれを実装していないが、より明確にしたい場合、私はいくつかの擬似コードをもたらすことができます。 – pooyan

+0

@XXX私の答えを編集して、最初のアラーム時間を計算する方法を示します。 – pooyan

1

はあなたが

public void setAlarm(Context context) { 
    AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, Alarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, yourTimeInMilisecond, 24 * 60 * 60 * 1000, pi); // Millisec * Second * Minute 
} 

ここyourTimeInMillisecond 1日間隔で欲しい毎回のアラームクロックを設定する..あなたがいる場合のように、アラームを設定したい時間をされていただければ幸いですあなたは明日午前9時のアラームを設定したい、それは次のようになります。

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 9); 
calendar.set(Calendar.MINUTE, 0);  
calendar.add(Calendar.DAY_OF_YEAR, 1); 
long yourTimeInMilisecond = calendar.getTimeInMillis(); 

が、それはあなたのために働くことを願っています:)

+0

しかし、提案をお寄せいただきありがとうございます。アラームを設定する特定の時間はありません。私は自分のアクティビティの開始時にその機能を実行したいと思います...私のアクティビティが7:47に開始されても、それはまだ15分しかし、私は関数が8時に実行されるようにしたいだけです。 – XXX

+0

@ Neo自分でミリ秒単位で時間を計算するのではなく、 'DateUtils.DAY_IN_MILLIS'を使う方がきれいです。 –

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

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
    + (time limits), pendingIntent); 
+0

いくつかの説明は素晴らしいでしょう。 –

+0

このコードが何をしているのか、またこのアプローチを提案する根拠が何も説明されていない場合、この回答は役に立ちません。次に何が起きるかは、あなたが何の説明もしていないので、コードをコピー&ペーストして問題に遭遇するということです。しかし、これはあなたの最初の答えでしたので、[あなたの答えを大きくするためのヒント](http://stackoverflow.com/help/how-to-answer)を見てください。 – ishmaelMakitla

関連する問題