Cara memulai kembali Aktivitas di Android

381

Bagaimana cara memulai ulang Android Activity? Saya mencoba yang berikut, tetapi Activityhanya berhenti.

public static void restartActivity(Activity act){

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

}
Samet ÖZTOPRAK
sumber
9
aktivitas berhenti karena kamu memanggil "act.finish ();" segera setelah membuat aktivitas ...
Nikhil Dinesh
1
metode yang ketinggalan jaman
pedjjj

Jawaban:

623

Saya melakukan pengalih tema saya seperti ini:

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

Pada dasarnya, saya menelepon finish()dulu, dan saya menggunakan maksud yang sama persis dengan kegiatan ini dimulai. Tampaknya melakukan triknya?

UPDATE: Seperti yang ditunjukkan oleh Ralf di bawah, Activity.recreate()adalah cara untuk masuk dalam API 11 dan seterusnya. Ini lebih disukai jika Anda berada di lingkungan API11 +. Anda masih dapat memeriksa versi saat ini dan memanggil snipet kode di atas jika Anda menggunakan API 10 atau lebih rendah. (Tolong jangan lupa untuk mengangkat jawaban Ralf!)

EboMike
sumber
36
Dan itu layak untuk diturunkan? Itu bukan persyaratan yang disebutkan oleh OP. Bahkan, mungkin diinginkan.
EboMike
9
Nah, jika Anda tidak suka animasi, Anda dapat mematikannya (seperti yang Anda tunjukkan dalam jawaban Anda). Itu tidak membuat jawaban saya salah, itu hanya tidak menunjukkan beberapa opsi tambahan yang bebas Anda tambahkan (dan itu tidak ditanyakan dalam pertanyaan).
EboMike
28
Saya pikir Anda salah. Downvote berarti jawaban salah / buruk, dan upvote berarti jawaban itu hebat. Seberapa hebat jawaban dibandingkan dengan orang lain ditunjukkan oleh jumlah upvotes. Saya dapat melihat bahwa Anda mencoba mempromosikan jawaban Anda, tetapi Anda menyalahgunakan sistem untuk tujuan itu.
EboMike
8
+1 - ini berfungsi dengan baik untuk saya, dan seperti yang Anda katakan, animasi adalah sesuatu yang saya inginkan, sehingga pengguna tahu itu sedang memulai ulang. FWIW, saya membuat peraturan untuk tidak pernah memilih orang lain yang menjawab ketika saya memberikan jawaban alternatif untuk pertanyaan, meskipun saya kadang-kadang memilih ketika jawaban saya kalah (tidak mengatakan itu terjadi di sini, hanya saja saya melakukannya) .
Michael Bray
4
EboMike dan Ben: Kedua solusi Anda menjawab pertanyaan OP. Menolak jawaban seseorang semata-mata karena alasan "estetika" adalah, yah, tidak hebat. Saya akan mencegah siapa pun untuk melakukannya di Stackoverflow ...
ChuongPham
368

Karena API level 11 (Honeycomb), Anda dapat memanggil metode buat kembali () dari aktivitas (berkat jawaban ini ).

Metode reinate () bertindak seperti perubahan konfigurasi, sehingga metode onSaveInstanceState () dan onRestoreInstanceState () Anda juga dipanggil, jika ada.

Ralf
sumber
3
bagaimana jika aktivitas sebelumnya menyebut ini menggunakan startActivityForResult?
pengembang android
1
Nah, itu jawaban yang benar jika Anda tidak perlu mendukung apa pun yang lebih rendah dari API 11.
Edward Falk
@ EdwardFalk apakah ada fungsi yang melakukannya di pustaka dukungan?
pengembang android
2
Ini tidak berfungsi dalam semua kasus. Jika Anda memiliki laci navigasi yang terbuka saat memanggil reinate () itu akan tetap terbuka ketika dibuat ulang, yang berarti ia menyimpan keadaan, yang mungkin tidak diinginkan.
Chapz
Saya orang yang tidak ingin negara diselamatkan. Terkadang orang hanya ingin restart bersih, maka mereka harus menggunakan jawaban EboMike.
Kimi Chiu
132

Sebelum SDK 11, cara untuk melakukan ini adalah seperti ini:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
Ben
sumber
Pada HTC Desire, animasi masih tetap ada (setidaknya saat digunakan dalam metode onConfigurationChanged). Mereka tidak selalu terjadi, tetapi menggunakan kode EboMike mereka juga tidak selalu terjadi.
Juozas Kontvainis
8
Ini tidak berfungsi pada aktivitas utama yang dimulai oleh peluncur. Aktivitas Anda pada akhirnya akan disembunyikan karena beberapa bendera ditetapkan pada maksud. Kalau tidak, itu bekerja dengan baik.
Thomas Ahle
Poin yang bagus. masuk akal karena panggilan selesai () dari aktivitas dasar di stack.
Ben
Menyebut ini sementara kami mengubah tema Kegiatan tampaknya memunculkan kecepatan (tanpa animasi)
Ashok Goli
3
+1 berfungsi dengan baik, bahkan untuk saya dengan Aktivitas utama. Namun, Anda harus menelepon overridePendingTransition(0, 0);setelah finish()danstartActivity() , masing-masing, bukan di tempat Anda menyebutnya ...
caw
115

Hanya untuk menggabungkan jawaban Ralf dan Ben (termasuk perubahan yang dibuat dalam komentar):

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);
}
JustinMorris
sumber
8
Jawaban terbaik dari semuanya. Percaya atau tidak, saya masih mendukung perangkat API 3, dan nilai VERSION.SDK_INT membutuhkan API 4. :)
Edward Falk
31

Saya menggunakan kode ini sehingga saya masih bisa mendukung versi Android yang lebih lama dan menggunakan recreate() pada versi Android yang lebih baru.

Kode:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

Sampel:

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());
        }
    }
}
Thomas Vos
sumber
adalah pekerjaan yang bagus untuk saya !!
papo
22

Solusi ini berhasil untuk saya.

Pertama-tama selesaikan aktivitas dan kemudian mulai lagi.

Kode sampel:

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

Sejauh ini, ini adalah cara termudah untuk memulai kembali aktivitas saat ini:

finish();
startActivity(getIntent());
Abhishek Soni
sumber
19

Panggil metode ini

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

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

Terima kasih,

Nikhil Dinesh
sumber
1
Saya pikir OP ingin memulai kembali aktivitas apa pun, bukan hanya yang pertama, tetapi ini membantu saya.
Kristopher Johnson
1
Kedua bendera itu baik untuk diketahui, kasus saya seolah tidak melakukan apa-apa tanpa mereka.
Owen B
1
itu berhasil berkat kamu! Tuhan memberkati Anda .
Vivek
16

Meskipun ini sudah dijawab berkali-kali.

Jika memulai kembali aktivitas dari sebuah fragmen, saya akan melakukannya seperti ini:

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

Jadi Anda mungkin berpikir ini sedikit berlebihan? Tetapi Handlerposting memungkinkan Anda untuk menyebutnya dalam metode siklus hidup. Saya telah menggunakan ini dalam onRestart/ onResumemetode ketika memeriksa apakah keadaan telah berubah antara pengguna kembali ke aplikasi. (menginstal sesuatu).

Tanpa Handlerjika Anda menyebutnya di tempat yang aneh itu hanya akan mematikan aktivitas dan tidak memulai kembali.

Jangan ragu untuk bertanya.

Ceria, Chris

Chris. Jenkins
sumber
2
Solusi hebat dan alasan / penjelasan yang sangat bagus untuk Handler.
JRomero
1
Mengapa Anda menelepon dua kali untuk "overridePendingTransition"?
pengembang android
1
@androiddeveloper Saya tidak ingat, saya pikir itu adalah pekerjaan untuk bug. Anda dapat memanggilnya sekali sebelum startActivity () dan itu akan dilakukan seperti yang diperintahkan.
Chris. Jenkins
Setelah menerapkan ini dalam fungsi onResume saya, permainan berhenti pada metode onStop saya dan memiliki layar hitam ... tidak yakin mengapa
Scumble373
1
Hai chris, bisakah Anda menjelaskan ini sedikit lebih jauh "Tanpa Handler jika Anda menyebutnya di tempat yang aneh itu hanya akan mematikan aktivitas dan tidak memulai kembali." ?
parvez rafi
15

Yah ini tidak terdaftar tetapi kombo dari beberapa yang sudah diposting:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
Kode terbalik
sumber
Ini bekerja untuk saya .. terima kasih .. tapi saya ingin bertanya: mengapa ketika saya menghapus bagian pertama dari kode (yang memeriksa SDK_INT) aplikasi saya berjalan, relatif, lambat? !! .. ketika saya pasang kembali kode itu lagi berjalan, relatif dan jelas, lebih cepat !!!
McLan
2
Tidak yakin tentang itu. Nah, jika Anda menggunakan SDK yang>> 11 maka buat ulang () harus lebih cepat daripada mendapatkan maksud, menyelesaikan, lalu mulai lagi. Selesaikan panggilan kode yang berjalan ke onStop dan buat ulang kode yang berjalan seperti perubahan orientasi ... jadi tidak banyak yang bisa dilakukan.
Codeversed
4

Dalam hubungannya dengan perilaku siklus hidup SurfaceView yang aneh dengan Kamera . Saya telah menemukan bahwa menciptakan kembali () tidak berperilaku baik dengan siklus hidup SurfaceViews. surfaceDestroyed tidak pernah dipanggil selama siklus rekreasi. Ini disebut setelah onResume (aneh), pada titik mana SurfaceView saya hancur.

Cara asli untuk menciptakan kembali suatu kegiatan berfungsi dengan baik.

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

Saya tidak tahu persis mengapa ini terjadi, tetapi ini hanya sebuah pengamatan yang mudah-mudahan dapat membimbing orang lain di masa depan karena itu memperbaiki masalah saya yang saya alami dengan SurfaceViews.

The4thIceman
sumber
4

Saya bertanya-tanya mengapa tidak ada yang menyebutkan Intent.makeRestartActivityTask()yang dengan bersih membuat tujuan yang tepat ini.

Buat Intent yang dapat digunakan untuk meluncurkan kembali tugas aplikasi * dalam kondisi dasarnya.

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

Metode ini ditetapkan Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASKsebagai flag default.

shkschneider
sumber
3

Sebenarnya kode berikut ini berlaku untuk API level 5 dan lebih tinggi, jadi jika API target Anda lebih rendah dari ini, Anda akan berakhir dengan sesuatu yang sangat mirip dengan kode EboMike.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
Sandy
sumber
3

Ada satu cara yang bisa digunakan untuk aktivitas apa pun, termasuk yang utama.

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

Ketika orientasi berubah, Android umumnya akan menciptakan kembali aktivitas Anda (kecuali Anda menimpanya). Metode ini berguna untuk rotasi 180 derajat, ketika Android tidak membuat kembali aktivitas Anda.

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

coba gunakan ini ..

Amsheer
sumber
3

Solusi untuk pertanyaan Anda adalah:

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

Anda harus menggunakan konteks aktivitas untuk memulai aktivitas baru dan juga untuk menyelesaikan aktivitas saat ini.

Semoga ini bisa membantu..dan bekerja untuk saya.

Rajesh Peram
sumber
1

Jika Anda menghapus baris terakhir, Anda akan membuat actActivity baru , tetapi instance lama Anda akan tetap hidup.

Apakah Anda perlu memulai kembali Kegiatan seperti ketika orientasi diubah (yaitu keadaan Anda disimpan dan diteruskan ke onCreate(Bundle))?

Jika tidak, satu solusi yang mungkin dilakukan adalah dengan menggunakan satu aktivitas ekstra, dummy, yang akan dimulai dari Aktivitas pertama, dan tugas mana yang memulai contoh baru darinya. Atau hanya menunda panggilan keact.finish() , setelah yang baru dimulai.

Jika Anda perlu menyelamatkan sebagian besar negara bagian, Anda berada di perairan yang cukup dalam, karena tidak sepele untuk melewati semua properti negara Anda, terutama tanpa membocorkan Konteks / Aktivitas lama Anda, dengan meneruskannya ke instance baru.

Silakan tentukan apa yang ingin Anda lakukan.

Dimitar Dimitrov
sumber
1
Saya memiliki tombol yang menerapkan tema berbeda untuk aplikasi, setelah tema diterapkan, disimpan dalam preferensi, aktivitas root dimulai ulang, membaca tema dari preferensi, menerapkan tema di onCreate (). Ternyata kode di atas berfungsi dengan baik jika aktivitasnya bukan single_instance. Tidak yakin apakah itu praktik terbaik.
Saat ini, tidak ada yang bersih, cara SDK-beraspal untuk me-restart Aktivitas Anda, AFAIK - jika Anda melakukan apa-apa tidak bocor, Anda mungkin baik untuk pergi :)
Dimitar Dimitrov
0

Inilah cara saya melakukannya.

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

Jika Anda menelepon dari beberapa fragmen, lakukan di bawah kode.

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);
Mihir Trivedi
sumber
-4

Anda cukup menggunakan

onRestart ()

metode sebagai berikut

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

dan panggilRestart () di mana Anda ingin memulai kembali Aktivitas saat ini

SuKu
sumber
-5

Panggil metode onCreate. Sebagai contohonCreate(null);

kike0kike
sumber