机器人 - 多服务不按预期运行 [英] Android - Multiple services don't run as expected

查看:100
本文介绍了机器人 - 多服务不按预期运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的服务:

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方法,以启动和停止服务。 我在这里面临的问题是,当我开始我的AAAService从一个活动就被启动,是它启动其他两个服务,但紧接着就被拦住(的onDestroy方法),我不知道为什么! 这是我从我的活动做的:

Both these has onCreate and onDestroy method, in order to start and stop the service. The problem I'm facing here, is that when I start my AAAService from the an Activity it gets started, and yes it starts the other two services, but right after that it get stopped (onDestroy method), and I don't know why! This is what I do from my Activity:

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

任何帮助是AP preciated! 谢谢你。

Any help is appreciated! Thanks.

我的另外两个服务:

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

}

推荐答案

您服务继承/多态性层次搞乱了你所有的服务创造的生命周期。以CalendarService作为一个例子,在CalendarService.onCreate的第一件事()被调用它的super.onCreate(),在超级服务onCreate方法(您AAAService.onCreate()),它启动了具体的服务(你CalendarService),所以两者您AAAService和CalendarService得到递归创造了许多次。

Your service inheritance/polymorphism hierarchy mess up all your services creation lifecycle. Take CalendarService as an example, the first thing in CalendarService.onCreate() is calling its super.onCreate(), in the super service onCreate method(your AAAService.onCreate()) it start the concrete service (your CalendarService), so both your AAAService and CalendarService get recursively created many times.

如果唯一AAAService确实创建它的子服务,你应该放弃你的AAAService和直接创建/启动CalendarService和RequestService在你的活动。

If the only thing AAAService does is created its child service, You should drop your AAAService and directly create/start your CalendarService and RequestService in your Activity.

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

Alternatively, you can simply try break your inheritance/polymorphism and make all your services independent. it should fix your problem.

这篇关于机器人 - 多服务不按预期运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆