Muat ulang aktivitas di Android

220

Apakah ini praktik yang baik untuk memuat ulang Activitydi Android ?

Apa cara terbaik untuk melakukannya? this.finishlalu this.startActivitydengan aktivitasnya Intent?

hpique
sumber
3
Saya bukan pengembang Android yang berpengalaman, tetapi memulai kembali suatu Kegiatan terdengar seperti desain yang buruk dan hanya boleh dilakukan dalam kasus yang ekstrim.
Hudson
@ Hudson Itulah yang terjadi pada perubahan konfigurasi. Jika itu desain yang bagus atau tidak, itu diskusi lain sepenuhnya. ;)
hpique
1
@Hudson Jadi Anda sekarang adalah 5 tahun pengalaman pengembang: D
Pratik Butani
@PratikButani, Apakah saya mengenal Anda? :) Saya memiliki 8 tahun pengalaman sekarang, tetapi tidak banyak dalam pengembangan Android.
Hudson
Anda mengunjungi profil saya, saya tahu: P @Hudson
Pratik Butani

Jawaban:

521

Anda cukup menggunakan

finish();
startActivity(getIntent());

untuk menyegarkan Activitydari dalam dirinya sendiri.

Sush
sumber
2
Bagaimana jika itu tidak dapat dipanggil di dalam kelas aktivitas ?, apa pun cara melakukannya dengan referensi konteks?
giorgiline
1
@giorgiline - Ya, buat antarmuka yang Anda tentukan di dalam kelas aktivitas, dan berikan antarmuka itu sebagai parameter untuk kelas eksternal apa pun yang Anda gunakan.
aggregate1166877
1
Wow, saya TIDAK berpikir itu akan semudah ini.
theblang
1
Bagaimana Anda bisa menangani suatu kegiatan yang sudah dimulai untuk hasil? Bisakah Anda memulai kembali dengan penelepon asli masih menerima hasil?
tothphu
1
@tothphu - Belum dicoba, tetapi secara teoritis saya pikir ya. Namun saat kedua aktivitas selesai, itu tidak akan mengembalikan hasilnya ke Aktivitas yang dibuat untuk pertama kalinya.
Sush
64

bagi mereka yang tidak ingin melihat kedipan itu setelah ulang metode () cukup gunakan

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);
AMAN SINGH
sumber
2
Luar biasa! Saya ingin mengganti Transisi sehingga pengguna tidak akan melihat!
Ceddy Muhoza
Kerja bagus! Pengguna hampir tidak akan melihat reload.
sam
38

Inilah yang saya lakukan untuk memuat ulang aktivitas setelah mengubah kembali dari perubahan preferensi.

@Override
protected void onResume() {

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

Ini pada dasarnya menyebabkan aktivitas untuk menggambar ulang sendiri.

Diperbarui: Cara yang lebih baik untuk melakukan ini adalah dengan memanggil recreate()metode. Ini akan menyebabkan aktivitas diciptakan kembali.

kingargyle
sumber
15
Itu mungkin bekerja tetapi sangat tidak disarankan untuk memanggil metode siklus hidup secara eksplisit.
ITisha
Jika Anda mengambil rute ini, Anda harus menggunakan metode init () terpisah yang mengatur semuanya dan memanggilnya dari dalam onCreate () dan onResume (), alih-alih memanggil onCreate ().
Tom
1
Solusi hebat, kecuali tidak akan bekerja dalam beberapa situasi ketika metode siklus hidup Anda digunakan untuk hal-hal lain. Misalnya, saya mengakses kamera ponsel, dan ketika foto diambil, layar kembali ke aktivitas saya untuk mempostingnya ke tampilan. Dengan menggunakan metode siklus hidup untuk menyegarkan, saya dikeluarkan dari proses kamera, dan foto saya tidak kembali ke aktivitas, tetapi saya mendapatkan aktivitas dari awal. Hanya sebuah contoh yang harus diperhatikan.
Azurespot
1
Sangat penting untuk mempertimbangkan launchMode aktivitas saat menggunakan createate (). Sebagai contoh, ketika saya memanggil create createate () pada suatu aktivitas dengan launchMode = singleTop, saya tidak melihat onCreate () dipanggil sesudahnya. OTOH, jika, alih-alih memanggil reinate (), saya secara eksplisit memanggil finish () dan diikuti oleh startActivity (), saya melihat onCreate () dipanggil sesudahnya.
albert c braun
14

Saya melihat jawaban sebelumnya yang telah diberikan untuk memuat ulang aktivitas menggunakan Intent. Itu akan bekerja tetapi Anda juga bisa melakukan hal yang sama menggunakan metode reinate () yang diberikan di kelas Activity

Alih-alih menulis ini

// Perbarui aktivitas utama setelah menutup kotak dialog

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

Ini dapat dilakukan dengan menulis ini saja

recreate();
Rizwan
sumber
recreate()adalah solusi bagi saya - "memulai kembali" aktivitas tidak berhasil bagi saya, karena saya memulai aktivitas menggunakan "StartActivityForResult" dan itu merusak perilaku.
KYL3R
13

cukup gunakan

this.recreate();

ini akan memicu metode onCreate dalam aktivitas

Yasiru Nayanajith
sumber
10

Saya perlu memperbarui daftar pesan di salah satu aplikasi saya dengan tergesa-gesa, jadi saya hanya melakukan penyegaran aktivitas UI utama saya sebelum saya menutup dialog tempat saya masuk. Saya yakin ada cara yang lebih baik untuk mencapai ini juga.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //
sembilan ratus
sumber
9

Android mencakup sistem manajemen proses yang menangani pembuatan dan penghancuran aktivitas yang sebagian besar meniadakan manfaat yang Anda lihat dari memulai kembali aktivitas secara manual. Anda dapat melihat informasi lebih lanjut tentang itu di Fundamentals Aplikasi

Apa yang merupakan praktik yang baik adalah memastikan bahwa metode onPause dan onStop Anda melepaskan sumber daya apa pun yang tidak perlu Anda pertahankan dan gunakan onLowMemory untuk mengurangi kebutuhan aktivitas Anda seminimal mungkin.

Al Sutton
sumber
2
+1 untuk menyebutkan onLowMemory. Saya tidak tahu bahwa metode seperti itu ada!
hpique
4

Mulailah dengan maksud yang sama activitydan tutup activity.

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

dalam beberapa kasus itu adalah praktik terbaik di lain itu bukan ide yang baik itu didorong konteks jika Anda memilih untuk melakukannya menggunakan berikut ini adalah cara terbaik untuk menularkan dari kegiatan ke putranya:

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

masalahnya adalah setiap kali Anda selesai () dari activityIWishToRun Anda kembali ke aktivitas hidup Anda

yoav.str
sumber
1
Ini mungkin sudah tua tetapi Anda baru saja menghemat banyak waktu! :)
Lior Iluz
4

Memuat ulang seluruh aktivitas Anda mungkin merupakan tugas berat. Masukkan saja bagian kode yang harus di-refresh di ( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Jawa:

@Override
public void onResume(){
    super.onResume();
    //here...

}

Dan panggil " onResume () " kapan saja diperlukan.

menjadi_human
sumber
2

Saya tidak berpikir itu ide yang bagus ... akan lebih baik untuk menerapkan metode yang lebih bersih. Misalnya, jika aktivitas Anda memegang formulir, metode pembersih hanya bisa menghapus setiap widget dalam formulir dan menghapus semua data sementara. Saya kira itulah yang Anda inginkan: pulihkan aktivitas ke kondisi awal.

Cristian
sumber
Sebenarnya, saya ingin mengubah status aplikasi dan kemudian memuat kembali aktivitas untuk mencerminkan perubahan.
hpique
Apa "status aplikasi" dalam kasus Anda? Preferensi?
zehrer
2

Setelah bereksperimen dengan ini untuk sementara waktu saya tidak menemukan konsekuensi yang tidak terduga dari memulai kembali suatu kegiatan. Juga, saya percaya ini sangat mirip dengan apa yang dilakukan Android secara default ketika orientasi berubah, jadi saya tidak melihat alasan untuk tidak melakukannya dalam keadaan yang sama.

hpique
sumber
Sebaliknya, saya mencoba "menyegarkan" layar saya dengan memulai kembali aktivitas. Tidak muncul di permukaan apa pun yang salah, informasi saya memperbarui apa yang saya inginkan, LogCat menceritakan kisah yang berbeda. Di LogCat, saya kembali ke metode aktivitas onCreate, berusaha menarik preferensi. Upaya pertama saya menerima pengecualian pointer nol, kemudian mencoba lagi untuk memulai di onCreate dan menerimaimpanPref ke-2 kalinya. Tidak yakin apa yang sedang terjadi di sini, tetapi saya hanya ingin memastikan bahwa Anda tidak hanya melihat hasilnya, karena WYSIWIG tidak demikian bagi saya.
taraloca
Bagaimana tepatnya Anda memulai kembali aktivitas?
hpique
2

saya memiliki masalah yang sama

import android.support.v4.content.IntentCompat;

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

kode ini berfungsi untuk saya. Android api 17

Adnan Abdollah Zaki
sumber
2

Dalam suatu aktivitas Anda dapat menelepon recreate()untuk "menciptakan kembali" aktivitas (API 11+)


sumber
1

Saya memiliki pendekatan lain seperti: mengatur launchModeaktivitas saya ke singleTopdan tanpa menelepon finish(), hanya startActivity(getIntent())akan melakukan pekerjaan. Hanya perlu peduli dengan data baru baik di onCreate()danonNewIntent . Dengan cara Sush, aplikasi mungkin berkedip seperti kata AMAN SINGH. Tapi pendekatan AMAN SINGH masih akan menciptakan aktivitas baru yang entah bagaimana, tidak perlu, bahkan jika dia memperbaiki masalah 'blink', saya pikir.

Sudah terlambat untuk pertanyaan ini, tetapi jika seseorang mencari solusi, ini dia.

PEJALAN
sumber
0

Setelah masuk saya punya masalah yang sama jadi saya gunakan

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}
Rajnish Sharma
sumber
0

Saya menggunakan ini dan berfungsi dengan baik tanpa finish()

startActivity(getIntent());
Hocine Kheddadji
sumber
0

bagi saya itu berfungsi itu tidak menciptakan Intents lain dan sama Intents data baru dimuat.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Anil Kumar
sumber