Обновить активность в Android


220

Это хорошая практика для перезагрузки Activityв Android ?

Каков будет лучший способ сделать это? this.finishа потом this.startActivityс активностью Intent?


3
Я не опытный разработчик для Android, но перезапуск Activity походит на плохой дизайн и должен выполняться только в крайних случаях.
Гудзон

@ Hudson Это то, что происходит при изменении конфигурации. Если это хороший дизайн или нет, это совсем другое обсуждение. ;)
hpique

1
@Hudson Итак, теперь вы 5 лет опыта разработчика: D
Пратик Бутани

@PratikButani, я тебя знаю? :) У меня уже 8 лет опыта, но не так много в разработке Android.
Хадсон

Вы посетили мой профиль, который я знаю: P @Hudson
Pratik Butani

Ответы:


521

Вы можете просто использовать

finish();
startActivity(getIntent());

чтобы освежить себя Activityизнутри.


2
Что делать, если он не может быть вызван внутри класса активности? Любой способ сделать это с помощью ссылки на контекст?
giorgiline

1
@giorgiline - Да, создайте интерфейс, который вы определяете внутри класса активности, и передайте этот интерфейс в качестве параметра любому внешнему классу, из которого вы его используете.
aggregate1166877

1
Вау, я НЕ думал, что это будет так просто.
theblang

1
Как вы можете справиться с деятельностью, которая была начата для достижения результата? Можете ли вы перезапустить это, если исходящий абонент все еще получает результат?
tothphu

1
@tothphu - Не пытался, но теоретически я думаю, что да. Однако во второй раз, когда действие заканчивается, оно не вернет результат в действие, созданное им впервые.
Суш

64

для тех, кто не хочет видеть этот миг после метода refreshate (), просто используйте

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
Потрясающие! Я хотел отменить переход, чтобы пользователь не заметил!
Седди Мухоза

Прекрасная работа! Пользователь едва заметит перезагрузку.
Сэм

38

Это то, что я делаю, чтобы перезагрузить действие после изменения, возвращаясь из изменения предпочтений.

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

Это по существу заставляет деятельность перерисовывать себя.

Обновлено: лучший способ сделать это - вызвать recreate()метод. Это приведет к воссозданию активности.


15
Это может работать, но настоятельно не рекомендуется явно вызывать методы жизненного цикла.
ITisha

Если вы выберете этот маршрут, вы должны использовать отдельный метод init (), который все настраивает и вызывает его из onCreate () и onResume (), вместо вызова onCreate ().
Том

1
Отличное решение, за исключением того, что оно не будет работать в некоторых ситуациях, когда ваши методы жизненного цикла используются для других целей. Например, я получаю доступ к камере телефона, и когда фотография сделана, экран возвращается к моей активности, чтобы опубликовать ее в виде. Используя методы обновления жизненного цикла, я выхожу из процесса камеры, и моя фотография не возвращается к действию, а скорее получает действие с самого начала. Просто пример, чтобы быть в курсе.
Azurespot

1
Важно учитывать стартовый режим действия при использовании restate (). Например, когда я вызываю метод refreshate () для операции с launchMode = singleTop, я не вижу, чтобы onCreate () вызывался впоследствии. OTOH, если вместо того, чтобы вызывать refreshate (), я явно вызываю finish (), а затем startActivity (), я вижу, что onCreate () вызывается впоследствии.
Альберт С Браун

14

Я видел ранее ответы, которые были даны для перезагрузки деятельности с помощью Intent. Они будут работать, но вы также можете сделать то же самое, используя метод refreshate (), указанный в самом классе Activity.

Вместо того, чтобы писать это

// Обновить основное действие после закрытия диалогового окна

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

Это можно сделать, написав это только

recreate();

recreate()было решением для меня - «перезапуск» действия не работал для меня, так как я запустил действие, используя «StartActivityForResult», и это нарушило поведение.
KYL3R


10

Мне нужно было в срочном порядке обновить список сообщений в одном из моих приложений, поэтому я просто выполнил обновление своего основного пользовательского интерфейса, прежде чем закрывать диалоговое окно, в котором я находился. Уверен, есть и лучшие способы сделать это.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

Android включает в себя систему управления процессами, которая управляет созданием и уничтожением действий, что в значительной степени сводит на нет любую выгоду, которую вы могли бы получить от ручного перезапуска действий. Вы можете видеть больше информации об этом в Основах Приложения

Тем не менее, хорошей практикой является обеспечение того, чтобы ваши методы onPause и onStop высвобождали любые ресурсы, которые вам не нужны, чтобы использовать их и использовать onLowMemory, чтобы свести к минимуму ваши потребности в деятельности.


2
+1 за упоминание onLowMemory. Я не знал, что такой метод существует!
Hpique

4

Начните с того же намерения activityи закройте activity.

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

в некоторых случаях это лучшая практика, в других это не очень хорошая идея, это зависит от контекста, если вы решили сделать это, используя следующее - лучший способ перейти от действия к ее сыновьям:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

дело в том, что когда вы заканчиваете () из ActivityIWishToRun, вы возвращаетесь к своему активному действию


1
Это может быть старый, но вы просто сэкономили мне много времени! :)
Лиор Илуз

4

Перезагрузка всей вашей деятельности может быть тяжелой задачей. Просто поместите часть кода, которая должна быть обновлена ​​( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Ява:

@Override
public void onResume(){
    super.onResume();
    //here...

}

И при необходимости вызывайте onResume () .


2

Я не думаю, что это хорошая идея ... было бы лучше внедрить более чистый метод. Например, если ваша деятельность содержит форму, более чистый метод может просто очистить каждый виджет в форме и удалить все временные данные. Я думаю, это то, что вы хотите: восстановить активность в исходное состояние.


На самом деле я хочу изменить состояние приложения, а затем перезагрузить действие, чтобы отразить это изменение.
hpique

Что такое «состояние приложения» в вашем случае? Предпочтения?
Zehrer

2

После экспериментов с этим я не обнаружил неожиданных последствий возобновления активности. Кроме того, я считаю, что это очень похоже на то, что Android делает по умолчанию при изменении ориентации, поэтому я не вижу причин, чтобы не делать это в подобных обстоятельствах.


Наоборот, я попытался «обновить» мой экран, перезапустив действие. На поверхности ничего не происходит, моя информация обновлена ​​так, как я хотел, LogCat рассказывает другую историю. В LogCat я возвращаюсь в метод действия onCreate, он пытается получить настройки. 1-я попытка я получаю исключение нулевого указателя, затем он снова пытается запустить в onCreate и получает хранимый PREF 2-й раз. Не уверен, что здесь происходит, но я просто хотел быть уверен, что вы не просто смотрите на результат, потому что WYSIWIG был не тот случай для меня.
таралока

Как именно вы возобновляете действие?
hpique

2

у меня та же проблема

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

этот код работает для меня. Android api 17


2

В упражнении вы можете вызвать recreate()воссоздание занятия (API 11+)


1

У меня был другой подход, например: настроить launchModeсвою деятельность на singleTopи без звонка finish(), просто startActivity(getIntent())сделаю свою работу. Просто нужно позаботиться о новых данных как в, так onCreate()и в onNewIntent. Со способом Sush приложение может мигать, как сказал AMAN SINGH. Но подход AMAN SINGH все равно создаст новую деятельность, которая, так или иначе, не нужна, даже если он решил проблему «моргания», я думаю.

Слишком поздно для этого вопроса, но если кто-то ищет решение, вот оно.


0

После входа у меня была такая же проблема, поэтому я использовал

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

для меня это работает, это не создание другого Intents и на тех же Intents новые данные загружаются.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.