サービス内での AlarmManager の設定に関して質問があります。特定のネットワーク アクティビティを実行する (時間データを取得する) サービスを開始する AlarmManager を作成し、そのネットワーク パフォーマンスの直後に、このサービスは Web サービスから取得した時間データに基づいてアラームを設定する必要があります。今、私はこの主な活動をしています:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_screen);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 21);
cal.set(Calendar.MINUTE, 44);
cal.set(Calendar.SECOND, 0);
Intent intent = new Intent(this, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0,
intent, 0);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);
}
そして、サービスを開始するこのレシーバー:
public class Alarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Intent i = new Intent(context, PrayerTimeService.class);
context.startService(i);
}
そして、このサービス:
public class TimeService extends Service {
@Override
public void onCreate() {
Toast.makeText(getBaseContext(), "Service is created", Toast.LENGTH_SHORT).show();
super.onCreate();
}
@Override
public void onDestroy() {
Toast.makeText(getBaseContext(), "Service is destroyed", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(), "Service is sunning",
Toast.LENGTH_SHORT).show();
new SetTimeTask().execute(URL_ISLAMICFINDER);
stopSelf();
return START_STICKY;
}
private class SetTimeTask extends AsyncTask<String, Void, String> {
.... some network jobs
}
ここで、サービスのここでアラームマネージャーを設定する必要があります。どうすればよいですか?
UPDATEにより AlarmManager が追加されました: //これらは、時間データを文字列として取得するためのサービス内のフィールドです。プライベート文字列の日の出値; プライベート文字列 noonTimeValue; プライベート文字列の午後の時間値。プライベート文字列の夕方の時間値; プライベート文字列 nightTimeValue; //変換に使用される整数値 int morningTimeHour; int fajrTimeMin;
//this is a method in the service and will be called in the onPostExecute();
public void setTimesForEvery(int hour, int min) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, min);
cal.set(Calendar.SECOND, 0);
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmForEvery.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);
}
//this method converts the string time to integer values
public void convertTime(String time, int hour, int min) {
String[] array = time.split(":");
String h = array[0];
String m = array[1];
hour = Integer.parseInt(h);
min = Integer.parseInt(m);
}
// this is asynctask
private class SetTimeTask extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... urls) {
setPrayerTimes(urls[0]);
return true;
}
@Override
protected void onPostExecute(Boolean result) {
Toast.makeText(getBaseContext(), fajrTimeValue + "|" +
zuhurTimeValue + "|" +asrTimeValue + "|" + maghribTimeValue + "|" +
ishaTimeValue, Toast.LENGTH_LONG).show();
convertTime(fajrTimeValue, morningTimeHour, fajrTimeMin);
setTimesForEvery(21, 45);
super.onPostExecute(result);
}
}