предотвращение активности в фоновом режиме - PullRequest
3 голосов
/ 23 января 2012

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

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

Изменить для добавления кода: И я узнал в logcat, я получаю сообщение типа «Планирование перезапуска сбой службы в хххх мс» Метод 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;
    }

}

1 Ответ

1 голос
/ 27 января 2012

Существует два способа запустить / остановить службу.

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

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

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

...