Android - 多个服务无法按预期运行

时间:2011-11-16 10:49:46

标签: android service

我有这项服务:

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);
}

}

3 个答案:

答案 0 :(得分:1)

在我的CalendarService中,我有方法stopSelf();我认为它已停止,但也停止了AAAService,它也将停止RequestService。问题解决了!

答案 1 :(得分:0)

如果我错了,请纠正我,但是你不是从 AAAService onCreate 开始 CalendarService 吗?这就是你启动 AAAService

时启动 CalendarService 的原因

答案 2 :(得分:0)

您的服务继承/多态性层次结构会破坏您的所有服务创建生命周期。以CalendarService为例,CalendarService.onCreate()中的第一件事就是调用它的super.onCreate(),在超级服务onCreate方法(你的AAAService.onCreate())中启动具体服务(你的CalendarService),所以两者都是您的AAAService和CalendarService会多次递归创建。

如果AAAService所做的唯一事情是创建其子服务,您应该删除您的AAAService并直接在您的Activity中创建/启动CalendarService和RequestService。

或者,您可以简单地尝试破坏继承/多态并使所有服务独立。它应该解决你的问题。