使用AlarmManager启动服务

时间:2014-05-08 12:38:08

标签: android android-service alarmmanager

我使用alarmManager每小时启动一次服务创建通知的服务,但结果是我在一小时内收到多个通知,服务是否启动onStartCommand()方法或者究竟发生了什么?

AlarmManager:

cal = Calendar.getInstance();
        triggerAtTime = cal.getTimeInMillis()+ (1 * 30 * 60 * 1000); // starts in 30 minutes
        repeat_alarm_every = (1 * 60 * 60 * 1000); // repeat every 2 hour
        int _id = (int) System.currentTimeMillis();
        Intent intent = new Intent(Alarm.this, NotificaSpeed.class);
        pintent = PendingIntent.getService(Alarm.this, _id, intent, 0);
        alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, repeat_alarm_every, pintent);

服务:

    public class NotificaSpeed extends Service{

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
@Override
public void onCreate() {

    mNotificationManager = (NotificationManager) getSystemService(ns);
    super.onCreate();
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    new VerifySpeedCar().execute();
    return super.onStartCommand(intent, flags, startId);
}

public void notification(int carsNumber, int speed){
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(NotificaSpeed.this);
    if(carsNumber != 0)

        notificationBuilder.setContentTitle(carsNumber+" cars are exceeding the speed");

                        .setSmallIcon(R.drawable.ic_launcher)
                        .setAutoCancel(true);
    final int _idI = (int) System.currentTimeMillis();
    Intent notificationIntent = new Intent(NotificaSpeed.this, ListCars.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, _idI, notificationIntent, 0);
    notificationBuilder.setContentIntent(contentIntent);

    notificationBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

    mNotificationManager.notify(SIMPLE_NOTIFICATION_ID, notificationBuilder.build());

}

class VerifySpeedCar extends AsyncTask<String, String, String> {

protected String doInBackground(String... args) {
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair(TAG_ACCOUNTID, accountID));
    params.add(new BasicNameValuePair(TAG_SPEEDKPH, ""+speedpref)); // how can I get the value of edittext of the speed from the sharedpreferences?

        JSONObject json = jParser.makeHttpRequest(url, "GET", params);
        try {
            int success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                cars = json.getJSONArray(TAG_CARS);
                carsNumber = cars.length();
            } else 
                carsNumber = 0;

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    return null;
}
protected void onPostExecute(String file_url) {
  if( carsNumber != 0){
      notification(carsNumber, speedpref);
  }
}}}

1 个答案:

答案 0 :(得分:1)

因为Service重复了AlramManager,所以在任务完成时停止Service非常重要。

<强> MyService.java

public class MyService extends Service {
    @Override
    public void onStart(Intent intent, int startId) {
        //do your task here

        stopSelf(); // important to stop service here
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

您已经知道如何使用警报管理器启动服务。