Обновить активность в 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.