Ganti tombol kembali untuk bertindak seperti tombol beranda

253

Dengan menekan tombol kembali, saya ingin aplikasi saya masuk ke keadaan berhenti, bukan ke keadaan hancur.

Dalam dokumen Android disebutkan:

... tidak semua aktivitas memiliki perilaku yang dihancurkan ketika KEMBALI ditekan. Ketika pengguna mulai memutar musik di aplikasi Musik dan kemudian menekan KEMBALI, aplikasi menimpa perilaku punggung normal, mencegah aktivitas pemain dari dihancurkan, dan terus memutar musik, meskipun aktivitasnya tidak lagi terlihat

Bagaimana cara mereplikasi fungsi ini di aplikasi saya sendiri?

Saya pikir pasti ada tiga kemungkinan ...

  1. Menangkap tombol kembali, tekan (seperti di bawah) dan kemudian panggil metode apa pun yang tombol rumah panggil.

    @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. Menangkap tombol kembali, tekan lalu spoof tombol home tekan.

  3. Menangkap tombol kembali, tekan, lalu mulailah sebuah Aktivitas di layar beranda, secara efektif menempatkan Aktivitas aplikasi saya ke dalam keadaan terhenti.

Sunting: Saya tahu tentang layanan dan saya menggunakan satu di aplikasi yang terkait masalah ini. Pertanyaan ini secara khusus tentang menempatkan Aktivitas ke keadaan berhenti daripada keadaan hancur dengan menekan tombol kembali.

bdl
sumber
lihat jawaban serupa stackoverflow.com/questions/5914040/...
Zar E Ahmer

Jawaban:

338

Sebagian besar waktu Anda perlu membuat Layanan untuk melakukan sesuatu di latar belakang, dan Anda yang terlihat Activityhanya mengendalikan ini Service. (Saya yakin Pemutar musik bekerja dengan cara yang sama, jadi contoh dalam dokumen tampaknya agak menyesatkan.) Jika itu yang terjadi, maka Activitykaleng Anda finishseperti biasa dan Servicemasih akan berjalan.

Pendekatan yang lebih sederhana adalah dengan menangkap Backtombol, tekan dan panggil moveTaskToBack (true) sebagai berikut:

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

Saya pikir opsi yang lebih disukai seharusnya untuk Kegiatan selesai secara normal dan dapat membuat ulang sendiri misalnya membaca keadaan saat ini dari Layanan jika diperlukan. Tetapi moveTaskToBackbisa digunakan sebagai alternatif cepat pada kesempatan tertentu.

CATATAN : seperti yang ditunjukkan oleh Dave di bawah Android 2.0 memperkenalkan onBackPressedmetode baru , dan rekomendasi ini tentang cara menangani tombol Kembali.

Mirko N.
sumber
1
moveTaskToBack () tampaknya berfungsi seperti yang diinginkan. Apa kerugiannya menggunakan metode ini? Apakah ada kasus di mana ini mungkin tidak berfungsi seperti yang diharapkan?
bdls
1
Setelah membaca dokumennya lebih hati-hati, saya benar-benar berpikir itu akan berfungsi dengan baik. (Awalnya saya pikir itu berlaku untuk kegiatan tersebut, tetapi sebenarnya ia mengatakan "tugas yang mengandung kegiatan ini".) Tetapi Anda harus mengujinya sendiri tentu saja. :)
Mirko N.
Terima kasih Mirko, metode ini tampaknya bekerja dengan baik. Mungkin keren jika Anda lebih menonjolkan hasil edit Anda di bagian bawah jawaban Anda bagi mereka yang melihat pertanyaan ini nanti - karena itulah yang saya cari!
bdls
4
Silakan baca android-developers.blogspot.com/2009/12/... untuk cara yang disarankan untuk menangani tombol kembali.
hackbod
1
@bdls secara teori, aktivitas latar belakang Anda dapat dimatikan oleh sistem jika kehabisan sumber daya, jadi agar aman itu tetap dapat membuat ulang sendiri. Saya telah melihat kode sumber untuk aplikasi Android Music dan tidak melihat penanganan tombol kembali khusus.
Mirko N.
46

Gunakan kode berikut:

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

Jika Anda ingin menangkap Tombol Kembali lihat posting ini di Blog Pengembang Android . Ini mencakup cara yang lebih mudah untuk melakukan ini di Android 2.0 dan cara terbaik untuk melakukan ini untuk aplikasi yang berjalan pada 1.x dan 2.0.

Namun, jika Aktivitas Anda Dihentikan, masih dapat dimatikan tergantung pada ketersediaan memori pada perangkat. Jika Anda ingin proses dijalankan tanpa UI, Anda harus membuat a Service. Dokumentasi mengatakan yang berikut tentang Layanan:

Layanan tidak memiliki antarmuka pengguna visual, melainkan berjalan di latar untuk jangka waktu yang tidak terbatas. Misalnya, suatu layanan dapat memutar musik latar saat pengguna menghadiri hal-hal lain, atau mungkin mengambil data melalui jaringan atau menghitung sesuatu dan memberikan hasilnya pada aktivitas yang membutuhkannya.

Ini tampaknya sesuai untuk kebutuhan Anda.

Dave Webb
sumber
18

mencoba untuk menimpa kekosongan yang onBackPressed()didefinisikan dalam kelas android.app.Activity.

m-szalik
sumber
1
karena android 2.0 ini adalah hal yang benar untuk ditimpa. developer.android.com/sdk/android-2.0.html
jay
14

jika itu membantu orang lain, saya memiliki aktivitas dengan 2 tata letak yang saya matikan dan matikan agar terlihat, mencoba meniru semacam struktur page1> page2. jika mereka ada di halaman 2 dan menekan tombol kembali saya ingin mereka kembali ke halaman 1, jika mereka menekan tombol kembali di halaman 1 itu masih akan berfungsi seperti biasa. Cukup mendasar tetapi berfungsi

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

}

Semoga ini bisa membantu seseorang, tepuk tangan

craigk
sumber
10

Contoh kerja ..

Pastikan jangan menelepon super.onBackPressed ();

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

Dengan cara ini Tombol Kembali Anda bertindak seperti tombol Beranda. Itu tidak menyelesaikan aktivitas Anda tetapi membawanya ke latar belakang

Cara kedua adalah dengan memanggil moveTaskToBack(true);di onBackPresseddan pastikan untuk menghapussuper.onBackPressed

Zar E Ahmer
sumber
0

Lebih baik lagi, bagaimana dengan OnPause () :

Disebut sebagai bagian dari siklus hidup aktivitas ketika suatu aktivitas berjalan ke latar belakang, tetapi belum (belum) terbunuh. Mitra untuk onResume ().

Ketika aktivitas B diluncurkan di depan aktivitas A, panggilan balik ini akan dipanggil pada A. B tidak akan dibuat sampai A onPause () kembali, jadi pastikan untuk enter code heretidak melakukan apa pun yang panjang di sini.

Callback ini sebagian besar digunakan untuk menyimpan keadaan persisten yang sedang diedit dan memastikan tidak ada yang hilang jika tidak ada sumber daya yang cukup untuk memulai aktivitas baru tanpa terlebih dahulu membunuh yang ini.

Ini juga merupakan tempat yang baik untuk melakukan hal-hal seperti menghentikan animasi dan hal-hal lain yang mengonsumsi CPU dalam jumlah yang cukup besar agar dapat beralih ke aktivitas berikutnya secepat mungkin, atau untuk menutup sumber daya yang merupakan akses eksklusif seperti kamera.

pengguna1524315
sumber
0

Override onBackPressed () setelah android 2.0. Seperti

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

Saya sudah mencoba semua solusi di atas, tetapi tidak ada satupun yang bekerja untuk saya. Kode berikut membantu saya, ketika mencoba kembali ke MainActivity dengan cara yang dipanggil onCreate:

Intent.FLAG_ACTIVITY_CLEAR_TOP adalah kuncinya.

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

Saya telah menggunakan @Mirko N. answerser dengan membuat CustomText Edit baru

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

}

Kemudian atur data dari aktivitas Anda

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Terima kasih.

Sameer Z.
sumber