У меня есть приложение с активностью, отправляющей трансляцию в другое действие. Все кажется прекрасным. Но если я закрою свое приложение и снова его открою, этот трансляции, похоже, отправляются более одного раза. Фактически, он получает сообщение , поскольку я часто открывал приложение. Если я распечатаю «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();
}
Это на эмуляторе или на устройствах? если да, то какое устройство/версия работает? Наконец, как вы заканчиваете действие? Конец()? если это так, то активность не «закрыта», а скорее удалена из фокуса приложения ...... Также, как, где, когда вы отправляете трансляцию? – Bonatti
@Bonatti Это на моем устройстве. Я попробовал это на разных устройствах. Мне нужно проверить версию, я скажу вам позже. О закончить не закрывает активность? Как я могу закрыть его? Я закрываю его, нажимая кнопку «назад». После того, как он закрыт, я снова его открываю. Я получаю сообщение с моей службы. Когда я получу, я отправляю трансляцию себе в другую деятельность. – progNewbie
В Android вы никогда не должны «выходить» из своего приложения. Стоимость энергии выделения памяти выше, чем запуск/завершение приложения. Вот почему ваше приложение работает в вашем процессе. Чтобы «завершить» программу, вы должны вызывать «System.exit (0)». Но это затмевает, так как ваш пользователь может захотеть снова проверить ваше приложение и даже «перевернуть экран», в результате чего ваша деятельность будет воссоздана ... По умолчанию нажатие 'Back' просто вызывает вашу функцию onPause. .. отредактируйте свой вопрос, опубликуйте, как/когда вы отправляете трансляцию. – Bonatti