Android'de etkinliği yeniden yükle


221

Bir yeniden iyi bir uygulama mı Activityyılında Android ?

Bunu yapmanın en iyi yolu ne olurdu? this.finishve sonra this.startActivityaktivite ile Intent?


3
Deneyimli bir Android geliştiricisi değilim, ancak bir Etkinliği yeniden başlatmak kötü bir tasarıma benziyor ve sadece aşırı durumlarda yapılmalıdır.
Hudson

@Hudson Yapılandırma değişikliklerinde olan budur. Bu iyi bir tasarım ya da değil, tamamen başka bir tartışma. ;)
hpique

1
@Hudson Şimdi 5 yıllık deneyim geliştiricisiniz: D
Pratik Butani

@PratikButani, seni tanıyor muyum? :) Şu anda 8 yıllık tecrübem var, ancak Android geliştirme içinde çok fazla değil.
Hudson

Profilimi ziyaret ettim Biliyorum: P @Hudson
Pratik Butani

Yanıtlar:


521

Basitçe kullanabilirsiniz

finish();
startActivity(getIntent());

Activitykendi içinden yenilemek için .


2
Etkinlik sınıfı içinde çağırılamıyorsa, bağlam referansıyla yapmanın herhangi bir yolu var mı?
giorgiline

1
@giorgiline - Evet, etkinlik sınıfında tanımladığınız bir arabirim oluşturun ve bu arabirimi, kullandığınız harici sınıfa parametre olarak iletin.
aggregate1166877

1
Vay canına, bu kadar kolay olacağını düşünmedim.
theblang

1
Sonuç için başlatılan bir faaliyetle nasıl başa çıkabilirsiniz? Orijinal arayan hala bir sonuç alırken bunu yeniden başlatabilir misiniz?
tothphu

1
@tothphu - Yine de denenmedi, ama teorik olarak evet düşünüyorum. Ancak, etkinlik ikinci kez tamamlandığında, sonucu ilk kez oluşturulan Etkinliğe döndürmez.
Sush

65

createte () yönteminden sonra bu yanıp sönmeyi görmek istemeyenler için

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
Müthiş! Kullanıcının fark etmemesi için Geçişi geçersiz kılmak istedim!
Ceddy Muhoza

İyi iş! Kullanıcı yeniden yüklemeyi zar zor fark ederdi.
sam

38

Bir tercih değişikliği döndükten sonra etkinliği yeniden yüklemek için yaptığım budur.

@Override
protected void onResume() {

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

Bu aslında etkinliğin kendini yeniden çizmesine neden olur.

Güncelleme: Bunu yapmanın daha iyi bir yolu recreate()yöntemi çağırmaktır . Bu, etkinliğin yeniden oluşturulmasına neden olur.


15
Bu çalışıyor olabilir, ancak yaşam döngüsü yöntemlerini açıkça çağırmanız kesinlikle önerilmez.
ITisha

Bu yolu izlerseniz, her şeyi ayarlayan ayrı bir init () yöntemi kullanmanız ve bunu onCreate () öğesini çağırmak yerine onCreate () ve onResume () içinden çağırmanız gerekir.
Tom

1
Yaşam döngüsü yöntemlerinizin başka şeyler için kullanıldığı bazı durumlarda işe yaramayacağı için harika bir çözüm. Örneğin, telefonun kamerasına erişiyorum ve fotoğraf çekildiğinde, ekran bir görünüme göndermek için etkinliğime geri dönüyor. Yenilemek için yaşam döngüsü yöntemlerini kullanarak, kamera işleminden atıldım ve fotoğrafım aktiviteye geri dönmüyor, ancak aktiviteyi en başından alıyorum. Dikkat edilmesi gereken bir örnek.
Azurespot

1
Rekre () işlevini kullanırken aktivitenin launchMode yöntemini dikkate almak önemlidir. Örneğin, launchMode = singleTop olan bir etkinlikte createte () öğesini çağırdığımda, onCreate () işlevinin daha sonra çağrıldığını görmüyorum. OTOH, eğer rekreasyon () çağırmak yerine, açıkça finish () çağırır ve sonra startActivity () çağırırsam, onCreate () daha sonra çağrılır görüyorum.
albert c braun

14

Niyet kullanarak etkinliği yeniden yüklemek için verilen daha önceki yanıtları gördüm. Bunlar işe yarayacak, ancak aynı zamanda Activity sınıfının kendisinde verilen rekreasyon () yöntemini kullanarak da yapabilirsiniz.

Bunu yazmak yerine

// İletişim kutusunu kapattıktan sonra ana etkinliği yenile

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

Bu sadece bunu yazarak yapılabilir

recreate();

recreate()"StartActivityForResult" kullanarak etkinliğe başladığım ve davranışı bozduğum için "yeniden başlatma" etkinliği benim için çalışmadı.
KYL3R


10

Aceleyle uygulamalarımdan birinde bir mesaj listesini güncellemem gerekiyordu, bu yüzden bulunduğum iletişim kutusunu kapatmadan önce ana kullanıcı arayüzü aktivitemi yeniledim. Bunu da başarmanın daha iyi yolları olduğundan eminim.

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

9

Android, bir etkinliğin manuel olarak yeniden başlatılmasını göreceğiniz herhangi bir yararı büyük ölçüde reddeden etkinliklerin oluşturulmasını ve yok edilmesini yöneten bir süreç yönetim sistemi içerir. Bu konuda daha fazla bilgiyi Application Fundamentals'da bulabilirsiniz.

Bununla birlikte iyi bir uygulama, onPause ve onStop yöntemlerinizin , etkinlik gereksinimlerinizi mutlak minimum düzeye indirmek için tutmanız gerekmeyen ve onLowMemory'de kullanmanız gerekmeyen kaynakları serbest bırakmasını sağlamaktır.


2
+1DowMemory'den bahsettiğiniz için +1. Böyle bir yöntemin var olduğunu bilmiyordum!
hpique

4

Aynı niyetle başlayın activityve activity.

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

4

bazı durumlarda en iyi uygulama diğerlerinde iyi bir fikir değildir, eğer bunu yapmayı seçtiyseniz, aşağıdakileri kullanmak bir aktiviteden oğullarına geçmenin en iyi yoludur:

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

asıl mesele ne zaman bitirirseniz ()


1
Bu belki eski ama beni çok fazla kurtardın! :)
Lior Iluz

4

Tüm etkinliğinizi yeniden yüklemek ağır bir iş olabilir. Kodun yenilenmesi gereken kısmını koymanız yeterlidir ( kotlin ):

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

Java:

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

}

Ve gerektiğinde " onResume () " çağırın .


2

Bunun iyi bir fikir olduğunu sanmıyorum ... daha temiz bir yöntem uygulamak daha iyi olur. Örneğin, etkinliğiniz bir form barındırıyorsa, temizleyici yöntem formdaki her widget'ı temizleyebilir ve tüm geçici verileri silebilir. Sanırım istediğin bu: aktiviteyi başlangıç ​​durumuna geri getir.


Aslında, uygulama durumunu değiştirmek ve daha sonra değişikliği yansıtmak için etkinliği yeniden yüklemek istiyorum.
hpique

Sizin durumunuzdaki "başvuru durumu" nedir? Tercihler?
zehrer

2

Bir süre bunu denedikten sonra bir aktiviteyi yeniden başlatmanın beklenmedik bir sonucunu bulamadım. Ayrıca, yönelim değiştiğinde Android'in varsayılan olarak yaptığı şeye çok benzediğini düşünüyorum, bu yüzden benzer bir durumda yapmamak için bir neden göremiyorum.


Aksine, etkinliği yeniden başlatarak ekranımı "yenilemeye" çalıştım. Yüzeyde bir şey görünmüyor yanlış gitti, bilgilerim nasıl istediğimi güncelledi, LogCat farklı bir hikaye anlatıyor. LogCat'te, etkinliğin onCreate yöntemine geri dönüyorum, tercihleri ​​çekmeye çalışıyor. 1 denemesi Boş bir işaretçi istisnası alıyorum, sonra tekrar onCreate içinde başlatmayı deniyor ve depolananPref'i 2. kez alır. Burada neler olduğundan emin değilim, ama sadece sonuca bakmadığınızdan emin olmak istedim, çünkü WYSIWIG benim için böyle değildi.
taraloca

Etkinliği tam olarak nasıl yeniden başlatıyorsunuz?
hpique

2

aynı problemim var

import android.support.v4.content.IntentCompat;

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

bu kod benim için çalışıyor. Android API 17


2

Bir etkinlikte etkinliği recreate()"yeniden oluşturmak" için arayabilirsiniz (API 11+)


1

Başka bir yaklaşımım daha vardı: launchModefaaliyetimin singleTopçağrılmasına ve çağrılmadan ayarlanması finish()sadece startActivity(getIntent())işi yapacak. Sadece hem yeni verilerle bakmak zorundasınız onCreate()ve onNewIntent. Şuş yolu ile, uygulama AMAN SINGH'in söylediği gibi yanıp sönebilir. Ancak AMAN SINGH'in yaklaşımı, yine de 'göz kırpma' sorununu çözse bile, bir şekilde gereksiz olan yeni bir etkinlik yaratacaktır.

Bu soru için çok geç, ama birisi çözüm arıyorsa, işte burada.


0

Giriş yaptıktan sonra aynı sorunu yaşadım, bu yüzden kullandım

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

benim için çalışıyor başka bir Intents oluşturmuyor ve aynı Intents yeni veri yüklendi.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.