Как перезапустить активность 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);

Вызовите метод onCreate. Например onCreate(null);

Другие вопросы по тегам