2011-11-16 35 views
1

我有這樣的服務多服務不運行:Android的 - 如預期

public class AAAService extends Service { 

private Intent requestService; 
private Intent calendarService; 
private SharedPreferences servicePreferences; 

private static final String REQUEST_DELAY = "request_interval"; 
private static final int REQUEST_DELAY_DEFAULT = 900000; 
private static final String SERVICE = "service"; 
private static final String SOUND = "sound"; 
private static final String VIBRATE = "vibrate"; 

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

@Override 
public void onCreate(){ 
    super.onCreate(); 
    Log.i("daim", "AAAService has started ..."); 
    requestService = new Intent(this, RequestService.class); 
    calendarService = new Intent(this, CalendarService.class); 
    servicePreferences = getSharedPreferences(SERVICE, MODE_PRIVATE); 
    long delay = Long.valueOf(servicePreferences.getInt(REQUEST_DELAY, REQUEST_DELAY_DEFAULT)); 
    if(delay > 0){ 
     startRequestService(); 
    } 
    startCalendarService(); 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    Log.i("daim", "AAAService has stopped ..."); 
    stopRequestService(); 
    stopCalendarService(); 
} 

public void startRequestService(){ 
    startService(requestService); 
} 

public void stopRequestService(){ 
    stopService(requestService); 
} 

public void startCalendarService(){ 
    startService(calendarService); 
} 

public void stopCalendarService(){ 
    stopService(calendarService); 
} 

}

而這另外兩個服務:

public class RequestService extends AAAService 
public class CalendarService extends AAAService 

這兩個擁有的onCreate和方法的onDestroy ,以啓動和停止服務。 我在這裏面臨的問題是,當我從一個Activity開始我的AAAService時,它開始了,並且它啓動了另外兩個服務,但之後它被停止了(onDestroy方法),而且我沒有知道爲什麼! 這是我做什麼從我的動態:

Intent service = new Intent(this, AAAService.class); 
startService(service); 

任何幫助表示讚賞! 謝謝。

我的另外兩個服務:

public class CalendarService extends AAAService{ 

private CalendarApi calendarApi; 

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

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i("daim", "CalendarService has started ..."); 
    calendarApi = AAALifestyleApplication.calendarApi; 
    startService(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.e("daim", "CalendarService has stopped ...");  
} 

public void startService(){ 
    Log.d("daim", "UPDATING EVENTS FROM CALENDAR SERVICE!!!"); 
    ArrayList<Long> dates = new ArrayList<Long>(); 
    dates.add(0L); 
    dates.add(System.currentTimeMillis() * 2); 
    calendarApi.getEventsFromDrupal(dates, this, null); 
    stopSelf(); 
} 

}

public class RequestService extends AAAService implements RequestListener{ 

private Timer timer; 
private CommonApi commonApi; 
private NotificationManager nManager; 
private Notification notification; 
private PendingIntent pIntent; 
private Intent intent; 
private Context context; 
private SharedPreferences sharedPref; 
private long delay; 
private boolean sound, vibrate; 

private static final int INTERVAL_DEFAULT = 900000; 
private static final String SERVICE_NAME = "service"; 
private static final String INTERVAL_KEY = "request_interval"; 
private static final String SOUND = "sound"; 
private static final String VIBRATE = "vibrate"; 

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

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i("daim", "RequestService has started ..."); 
    sharedPref = getSharedPreferences(SERVICE_NAME, MODE_PRIVATE); 
    startService(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.e("daim", "RequestService has stopped ..."); 
    if(timer != null){ 
     timer.cancel(); 
    } 
} 

public void startService(){ 
    Log.d("daim", "UPDATING REQUESTS FROM REQUEST SERVICE!!!"); 
    int intervalInteger = sharedPref.getInt(INTERVAL_KEY, INTERVAL_DEFAULT); 
    delay = Long.valueOf(intervalInteger); 
    sound = sharedPref.getBoolean(SOUND, true); 
    vibrate = sharedPref.getBoolean(VIBRATE, true); 
    Log.d("daim", "sound: " + sound); 
    Log.d("daim", "vibrate: " + vibrate); 
    Log.d("daim", "delay: " + delay); 
    commonApi = AAALifestyleApplication.commonApi; 
    timer = new Timer(); 
    if(delay > 0){ 
     timer.scheduleAtFixedRate(new TimerTask() {  
      @Override 
      public void run() { 
       if(commonApi.isLoggedIn()){ 
        commonApi.getRequests(RequestService.this, false); 
       }  
      } 
     }, 0, delay); 
    } 
} 

@Override 
public void onRequestResult(ArrayList<Request> requests) { 
    for(Request r : requests){ 
     if(!commonApi.hasRequest(r)){ 
      sendNotification(); 
     } 
    } 
} 

@Override 
public void onAuthenticationError() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onConnectionError() { 
    // TODO Auto-generated method stub 

} 

private void sendNotification(){ 
    context = getApplicationContext(); 
    nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    notification = new Notification(R.drawable.icon, "You received new requests", System.currentTimeMillis()); 
    intent = new Intent(getBaseContext(), RequestsActivity.class); 
    pIntent = PendingIntent.getActivity(getBaseContext(), 0, intent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK); 
    notification.setLatestEventInfo(context, "Request notification", "Click here to see your requests", pIntent); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    if(vibrate){ 
     notification.defaults |= Notification.DEFAULT_VIBRATE; 
    } 
    if(sound){ 
     notification.defaults |= Notification.DEFAULT_SOUND; 
    } 
    nManager.notify(0, notification); 
} 

}

+0

發佈您的RequestService.onCreate()和CalendarService.onCreate()代碼可能會幫助其他人找到您的問題。 – yorkw

回答

0

您的服務繼承/多態性層次結構混淆了所有服務創建生命週期。以CalendarService爲例,CalendarService.onCreate()中的第一件事是在超級服務onCreate方法(您的AAAService.onCreate())中調用它的super.onCreate()它啓動具體的服務(您的CalendarService),所以兩者您的AAAService和CalendarService將遞歸創建多次。

如果AAAService唯一做的是創建其子服務,那麼您應該放棄AAAService並直接在您的活動中創建/啓動CalendarService和RequestService。

或者,你可以簡單地嘗試打破你的繼承/多態,並使所有的服務獨立。它應該解決你的問題。

0

糾正我,如果我錯了,但你難道不啓動CalendarServiceAAAService onCreate?這就是爲什麼你CalendarService啓動時啓動AAAService

+0

是的,這就是我想要的。但是,在AAAService啓動後,它在CalendarService和RequestService啓動後停止。不知道爲什麼=/ – Carnal

+0

AA服務停止後CalendarService和RequestService正在運行? – Toorop

+0

是的,他們仍在運行! – Carnal

1

在我CalendarService我有方法stopSelf();我認爲自己停止了,但也停止了AAAService,這也將停止RequestService。問題解決了!