2014-05-08 37 views
-4

我使用alarmManager來啓動每小時服務創建通知的服務,但結果是我在一個小時內得到多個通知,服務是否啓動onStartCommand()方法或發生了什麼?使用AlarmManger啓動服務

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

發佈您的代碼... – SMR

+0

@SMR我已經做了,但沒有ansewrs http://stackoverflow.com/questions/23539400/use-alarmmanager-and-service-to-get-data-from-server-repeatedly – Abdel

+0

只需發佈您的代碼只與警報管理器和服務在這裏。 – SMR

回答

1

因爲ServiceAlramManager重複其停止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; 
    } 
} 

你已經知道如何使用報警管理器啓動服務。

+0

感謝您的回答,那麼這是定期獲取數據的最佳方式嗎?這是開始服務的正確方法嗎?請最後一個問題,當我在數據庫中驗證時,我不想驗證數據中我已經驗證過任何想法。 – Abdel

+0

'當我在數據庫中驗證時,我不想驗證數據中我已經驗證過任何想法請'我沒有明白你的意思@AbdelkarimTinguer – SMR