Ana sayfa düğmesi gibi davranmak için geri düğmesini geçersiz kıl


253

Geri düğmesine basıldığında, uygulamamın yok edilen durumdan ziyade durdurulmuş duruma geçmesini istiyorum.

Android dokümanlarında şunları belirtir:

... tüm faaliyetler GERİ düğmesine basıldığında yok edilme davranışına sahip değildir. Kullanıcı Müzik uygulamasında müzik çalmaya başladığında ve ardından GERİ düğmesine bastığında, uygulama normal sırt davranışını geçersiz kılar, oynatıcı etkinliğinin yok olmasını önler ve etkinliği artık görünmese bile müzik çalmaya devam eder

Bu işlevi kendi uygulamamda nasıl çoğaltırım?

Bence üç olasılık olmalı ...

  1. Geri düğmesine basın (aşağıdaki gibi) düğmesine basın ve ardından ana sayfa düğmesinin çağırdığı yöntemi / yöntemleri çağırın.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
  2. Geri düğmesine basın ve ardından bir ev düğmesine basın.

  3. Geri düğmesine basıp yakalayın, ardından ana ekranın bir Etkinliğini başlatın, uygulamamın Etkinliğini etkin bir şekilde durdurulmuş duruma getirin.

Düzenleme: Hizmetler hakkında bilmek ve bu sorunun ilişkili olduğu uygulamada bir kullanıyorum. Bu soru özellikle geri düğmesine basıldığında yok edilen durum yerine Etkinliği durdurulmuş duruma getirmekle ilgilidir.


Yanıtlar:


338

Çoğu zaman arka planda bir şey gerçekleştirmek için bir Hizmet oluşturmanız gerekir ve görünür durumunuz Activitybunu kontrol eder Service. (Docs örnek biraz yanıltıcı görünüyor bu yüzden emin Müzik çalar, aynı şekilde çalışır ediyorum.) O zaman, senin durum buysa Activitykutu finishzamanki gibi ve Servicehala çalışıyor olacak.

Daha basit bir yaklaşım, Backdüğmeye basıp moveTaskToBack (true) öğesini aşağıdaki gibi çağırmaktır :

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Tercih edilen seçeneğin bir Faaliyetin normal olarak bitmesi ve kendini yeniden oluşturabilmesi gerekir, örneğin gerektiğinde bir Servisin mevcut durumunu okumak. Ancak moveTaskToBackbazen hızlı bir alternatif olarak kullanılabilir.

NOT : Dave'in Android 2.0'ın altında işaret ettiği gibi yeni bir onBackPressedyöntem ve Geri düğmesinin nasıl ele alınacağına ilişkin bu öneriler sunuldu .


1
moveTaskToBack () işlevi istendiği gibi çalışıyor. Bu yöntemi kullanmanın olumsuz yönleri neler olabilir? Bunun beklendiği gibi çalışmayabileceği durumlar var mı?
bdls

1
Dokümanını daha dikkatli okuduktan sonra, aslında iyi çalışması gerektiğini düşünüyorum. (Başlangıçta aktiviteye uygulandığını düşündüm, ama aslında "bu aktiviteyi içeren görev" diyor.) Ama elbette kendiniz için test etmelisiniz. :)
Mirko N.4

Teşekkürler Mirko, yöntem iyi çalışıyor gibi görünüyor. Bu soruya daha sonra bakanlar için cevabınızın alt kısmındaki düzenlemenize daha fazla önem verirseniz, bu biraz arıyordunuz - bu biraz aradığım şeydi!
bdls

4
Geri tuşunu kullanmanın önerilen yolu için lütfen android-developers.blogspot.com/2009/12/… adresini okuyun .
hackbod

1
@bdls teoride, kaynaklarınız azalırsa arka plan etkinliğiniz sistem tarafından öldürülebilir, bu yüzden güvende olmak için yine de kendini yeniden oluşturabilmelidir. Android Müzik uygulamasının kaynak koduna bir göz attım ve özel bir geri düğmesi kullanımı görmüyorum.
Mirko N.4

46

Aşağıdaki kodu kullanın:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

23

Geri Düğmesini yakalamak istiyorsanız , Android Geliştirici Blogundaki bu gönderiye bir göz atın . Android 2.0'da bunu yapmanın daha kolay yolunu ve 1.x ve 2.0'da çalışan bir uygulama için bunu yapmanın en iyi yolunu kapsar.

Ancak, Etkinliğiniz Durduruldu ise, cihazdaki bellek kullanılabilirliğine bağlı olarak yine de öldürülebilir. Bir işlemin UI olmadan çalışmasını istiyorsanız bir Service. Belgeler Servisler hakkında şunları söylüyor:

Bir hizmetin görsel bir kullanıcı arabirimi yoktur, bunun yerine arka planda belirsiz bir süre çalışır. Örneğin, bir hizmet, kullanıcı diğer konulara katıldıkça arka plan müziği çalabilir veya ağ üzerinden veri alabilir veya bir şey hesaplayabilir ve buna ihtiyaç duyan etkinliklere sonuç verebilir.

Bunlar gereksinimlerinize uygun görünüyor.



14

bir başkasına yardım ederse, bir tür sayfa1> sayfa2 yapısı taklit etmeye çalışarak görünürlük için açıp kapadığım 2 düzen ile bir etkinliğim vardı. sayfa 2'deydiler ve geri düğmesine bastılarsa sayfa 1'e geri dönmelerini istedim, sayfa 1'deki geri düğmesine basarlarsa yine de normal şekilde çalışmalıdır. Oldukça basit ama işe yarıyor

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

umarım birine yardım eder, şerefe


10

Çalışma örneği ..

Super.onBackPressed () öğesini aramadığınızdan emin olun;

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

Bu şekilde Geri Düğmeniz Ana Sayfa düğmesi gibi davranır. Etkinliğinizi bitirmez, ancak arka plana götürür

İkinci yolu aramaktır moveTaskToBack(true);içinde onBackPressedve kaldırmak için emin olunsuper.onBackPressed


0

Daha da iyisi, OnPause () hakkında :

Bir etkinlik arka plana giderken (henüz) öldürülmediğinde etkinlik yaşam döngüsünün bir parçası olarak adlandırılır. Karşılığı onResume ().

B aktivitesi A aktivitesinin önünde başlatıldığında, bu geri arama A'da başlatılır. A'nın onPause () geri dönmesine kadar B oluşturulmaz, bu yüzden enter code hereburada uzun bir şey yapmadığınızdan emin olun .

Bu geri arama çoğunlukla etkinliğin düzenlediği kalıcı durumların kaydedilmesi ve yeni etkinliği başlatmak için yeterli kaynağı yoksa hiçbir şeyin kaybolmamasını sağlamak için kullanılır.

Bu aynı zamanda durdurma animasyonları ve bir sonraki etkinliğe geçişi olabildiğince hızlı hale getirmek veya kamera gibi özel erişimli kaynakları kapatmak için dikkat çekici miktarda CPU tüketen diğer şeyleri yapmak için iyi bir yerdir.


0

Android 2.0'dan sonra onBackPressed () geçersiz kıl. Gibi

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

0

Yukarıdaki tüm çözümleri denedim, ancak hiçbiri benim için çalışmadı. Aşağıdaki kod, onCreate'nin çağrıldığı şekilde MainActivity'ye dönmeye çalışırken bana yardımcı oldu:

Niyet.FLAG_ACTIVITY_CLEAR_TOP anahtardır.

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

Yeni Özel EditText kullanarak @Mirko N. yanıtlayıcı kullanıyorum

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

Ardından etkinliğinizden veri ayarlayın

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Teşekkür ederim.

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.