2016-03-10 2 views
-3

У меня есть приложение с активностью, отправляющей трансляцию в другое действие. Все кажется прекрасным. Но если я закрою свое приложение и снова его открою, этот трансляции, похоже, отправляются более одного раза. Фактически, он получает сообщение , поскольку я часто открывал приложение. Если я распечатаю «Activity.this» прямо перед отправкой трансляции, я получаю разные экземпляры.Дублированное событие - Несколько вопросов о событии трансляции при закрытии/повторном открытии приложения

Почему это могло случиться? Почему деятельность не умирает? Я проверил, onDestroy получить называется. НО у меня есть фоновое обслуживание, которое я не останавливаю, когда приложение закрыто. Это так? Могу ли я снова открыть старую активность при запуске приложения вместо открытия нового?

Установка режима запуска в манифесте для singleTask или singleInstance также не работала.

EDIT Даже используя AtomicInteger как во втором ответе здесь Prevent multiple instances of my Android application composed of a single activity не работает.

Спасибо!

Edit:

Я получил широковещательный приемник в ClientActivity (основной), как, что, исходя из моей службы. Здесь я отправляю трансляцию на другую активность (MessageActivity).

private BroadcastReceiver serviceMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d("test", ClientActivity.this.tostring(); 
      sendToMessageActivity(newDBMessageStr, "updateMessageList"); 
     } 
    }; 

    private void sendToMessageActivity(String message, String putExtra) 
    { 
     Intent intent = new Intent("de.blabla.bla.sendToMessageActivity"); 
     sendLocationBroadcast(intent, message, putExtra); 
    } 

    private void sendLocationBroadcast(Intent intent, String message, String putExtra) 
    { 
     intent.putExtra(putExtra, message); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 

Я зарегистрировал это в OnCreate-методе в ClientActivity:

LocalBroadcastManager.getInstance(this).registerReceiver(
       serviceMessageReceiver, new IntentFilter("de.blabla.bla.serverMessage")); 

Другая деятельность называется «MessageActivity», который получает трансляцию с ClientActivity (основной), как описано выше, регистрирует следующее в OnCreate:

LocalBroadcastManager.getInstance(this).registerReceiver(
       mainMessageReceiver, new IntentFilter("de.freshD.crapapp.sendToMessageActivity")); 

Позже он получает сообщение здесь:

private BroadcastReceiver mainMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      ... 
     } 
    }; 

EDIT:

@Override 
    protected void onPause() { 
     super.onPause(); 
    } 

@Override 
public void onDestroy() 
{ 
    try 
    { 
     unregisterReceiver(serviceMessageReceiver); 
    } 
    catch (Throwable e)    //IOException e 
    { 
     Log.d(logtag, "...Error data send: " + e.getMessage() + "..."); 
    } 

    super.onDestroy(); 
} 

Оу, когда OnPause называется, мне нужно разрегистрировать приемник там?

Я редактировал OnPause так: (это не исправить ошибку)

@Override 
    protected void onPause() { 
     try 
     { 
      unregisterReceiver(serviceMessageReceiver); 
     } 
     catch (Throwable e)    //IOException e 
     { 
      Log.d(logtag, "...Error data send: " + e.getMessage() + "..."); 
     } 
     super.onPause(); 
    } 
+0

Это на эмуляторе или на устройствах? если да, то какое устройство/версия работает? Наконец, как вы заканчиваете действие? Конец()? если это так, то активность не «закрыта», а скорее удалена из фокуса приложения ...... Также, как, где, когда вы отправляете трансляцию? – Bonatti

+0

@Bonatti Это на моем устройстве. Я попробовал это на разных устройствах. Мне нужно проверить версию, я скажу вам позже. О закончить не закрывает активность? Как я могу закрыть его? Я закрываю его, нажимая кнопку «назад». После того, как он закрыт, я снова его открываю. Я получаю сообщение с моей службы. Когда я получу, я отправляю трансляцию себе в другую деятельность. – progNewbie

+0

В Android вы никогда не должны «выходить» из своего приложения. Стоимость энергии выделения памяти выше, чем запуск/завершение приложения. Вот почему ваше приложение работает в вашем процессе. Чтобы «завершить» программу, вы должны вызывать «System.exit (0)». Но это затмевает, так как ваш пользователь может захотеть снова проверить ваше приложение и даже «перевернуть экран», в результате чего ваша деятельность будет воссоздана ... По умолчанию нажатие 'Back' просто вызывает вашу функцию onPause. .. отредактируйте свой вопрос, опубликуйте, как/когда вы отправляете трансляцию. – Bonatti

ответ

1

Всегда убедитесь, что вы регистрируетесь и регистрацией какой бы то ни приемников, которые вы используете в той же «цели».

The:

LocalBroadcastManager.getInstance(this).unregisterReceiver(serviceMessageReceiv‌​er);

и

Context.unregisterReceiver(serviceMessageReceiv‌​er);

На заметку: использование unregisterReceiver(serviceMessageReceiv‌​er) означает, что вы используете this ссылку, что указывает на локальный контекст, что вам добавляют код.

Это два разных «наблюдателя», один для каждого вида вещания.

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