Pertanyaan Deteksi tombol home tekan di android


Ini telah membuatku gila untuk sementara waktu sekarang.

Apakah ada cara mendeteksi secara andal jika tombol home telah ditekan dalam aplikasi android?

Kegagalan itu, apakah ada cara yang kuat untuk mengatakan apa yang menyebabkan suatu kegiatan masuk ke dalam Jeda? i.e Bisakah kita mendeteksi apakah itu disebabkan oleh peluncuran aktivitas baru atau dengan menekan kembali / beranda.

Satu saran yang telah saya lihat adalah mengesampingkan onPause () dan memanggil isFinishing () tetapi ini akan mengembalikan false ketika menekan tombol home sama seperti jika aktivitas baru dimulai sehingga ini gagal membedakan antara keduanya.

Bantuan apa pun sangat dihargai.

** Pembaruan **: Terima kasih kepada @ android-hungry untuk tautan ini: http://nisha113a5.blogspot.com/

Menutupi metode berikut:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

Maka acara berikut AKAN dipecat karena penekanan tombol home:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
       //The Code Want to Perform. 
    }
});

Saya tidak yakin apakah ada efek samping dengan baris ini:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

Jadi tampaknya bertentangan dengan kepercayaan populer, Anda sebenarnya dapat mendengarkan kunci rumah. Mengkhawatirkan, Anda dapat kembali palsu dan memiliki kunci rumah tidak melakukan apa-apa.

Memperbarui: Seperti yang diharapkan, ada beberapa sisi yang memengaruhi hal ini - tampaknya video yang disematkan dan peta google tidak terlihat dengan mode ini diaktifkan.

Memperbarui: Seharusnya hack ini tidak lagi berfungsi pada Android 4.0 dan seterusnya


75
2018-01-16 15:12


asal


Jawaban:


Kode berikut berfungsi untuk saya :)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mReceiver = new InnerReceiver();
    }

    public void startWatch() {
        if (mRecevier != null) {
            mContext.registerReceiver(mReceiver, mFilter);
        }
    }

    public void stopWatch() {
        if (mRecevier != null) {
            mContext.unregisterReceiver(mReceiver);
        }
    }

    class InnerReceiver extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    public void onHomePressed();

    public void onHomeLongPressed();
}

99
2018-01-15 03:16



Ini pertanyaan lama tapi mungkin bisa membantu seseorang.

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

Menurut dokumentasi, metode onUserLeaveHint () dipanggil ketika pengguna mengklik tombol home ATAU ketika ada sesuatu yang mengganggu aplikasi Anda (seperti panggilan telepon masuk).

Ini bekerja untuk saya .. :)


41
2017-07-07 14:28



Tidak mungkin mendeteksi dan / atau mencegat tombol RUMAH dari dalam aplikasi Android. Ini dibangun ke dalam sistem untuk mencegah aplikasi berbahaya yang tidak dapat keluar.


10
2018-01-16 15:20



Saya perlu memulai / menghentikan musik latar di aplikasi saya ketika aktivitas pertama dibuka dan ditutup atau ketika aktivitas apa pun dijeda oleh tombol home dan kemudian dilanjutkan dari task manager. Pemutaran murni berhenti / melanjutkan Activity.onPause() dan Activity.onResume() sela musik untuk sementara waktu, jadi saya harus menulis kode berikut:

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

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

yang mengganggu pemutaran hanya ketika aplikasi (semua aktivitasnya) ditutup atau ketika tombol home ditekan. Sayangnya saya tidak berhasil mengubah urutan panggilan onPause() metode aktivitas awal dan onResume() dari actvity mulai kapan Activity.startActivity() dipanggil (atau dideteksi di onPause() kegiatan itu meluncurkan kegiatan lain dengan cara lain) sehingga kasus ini harus ditangani secara khusus:

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

Kelemahan lain adalah bahwa ini membutuhkan GET_TASKS izin ditambahkan ke AndroidManifest.xml:

<uses-permission
  android:name="android.permission.GET_TASKS"/>

Memodifikasi kode ini yang hanya bereaksi pada penekanan tombol home adalah sangat mudah.


7
2018-03-14 19:57



Mengesampingkan onUserLeaveHint() dalam aktivitas. Tidak akan pernah ada panggilan balik ke aktivitas saat aktivitas baru muncul atau pengguna menekan tombol kembali.


4
2018-04-21 11:41



Cobalah untuk membuat penghitung untuk setiap layar. Jika pengguna menyentuh HOME, maka penghitung akan menjadi nol.

public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}

2
2017-08-14 18:04



Anda mungkin mempertimbangkan solusi oleh Andreas Shrade di posnya Bagaimana-Cara Membuat Mode Kios yang Bekerja di Android. Ini sedikit hacky, tetapi mengingat alasan bahwa intersepsi tombol home dicegah itu harus;)


2
2017-07-28 14:15



Saya memiliki masalah ini, dan karena mengesampingkan metode onKeyDown () tidak menyelesaikan apa pun karena sistem android yang mendasari tidak memanggil metode ini, saya memecahkan ini dengan menimpa onBackPressed (), dan saya memiliki nilai boolean yang ditetapkan di sana untuk salah , karena saya menekan, biarkan saya menunjukkan apa yang saya maksud dalam kode:

import android.util.Log;
public class HomeButtonActivity extends Activity {
    boolean homePressed = false;
    // override onCreate() here.

    @Override
    public void onBackPressed() {
        homePressed = false; // simply set homePressed to false
    }

    @Overide
    public void onResume() {
        super.onResume();
        homePressed = true; // default: other wise onBackPressed will set it to false
    }

    @Override
    public void onPause() {
        super.onPause();
        if(homePressed) { Log.i("homePressed", "yay"); }
    }

Jadi alasan mengapa ini berhasil adalah karena satu-satunya cara untuk bernavigasi di luar aktivitas ini adalah dengan menekan kembali atau pulang jadi jika kembali ditekan maka saya tahu penyebabnya tidak ada di rumah, tetapi jika penyebabnya adalah rumah, maka saya menetapkan boolean default nilai untuk homeTekan menjadi kenyataan. Namun ini hanya akan bekerja dengan satu contoh aktivitas dalam aplikasi Anda karena jika tidak, Anda memiliki lebih banyak kemungkinan untuk menyebabkan metode onPause () dipanggil.


2
2017-07-30 22:49



onUserLeaveHint ();

mengganti metode kelas aktivitas ini. Ini akan mendeteksi klik tombol home. Metode ini disebut tepat sebelum aktivitas onPause () callback. Tapi itu tidak akan dipanggil ketika aktivitas terganggu seperti aktivitas panggilan masuk datang ke latar depan, terlepas dari interupsi yang akan memanggil ketika pengguna mengklik tombol home.

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.d(TAG, "home key clicked");
}

1
2017-10-06 14:18



Opsi untuk aplikasi Anda adalah menulis Home Screen pengganti menggunakan android.intent.category.NYANG Maksud. Saya percaya jenis Intent ini Anda dapat melihat tombol home.

Keterangan lebih lanjut:

http://developer.android.com/guide/topics/intents/intents-filters.html#imatch


0
2018-01-16 15:48



Aplikasi rata-rata dapat berjalan dengan baik tanpa perlu mengetahui perbedaan antara pers Rumah dan acara jeda. Dengan kata lain, onPause () biasanya cukup.

Mengapa kamu ingin melakukan ini? Memberi kami informasi lebih lanjut tentang niat Anda dapat menghasilkan strategi keseluruhan yang lebih baik untuk Anda.


0
2018-01-16 15:54