2010-06-16 4 views
140

Можно ли перезагрузить Activity в Android?Обновить активность в Android

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

+3

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

+0

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

ответ

361

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

finish(); 
startActivity(getIntent()); 

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

+0

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

+1

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

+1

Ничего себе, я не думал, что это будет так просто. – theblang

1

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

+0

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

+0

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

+0

Да, предпочтения. – hpique

2

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

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

вещь, когда вы заканчиваете() от деятельностиIWishToRun, вы возвращаетесь к своей живой деятельности

+1

Это, возможно, старый, но вы просто спасли меня много времени! :) –

8

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

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

+2

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

1

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

+0

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

+0

Как именно вы перезапускаете мероприятие? – hpique

10

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

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

простой и эффективный – Matthew

24

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

@Override 
protected void onResume() { 

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

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

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

+1

Спасибо ... Работает как шарм !!! – user1744952

+10

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

+0

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

4

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

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

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

import android.support.v4.content.IntentCompat; 

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

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

16

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

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

Удивительный! Я хотел переопределить переход так, чтобы пользователь не заметил! – Tuna

0

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

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

2

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

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

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

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

Это может быть сделано в письменной форме это только

recreate(); 
Смежные вопросы