Я недавно закончил приложение, начал его профилировать для использования процессора и памяти и обнаружил утечку памяти:
В простом приложении с 3 вкладками, где каждая вкладка имеет отдельную функцию, у меня есть кнопка на вкладке Tab3, которая отправляет пользователя обратно на вкладку Tab1 вместе с messageId. Операция, связанная с Tab1, улавливает эту дополнительную информацию и отображает сообщение, если оно присутствует. Ниже приведена информация о кнопке в Tab3:
public void onClick(View arg0) {
Intent notificationIntent = new Intent(getApplicationContext(), TabContainerActivity.class);
notificationIntent.setAction("com.test.notify.MESSAGE");
notificationIntent.putExtra(MessageBean.MESSAGE_ID, messageId);
startActivity(notificationIntent);
}
Контейнер вкладок TabContainerActivity.class
реплицирует Extras
на дочерние действия. Он также имеет логику для захвата Action
, отправленного с намерением, и, если он найден, он используется, чтобы решить, какую вкладку установить в качестве текущей:
if(getIntent().getExtras() != null ) intent.putExtras(getIntent().getExtras());
if(getIntent().getAction().equalsIgnoreCase("com.test.notify.MESSAGE"))
{
tabHost.setCurrentTab(0);
}
else if(getIntent().getAction().equalsIgnoreCase("com.test.notify.SETTINGS"))
{
tabHost.setCurrentTab(1);
}
...etc...
С помощью приведенного выше кода вы можете перемещаться между вкладками в обычном режиме, вы также можете нажать на сообщение в Tab3 и полностью отобразить его в Tab1 - Отлично! В будущем код можно будет легко изменить, чтобы другие приложения могли передавать MessageID на первое действие вкладок, Wonderfu!
Однако - это поведение теперь налицо:
- Нажмите Tab3,
- Выберите сообщение
[[Отправлено новое намерение, открывающее новое
TabContainerActivity
действие]]
- Внутри этого действия нажмите Tab3,
- Выберите другое сообщение
[[Новое намерение отправлено, открывая ДРУГОЙ новый
TabContainerActivity
деятельность]]
- (повторите 3 и 4 и 5)
Надеюсь, вы видите проблему! Вы можете пройти 1030 * через каждое из этих действий, убрав их из стека, но из-за рекурсивного характера проблемы вы можете продолжить навигацию, создавая новое действие с каждым проходом, вплоть до исключений OutOfMemory.
Итак, к вопросу;
Я хочу, чтобы функциональность, содержащаяся в действии Tab1, запускалась всякий раз, когда вкладка становится видимой (в данном случае загрузка сообщения), поэтому я бы хотела оставить ее как действие в отдельности. Сказав это, при переходе к я хочу, чтобы это была единственная активность вкладок, которая находится в стеке. Как мне этого добиться?
Буду признателен за любую помощь и обсуждение!