2012-01-23 3 views
3

У меня есть следующий сценарий: Я пишу приложение, которое действует как клиент чата. Он подключается к серверу при запуске и прослушивает сообщения (сетевые вещи обрабатываются службой). Моя проблема заключается в нескольких секундах после выхода из системы (соответствующий метод отправляет сигнал на сервер, а затем останавливает службу и вызывает завершение()), приложение, похоже, снова регистрируется, ничего не делая (я вижу это на сервере журналы). Я не уверен, как справиться с этой проблемой, что я имею в виду - это предотвращение повторного подписания приложения в фоновом режиме. Метод sign on вызывается службой, созданной в методе onCreate моего основного действия. Я еще не очень хорошо знаком с Android и надеюсь, что кто-нибудь может дать мне подсказку. Спасибо заранее.Предотвращение действия от выполнения чего-либо в фоновом режиме

С уважением, SMAU

Edit для кода добавления: И я признал в LogCat я получаю сообщение типа «планирования перезагрузки разбитого службы в XXXX мс» Метод initNetwork и класс таймера укорочены, есть это только очень большой идентификатор сетевого файла, который не должен выполняться автоматически из-за перезапуска автосервиса.

public class NetworkService extends Service { 

public static String path; 
static ClientUserConfig myConfig; 
private ChatKeys keys; 

static Frontend_CS front_cs; 
static Frontend_CK front_ck; 

public static Boolean runOnce = true; 

private String server_ip = "10.0.2.2"; 

private static PPAClientActivity MAIN_ACTIVITY; 
private int serverConnectionTimer; 

private HashedWheelTimer timer; 

private final LinkedList<String> chatWindows = new LinkedList<String>(); 


class TimedChecksAndroid implements TimerTask { 

     public void run(Timeout tmt) { 
      String senderEmail; 
      String senderFullname; 
      LinkedList<String> list; 
      int selection; 
      int chatNum; 

      ClientUserEntry user; 

      if (serverConnectionTimer>=60){ 



} 





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

    super.onDestroy(); 


    shutdownService(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STOPPED); 
    } 
} 

private void shutdownService() { 

    Log.d("SERVICENET", "Shutdown reached."); 

    if(NetworkService.front_cs.getServer_handler() != null) { 
     Log.d("SERVICENET", "IF Block Sign OFF reached."); 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add(NetworkService.myConfig.getEmail()); 
     NetworkService.front_cs.getServer_handler().sendMessage(new UniversalContainerMessage(ppa.utils.Constants.CS_GOING_OFFLINE_OPCODE,list)); 
    } 

} 
@Override 
public void onCreate() { 

    Log.d("SERVICENET", "Service creation started."); 

    super.onCreate(); 

    path = getExternalFilesDir(null).getAbsolutePath().toString() + "/"; // TODO erzeugt manchmal nullpointer? 


    initNetwork(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STARTED); 
    } 

} 



private void initNetwork() { 

    String fullname = null; 
    String email = null; 
    boolean cfgBuildSuccess = true; 



    serverConnectionTimer = 0; 
    timer = new HashedWheelTimer(); 
    timer.newTimeout(new TimedChecksAndroid(), ppa.utils.Constants.CHATCLIENT_CHECK_INTERVAL, TimeUnit.MILLISECONDS); 
    //schedular = new SchedularDialog(this, false, myConfig, front_cs); 

} 

public String getPath() { 
    return path; 
} 

public static void setMainActivity(PPAClientActivity activity) { 
     MAIN_ACTIVITY = activity; 
    } 

}

+0

Вы использовали какой-либо широковещательный приемник, который запускает службу? – Elad92

+6

Скорее всего, мы сможем помочь вам, если вы опубликуете код из своей деятельности и службы ;-) – FoamyGuy

+0

Я отредактировал свое сообщение и добавил важные части кода, но если что-то не хватает, пожалуйста, скажите мне – sMau

ответ

1

Есть два способа запуска/остановки службы.

  1. Служба началась с Context.startService(). Чтобы остановить такую ​​услугу, ваша деятельность должна вызвать stopService(), или сама услуга должна позвонить stopSelf().
  2. Служба началась с Context.bindService(). Чтобы остановить связанную услугу ВСЕ, ваша деятельность, которая называется bindService(), должна звонить unbindService().

При запуске службы с помощью метода 1, onStartCommand() метод в вашей службе будет называться и так как вы не имеете, что я предполагаю, что вы используете 2-й способ. Если это так, я предполагаю, что либо не все ваши действия называются unbindService(), либо после того, как служба была остановлена, происходит действие, которое вызвало bindService.

Возможно, вы захотите проверить Service API как пример запуска/остановки службы.

Смежные вопросы