¿Puedo anular el botón “Inicio” en mi aplicación?

Quiero crear mi propia pantalla de “inicio” en mi Android, y quiero llamar a esa pantalla de inicio desde mi aplicación.

¿Cómo puedo anular el botón “Inicio” para que cuando se presione la aplicación se redirija a la pantalla de inicio en lugar de a la pantalla de inicio predeterminada? ¿Es posible anular el botón de inicio?

Esta respuesta ya no funcionará, no desde Android 4.0.

La solución correcta es crear una aplicación que pueda interceptar la intención del Hogar, como se muestra en la respuesta de @ bara a continuación .


Puede anular el botón de inicio como cualquier otro botón:

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_HOME)) { Toast.makeText(this, "You pressed the home button!", Toast.LENGTH_LONG).show(); return true; } return super.onKeyDown(keyCode, event); } 

Anula el método a continuación.

 @Override public void onAttachedToWindow() { Log.i("TESTE", "onAttachedToWindow"); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); } 

Con este método, el botón HOME deja de funcionar en esta actividad (solo esta actividad). Luego, simplemente lo reimplementa, ya que era un evento de botón normal (el botón Atrás, por ejemplo).

 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { Log.i("TESTE", "BOTAO HOME"); return true; } return super.onKeyDown(keyCode, event); } 

En AndroidManifest.xml

       ....   

Necesita launchMode="singleTask" para que el bash se entregue a la aplicación que ya se está ejecutando en lugar de crear una nueva instancia.

En la actividad:

  @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (Intent.ACTION_MAIN.equals(intent.getAction())) { Log.i("MyLauncher", "onNewIntent: HOME Key"); } } 

No obtienes un evento clave

Se supone que el botón de inicio debe hacer una cosa y una sola cosa de manera consistente. Haga que el usuario regrese a la pantalla de inicio. Incluso si pudieras anular su comportamiento, sería algo extremadamente antipático para el usuario. ¡Entonces no lo hagas y resuelve tu problema de manera diferente!

Prueba esto en la actividad

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); break; default: return super.onOptionsItemSelected(item); } return false; } 

Si alguien necesita detectar y superar el comportamiento del botón INICIO, use tho appproach en KOTLIN

 import android.content.Intent import android.content.BroadcastReceiver import android.content.Context import android.content.IntentFilter import android.util.Log class HomeWatcher(context: Context) { val TAG = "hg" private var mContext: Context? = null private var mFilter: IntentFilter? = null private var mListener: OnHomePressedListener? = null private var mRecevier: InnerRecevier? = null // initializer block init { mContext = context mFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) } fun setOnHomePressedListener(listener: OnHomePressedListener) { mListener = listener mRecevier = InnerRecevier() } fun startWatch() { if (mRecevier != null) { this.mContext!!.registerReceiver(mRecevier, mFilter) } } fun stopWatch() { if (mRecevier != null) { this.mContext!!.unregisterReceiver(mRecevier) } } internal inner class InnerRecevier : BroadcastReceiver() { val SYSTEM_DIALOG_REASON_KEY = "reason" val SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions" val SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps" val SYSTEM_DIALOG_REASON_HOME_KEY = "homekey" override fun onReceive(context: Context, intent: Intent) { val action = intent.action if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) { val reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY) if (reason != null) { Log.e(TAG, "action:$action,reason:$reason") if (mListener != null) { if (reason == SYSTEM_DIALOG_REASON_HOME_KEY) { mListener!!.onHomePressed() } else if (reason == SYSTEM_DIALOG_REASON_RECENT_APPS) { mListener!!.onHomeLongPressed() } } } } } } } 

Actividad principal

 class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var launchers = ArrayList() private var mStoredPrimaryColor = 0 private var mStoredTextColor = 0 private var mStoredUseEnglish = false private var receiver: BroadcastReceiver? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) HomeButtonWatcher() } fun HomeButtonWatcher() { val mHomeWatcher = HomeWatcher(applicationContext) mHomeWatcher.setOnHomePressedListener(object : OnHomePressedListener { override fun onHomePressed() { // do something here... Toast.makeText(applicationContext, "onHomePressed", Toast.LENGTH_LONG).show() } override fun onHomeLongPressed() { // do something here... Toast.makeText(applicationContext, "onHomeLongPressed", Toast.LENGTH_LONG).show() } }) mHomeWatcher.startWatch() } // Other code } 

No, no podemos anular el botón de inicio pero financiamos una solución para esto …:

 public boolean isApplicationSentToBackground(final Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List tasks = am.getRunningTasks(1); if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { return true; } } return false; } @Override public void onStop() { if (isApplicationSentToBackground(this)){ //put your code here what u want to do } super.onStop(); } 

hacer cambios en el archivo de manifiestos-