2011-11-16 52 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。问题解决了!