Saya ingin tahu apakah pengguna akan kembali ke layar beranda jika dia keluar dari aktivitas saat ini.
Saya ingin tahu apakah pengguna akan kembali ke layar beranda jika dia keluar dari aktivitas saat ini.
Jawaban:
UPDATE (Jul 2015):
Sejak getRunningTasks () mendapatkan usang, dari API 21 itu lebih baik untuk mengikuti raukodraug jawaban atau Ed Burnette satu (saya lebih suka satu detik).
Ada kemungkinan untuk memeriksa tugas saat ini dan tumpukannya menggunakan ActivityManager .
Jadi, untuk menentukan apakah suatu aktivitas adalah yang terakhir:
Gunakan kode berikut:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Harap dicatat, kode di atas hanya akan berlaku jika Anda memiliki tugas tunggal. Jika ada kemungkinan sejumlah tugas akan ada untuk aplikasi Anda - Anda harus memeriksa elemen daftar tugas lainnya . Baca lebih lanjut tentang tugas Tasks dan Back Stack
isTaskRoot()
metode ini.
Saya akan memposting komentar @ H9kDroid sebagai jawaban terbaik di sini untuk orang-orang yang memiliki pertanyaan serupa.
Anda bisa menggunakan isTaskRoot () untuk mengetahui apakah aktivitas adalah root tugas.
saya harap ini membantu
if (isTaskRoot()) { // do something }
Semoga ini bisa membantu pemula baru, Berdasarkan jawaban di atas yang berfungsi dengan baik bagi saya, saya juga membagikan cuplikan kode sehingga akan mudah diterapkan.
solusi: saya menggunakan isTaskRoot()
yang mengembalikan true jika aktivitas saat ini hanya aktivitas di tumpukan Anda dan selain saya juga menangani kasus di mana jika saya memiliki beberapa aktivitas di tumpukan pergi ke aktivitas terakhir dalam tumpukan alih-alih membuka yang baru kustom.
Dalam aktivitas Anda
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
ada solusi termudah untuk ini, Anda bisa menggunakan isTaskRoot () dalam aktivitas Anda
Meskipun mungkin ada cara untuk mencapai ini (lihat jawaban lain), saya menyarankan agar Anda tidak melakukan itu. Aplikasi Android normal tidak perlu mengetahui apakah layar Utama akan ditampilkan atau tidak.
Jika Anda mencoba untuk menyimpan data, masukkan kode penyimpanan data dalam metode onPause () Anda. Jika Anda mencoba memberi pengguna cara untuk mengubah pikirannya tentang aplikasi yang sudah ada, Anda bisa mencegat tombol atas / bawah untuk tombol Kembali dan metode onBackPressed () dan menampilkan "Apakah Anda yakin?" cepat.
Salah satu cara untuk melacaknya adalah dengan menyertakan penanda saat Anda memulai aktivitas baru dan memeriksa apakah penanda tersebut ada.
Setiap kali Anda memulai aktivitas baru, masukkan penanda:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Dan Anda kemudian dapat memeriksanya seperti ini:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Masalah dengan solusi sandrstar yang digunakan ActivityManager
adalah: Anda memerlukan izin untuk mendapatkan tugas dengan cara ini. Saya menemukan cara yang lebih baik:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Di Activity
bagian bawah Stack selalu mendapatkan kategori ini secara default sementara Aktivitas lain tidak boleh mendapatkannya.
Tetapi meskipun ini gagal pada beberapa perangkat, Anda dapat mengaturnya saat memulai Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Saya telah membuat kelas dasar untuk semua aktivitas saya, memperluas AppCompatActivity , dan yang memiliki penghitung statis:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Ini telah bekerja dengan cukup baik, sejauh ini; dan apa pun versi API-nya. Tentu saja diperlukan bahwa semua aktivitas memperluas kelas dasar ini - yang mereka lakukan, dalam kasus saya.
Edit: Saya perhatikan satu contoh ketika penghitung turun ke nol sebelum aplikasi benar-benar keluar, yaitu ketika orientasi diubah dan hanya satu aktivitas yang terbuka. Ketika orientasi berubah, aktivitas ditutup dan yang lain dibuat, sehingga onDestroyed
dipanggil untuk aktivitas terakhir, dan kemudian onCreate
dipanggil saat aktivitas yang sama dibuat dengan orientasi yang diubah. Perilaku ini harus diperhitungkan; OrientationEventListener mungkin dapat digunakan.
Android mengimplementasikan tumpukan Aktivitas, saya sarankan Anda membacanya di sini . Sepertinya semua yang ingin Anda lakukan meskipun adalah mengambil aktivitas panggilan: getCallingActivity()
. Jika aktivitas saat ini adalah aktivitas pertama dalam aplikasi Anda dan aplikasi diluncurkan dari layar beranda, ini harus (saya asumsikan) kembali null
.
Satu hal yang terlewat di sini, adalah klik "Tombol Beranda", ketika diaktifkan, Anda tidak dapat mendeteksi ini dari aktivitas Anda, jadi akan lebih baik untuk mengontrol tumpukan aktivitas secara terprogram dengan menangani penekanan "Tombol kembali" dan berpindah ke aktivitas yang diperlukan atau hanya melakukan langkah-langkah yang diperlukan.
Selain itu, Anda tidak bisa memastikan, bahwa memulai aktivitas Anda dari daftar "Aktivitas Terkini" bisa dideteksi dengan menyetel beberapa data tambahan ke dalam maksud untuk membuka aktivitas, karena digunakan kembali dalam kasus tersebut.