Как перезапустить активность Android
Как перезапустить Android Activity
? Я попробовал следующее, но Activity
просто выходит.
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
24 ответа
Я сделал мой переключатель темы следующим образом:
Intent intent = getIntent();
finish();
startActivity(intent);
В основном я звоню finish()
во-первых, и я использую то же самое намерение, с которого была начата эта деятельность. Это, кажется, делает трюк?
ОБНОВЛЕНИЕ: как указано Ральф ниже, Activity.recreate()
это путь в API 11 и выше. Это предпочтительно, если вы находитесь в среде API11+. Вы все еще можете проверить текущую версию и вызвать фрагмент кода выше, если вы используете API 10 или ниже. (Пожалуйста, не забудьте подтвердить ответ Ральфа!)
Начиная с уровня API 11 (Honeycomb), вы можете вызывать метод воссоздания () действия (благодаря этому ответу).
Метод refreshate () действует так же, как изменение конфигурации, поэтому ваши методы onSaveInstanceState () и onRestoreInstanceState () также вызываются, если это применимо.
До SDK 11 способ сделать это выглядит так:
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
Просто чтобы объединить ответы Ральфа и Бена (включая изменения, сделанные в комментариях):
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
overridePendingTransition(0, 0);
}
Я использовал этот код, так что я все еще мог поддерживать старые версии Android и использовать recreate()
на более новых версиях Android.
Код:
public static void restartActivity(Activity activity){
if (Build.VERSION.SDK_INT >= 11) {
activity.recreate();
} else {
activity.finish();
activity.startActivity(activity.getIntent());
}
}
Образец:
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivity = MainActivity.this;
Button button = (Button) findViewById(R.id.restart_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
restartActivity(mActivity);
}
});
}
public static void restartActivity(Activity activity) {
if (Build.VERSION.SDK_INT >= 11) {
activity.recreate();
} else {
activity.finish();
activity.startActivity(activity.getIntent());
}
}
}
Это, безусловно, самый простой способ перезапустить текущую активность:
finish();
startActivity(getIntent());
Интересно, почему никто не упомянул Intent.makeRestartActivityTask()
который чисто делает эту точную цель.
Создайте намерение, которое можно использовать для повторного запуска задачи приложения * в ее базовом состоянии.
startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent())
Этот метод устанавливает Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
как флаги по умолчанию.
Это решение сработало для меня.
Сначала завершите упражнение, а затем начните его снова.
Образец кода:
public void restartActivity(){
Intent mIntent = getIntent();
finish();
startActivity(mIntent);
}
Вызовите этот метод
private void restartFirstActivity()
{
Intent i = getApplicationContext().getPackageManager()
.getLaunchIntentForPackage(getApplicationContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity(i);
}
Спасибо,
Хотя на это уже отвечали несколько раз.
Если перезапустить активность из фрагмента, я бы сделал это так:
new Handler().post(new Runnable() {
@Override
public void run()
{
Intent intent = getActivity().getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
getActivity().overridePendingTransition(0, 0);
getActivity().finish();
getActivity().overridePendingTransition(0, 0);
startActivity(intent);
}
});
Таким образом, вы можете подумать, что это немного перебор? Но Handler
публикация позволяет вызвать это в методе жизненного цикла. Я использовал это в onRestart
/onResume
методы при проверке изменения состояния между пользователем, возвращающимся в приложение. (установлено что-то).
Без Handler
если вы позвоните ему в странном месте, он просто убьет действие и не перезапустит его.
Не стесняйтесь задавать любые вопросы.
Ура, Крис
Ну, это не в списке, но комбо некоторых, которые уже размещены:
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
}
Если кто-то ищет ответ Kotlin, вам просто нужна эта строка.
Фрагмент
startActivity(Intent.makeRestartActivityTask(activity?.intent?.component))
Деятельность
startActivity(Intent.makeRestartActivityTask(this.intent?.component))
В сочетании со странным поведением SurfaceView в течение жизненного цикла с камерой. Я обнаружил, что метод create() плохо работает с жизненным циклом SurfaceView. SurfaceDestroyed никогда не вызывается во время цикла отдыха. Он вызывается после onResume (странно), после чего мой SurfaceView уничтожается.
Оригинальный способ воссоздания деятельности работает отлично.
Intent intent = getIntent();
finish();
startActivity(intent);
Я не могу точно понять, почему это так, но это всего лишь наблюдение, которое, мы надеемся, поможет другим в будущем, потому что оно устранило мои проблемы, которые у меня были с SurfaceViews.
Решение для вашего вопроса:
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
((Activity)act).startActivity(intent);
((Activity)act).finish();
}
Вам нужно привести к контексту действия, чтобы начать новое действие, а также завершить текущее действие.
Надеюсь, что это полезно.. и работает для меня.
Есть один хакерский способ, который должен работать на любую деятельность, включая основную.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
Когда ориентация меняется, Android обычно воссоздает вашу активность (если вы не переопределите ее). Этот метод полезен для поворота на 180 градусов, когда Android не воссоздает вашу активность.
public void onRestart() {
super.onRestart();
Intent intent=new Intent();
intent.setClass(act, act.getClass());
finish();
act.startActivity(intent);
}
попробуйте использовать это..
На самом деле следующий код действителен для уровней API 5 и выше, поэтому, если ваш целевой API ниже, чем этот, вы получите нечто очень похожее на код EboMike.
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
Котлинский способ:
fun Activity.restartActivity() {
if (Build.VERSION.SDK_INT >= 11) {
recreate()
} else {
finish()
startActivity(getIntent())
}
}
Если вы удалите последнюю строку, вы создадите новую act
Активность, но ваш старый экземпляр все еще будет жив.
Вам нужно перезапустить действие, как при изменении ориентации (т.е. ваше состояние сохраняется и передается в onCreate(Bundle)
)?
Если вы этого не сделаете, одним из возможных обходных путей будет использование одного дополнительного, фиктивного действия, которое будет запущено с первого действия, и задание которого заключается в запуске его нового экземпляра. Или просто отложите звонок act.finish()
после запуска нового.
Если вам нужно спасти большую часть состояния, вы попадаете в довольно глубокие воды, потому что нетривиально передать все свойства вашего состояния, особенно без утечки старого контекста / действия, передав его новому экземпляру.
Пожалуйста, укажите, что вы пытаетесь сделать.
Вы можете просто использовать
onRestart()
метод следующим образом
@Override
protected void onRestart() {
super.onRestart();
setContentView(R.layout.add_entry);
}
и вызовите onRestart(), где вы хотите перезапустить текущую активность
Простой способ
public void restartActivity(){
Intent i = getIntent();
finish();
startActivity(i);
}
Я так и делаю.
val i = Intent(context!!, MainActivity::class.java)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i)
Если вы звоните с какого-то фрагмента, сделайте так, как показано ниже.
Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);