Android - "Geri" düğmesini geçersiz kılmak, böylece benim faaliyet bitirmek ()?


199

Şu anda görüntülendiğinde, Bildirim çubuğunda bir Bildirim de görüntülenecek bir Etkinliğim var.

Böylece Kullanıcı eve bastığında ve Etkinlik arka plana itildiğinde, Bildirim yoluyla Etkinliğe geri dönebilir.

Sorun, bir kullanıcı geri düğmesine bastığında, Etkinliğim yok edildiğinde, ancak kullanıcının geri basabilmesini ancak Bildirim yoluyla Etkinliğe erişebilmesini istediğim gibi Bildirim devam ediyor. Ancak bir KULLANICI bunu denediğinde, Null Pointers'ı eskisini geri getirmek yerine yeni bir faaliyet başlatmaya çalışır.

Bu yüzden aslında Geri düğmesinin Ana Sayfa düğmesiyle aynı şekilde hareket etmesini istiyorum ve işte şu ana kadar denedim:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

Ancak yukarıdaki kod yine de Faaliyetimin yok edilmesine izin veriyor gibi görünüyor, Geri düğmesine basıldığında Faaliyetimin yok edilmesini nasıl durdurabilirim?




Ayrıca kodunuzu `` if (Integer.parseInt (android.os.Build.VERSION.SDK)> 5 , the <'' olarak değiştirmelisiniz >.
SudoPlz

1
Bunu çözseniz bile, sistemin uygulamanızı öldürme olasılığını hala ele almalısınız, değil mi? Yani null dava hala mümkün mü? Veya sistem uygulamanızı herhangi bir nedenle öldürürse, bu da bildiriminizi kaldıracak mı? Ben bir sorun olması gerektiğini düşünüyorum, çünkü uygulama olmasa bile bir bildirim amacı var olmaktır.
ToolmakerSteve

Örnek uygulama kodunu buradan kontrol edin freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Yanıtlar:


277

Anahtar dinleyicinizi kaldırın veya trueelinizde olduğunda geri dönün KEY_BACK.

Sadece arkanıza anahtarı (emin olun aramamamı yakalamak için aşağıdaki ihtiyaç süper içinde onBackPressed()).

Ayrıca, bir hizmetin arka planda çalışmasını planlıyorsanız, startForeground()sürekli bir bildirim aldığınızdan emin olun, aksi takdirde Android belleği boşaltması gerekiyorsa hizmetinizi öldürür.

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

70

Bunu yalnızca bir kod satırı ile uygulamak daha kolaydı:

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}

Bu kabul edilen cevap olmalı. Bu tam olarak sorunun sorduğu şeyi yapar ve temiz yerleşik işlevselliği kullanır.
Shadoninja

Teşekkür ederim :) arkasındaki kavramı geliştirebilir misiniz?
Farrukh Faizy

1
OnBackPressed () olayını geçersiz kılarak etkinliği arkaya taşır.
Squirrelkiller

1
Bu çözüm, uygulamayı ana ekrandan yeniden başlattığınızda (görev yığınında başka bir etkinlik varsa) etkinliği geri getirmez.
IgorGanapolsky

12

İstediğiniz şeyin geri düğmesini geçersiz kılmak değil (bu sadece iyi bir fikir gibi görünmüyor - Android OS bu davranışı tanımlar, neden değiştiriyor?), Ancak Etkinlik Yaşam Döngüsünü kullanmak ve ayarlarınızı / verilerinizi onSaveInstanceState (Bundle) olayı.

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

Ardından , bu kalıcı paketten her şeyi almak ve durumunuzu yeniden oluşturmak için onCreate (Bundle) kullanın.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

Sizi doğru yöne yönlendirmek için yukarıdaki psuedo kodunu düşünün. Etkinlik Yaşam Döngüsü'nü okumak , aradığınızı başarmanın en iyi yolunu belirlemenize yardımcı olacaktır.


Merhaba Kiswa, bu doğru, varsayılan davranışı değiştirmek istemiyorum. OnSavedInstanceState'i kullanmayı denedim ve işe yaramadı ama şimdi hatamı fark ettiğime inanıyorum. Teşekkürler
Donal Rafferty

5
Aslında yeni Aktiviteler başlatmadan standart Aktivite yığını davranışını simüle etmek istediğim en az birkaç durumla karşılaştım. Bu durumlarda, varsayılan onBackPressed () davranışını geçersiz kılmak uygun olduğunu düşünüyorum. Bununla birlikte, genel olarak, katılıyorum: geçersiz kılmaktan kaçının.
Matt Briançon

4
@Matt'a katılıyorum. Şu anda NDK kullanan bir çapraz platform oyunu üzerinde çalışıyorum. Bu nedenle, her şeyin tek bir etkinlik olması en kolay yoldur. Bu nedenle, geri düğmesinin varsayılan davranışı uygulamadan kaçmaktır, bu da çoğu kullanıcının beklediği şey değildir. Bu nedenle, kullanıcının aslında farklı bir etkinliğe gitmiş gibi aktivitenin farklı davranmasını sağlamak için varsayılan davranışın üzerine yazmak zorunda kaldım ve yalnızca belirli durumlarda uygulamayı bıraktım.
Leif Andersen

1
OnSaveInstanceState ve verileri kaydetmek tamamen farklı bir soru değil mi?
Ted

@Ted -onSaveInstanceState ek olarak, aynı zamanda UI olmayan uygulama verileri kalıcı kod olması gerektiğini söylüyorsanız, o zaman katılıyorum. Ön planı bıraktığınız anda, uygulamanız başka bir uyarı yapılmaksızın öldürülebilir. Her zaman önemli olan her şeyi kurtarmalıdır. Öte yandan, uygulamayı yaşamak için hangi tekniği kullandığınıza bakılmaksızın, uygulamayı saklamak için kullandığınız teknikten bağımsız olarak uygulama yaşam döngüsü yöntemlerinin çağrıldığını düşünüyorum, bu nedenle sadece bu durum için kaydetme mantığı eklemek gerekli olmamalıdır. Uygulamanız ne olursa olsun bu kodun tüm doğru yerlerde olması gerekir.
ToolmakerSteve

11

sadece bunu yap ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

//super.onBackPressed () öğesini yorumlamak; hile yapacak


1
Yararlı bir gözlem, ancak bu geri düğmesinin kırılmış gibi hiçbir şey yapmasına neden olmaz mı? Bu iyi bir şey değil - kullanıcılar için kafa karıştırıcı ve sinir bozucu. IMHO, söz konusu talep edildiği gibi Ana Sayfa düğmesi gibi davranmak için başka bir yanıttan mantık eklemelidir. Kabul edilen cevap , kasten süper yöntem demediklerini belirtmektedir.
ToolmakerSteve

Evet, kesinlikle haklısın. Sadece geri düğmesini geçersiz kılar ve oraya biraz mantık koyana kadar hiçbir şey yapmaz. Uygulamayı kapatmak için düğmeye iki kez basmak için bir koşul olabilir veya sadece devam eden bir işlemi (ilerleme iletişim kutusu) vb.
androCoder-BD

5

Bunu dene:

@Override
public void onBackPressed() {
    finish();
}

3

Geri düğmesinin (telefonun altında) ve ev düğmesinin (eylem çubuğunun solundaki) davranışını işlemek istiyorsanız, projemde kullandığım bu özel etkinlik size yardımcı olabilir .

import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

Faaliyetinizde kullanım örneği:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}

1
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)

0

Kotlin'de:

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    // Handle the back button event
}

Daha fazla bilgi için kontrol edebilirsiniz bu .

Kotlin'de geri düğmesinin geçersiz kılınmasıyla ilgili özel bir soru da var .

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.