1

サービス内での 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);
    }
}
4

3 に答える 3

0
public void setTimesForEvery(String time) {

    String[] array = time.split(":");
    String h = array[0];
    String m = array[1];
    hour = Integer.parseInt(h);
    min = Integer.parseInt(m);

    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, System.currentTimeMillis(),cal.getTimeInMillis, pi);


}

あなたの完全な要件は明確ではありません。しかし、これらのことをして、もう一度やり直してください。onPostExecute() メソッドの先頭に super.onPostExecute() 行を配置します。

「setPrayerTimes(urls[0])」このメソッドの値を onPostExecute() に返し、その値を時間パラメーターとして解析します。

問題が発生した場合は、完全な要件を英語で明確に説明してメールで送信してください。

于 2013-11-16T08:49:36.243 に答える
0

これを試して

 AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
 alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), displayIntent);                
于 2013-11-15T11:14:49.850 に答える