Как перезапустить Android-активность

Как перезагрузить Android Activity? Я попробовал следующее, но Activity просто уходит.

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}

Ответ 1

Я сделал свой видеомикшер следующим образом:

Intent intent = getIntent();
finish();
startActivity(intent);

В принципе, я звоню finish() во-первых, и я использую то же самое намерение, с которого была начата эта деятельность. Это похоже на трюк?

ОБНОВЛЕНИЕ: Как было указано Ральфом ниже, Activity.recreate() - это путь в API 11 и далее. Это предпочтительнее, если вы находитесь в среде API11+. Вы по-прежнему можете проверить текущую версию и вызвать фрагмент кода выше, если вы используете API 10 или ниже. (Пожалуйста, не забудьте упрекнуть Ральфа!)

Ответ 2

Начиная с уровня API 11 (Honeycomb), вы можете вызвать recreate() метод активности (благодаря этот ответ.)

Метод recreate() действует так же, как изменение конфигурации, поэтому также вызывают методы onSaveInstanceState() и onRestoreInstanceState().

Ответ 3

Перед SDK 11 способ сделать это выглядит так:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

Ответ 4

Просто, чтобы совместить ответы Ральфа и Бена (включая изменения, сделанные в комментариях):

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);
}

Ответ 5

Я использовал этот код, чтобы поддерживать старые версии 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());
        }
    }
}

Ответ 6

Это решение сработало для меня.

Сначала завершите действие, а затем запустите его снова.

Пример кода:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}

Ответ 7

Это самый простой способ перезапустить текущую активность:

finish();
startActivity(getIntent());

Ответ 8

Вызвать этот метод

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

Спасибо,

Ответ 9

Даже если на это ответили несколько раз.

Если перезагрузка активности из фрагмента, я бы сделал это следующим образом:

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, если вы вызываете его в нечетном месте, он просто убьет действие и не перезапустит его.

Не стесняйтесь задавать любые вопросы.

Cheers, Крис

Ответ 10

Ну, это не список, а комбо некоторых, которые уже отправлены:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

Ответ 11

Фактически для уровней API 5 и выше действует следующий код, поэтому, если ваш целевой API ниже этого, вы получите нечто очень похожее на код EboMike.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);

Ответ 12

public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

попробуйте использовать это.

Ответ 13

Существует один хакерский способ, который должен работать над любой деятельностью, включая основную.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

При изменении ориентации Android обычно воссоздает вашу активность (если вы не отмените ее). Этот метод полезен для поворотов на 180 градусов, когда Android не воссоздает вашу активность.

Ответ 14

В сочетании с странным поведением SurfaceView жизненного цикла с камерой. Я обнаружил, что recreate() не очень хорошо работает с жизненным циклом SurfaceViews. surfaceDestroyed никогда не называется во время цикла отдыха. Он вызывается после onResume (странный), после чего мой SurfaceView уничтожается.

Исходный способ воссоздания действия отлично работает.

Intent intent = getIntent();
finish();
startActivity(intent);

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

Ответ 15

Решение для вашего вопроса:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

Вам нужно включить в контекст активности, чтобы начать новую деятельность, а также завершить текущую деятельность.

Надеюсь, что это поможет... и работает для меня.

Ответ 16

Если вы удалите последнюю строку, вы создадите новую act Activity, но ваш старый экземпляр все равно будет жив.

Вам нужно перезапустить Activity, как при изменении ориентации (т.е. ваше состояние сохраняется и передается на onCreate(Bundle))?

Если вы этого не сделаете, одним из возможных способов решения проблемы будет использование одной дополнительной фиктивной операции, которая будет запущена из первого действия, и какая задача - запустить новый экземпляр. Или просто задержать вызов act.finish(), после запуска нового.

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

Пожалуйста, укажите, что вы пытаетесь сделать.

Ответ 17

Я удивляюсь, почему никто не упомянул Intent.makeRestartActivityTask(), который точно делает именно эту цель.

Создайте намерение, которое можно использовать для повторного запуска задачи приложения      * в своем базовом состоянии.

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent())

Этот метод устанавливает Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK в качестве флагов по умолчанию.

Ответ 18

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

onRestart()

метод следующим образом

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

и вызовите onRestart(), где вы хотите перезапустить текущую активность

Ответ 19

Это способ, которым я делаю это.

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)

Ответ 20

Если вы вызываете какой-то фрагмент, то делайте ниже кода.

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);

Ответ 21

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