2011-04-05 13 views
17

Quiero crear mi propia pantalla de "inicio" en mi Android, y quiero llamar a esa pantalla de inicio desde mi aplicación.¿Puedo anular el botón "Inicio" en mi aplicación?

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

Respuesta

3

Hola de nuevo 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); 
} 
+0

muchas gracias, ya que discutimos mucho sobre este tema ... esta Q. se le pregunta al mismo tiempo de ese HOME-Screen Launcher Q..y usted me dio soluciones ... gracias de nuevo ... – Smith

+0

de nada. – Aleadam

+44

Esto no funciona en ninguna versión de Android, AFAIK, y ciertamente no en nada reciente. – CommonsWare

6

Se supone que el botón de inicio debe hacer una cosa y una cosa única y consistentemente. 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!

+0

realidad yo quiero bloquear esa pantalla cuando se produjo mi propia pantalla de inicio. Por eso quiero controlar el botón de INICIO en mi propia PANTALLA DE INICIO – Smith

+1

Simplemente no lo hace nse IMO. – markus

+0

Entonces, ¿Home es el control en mi propia pantalla de inicio? – Smith

13

de anulación por debajo del método.

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

Con este método, los topes del botón del hogar que trabajan en esta actividad (sólo 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);  
} 
+0

OK, con onAttachedToWindow() anule esto realmente funciona, pero podría ser muy peligroso si todos los botones están deshabilitados, bloqueando al usuario, con la única forma de salir de la aplicación eliminando el batería ... – ateiob

+4

@ateiob: Afortunadamente, este agujero de seguridad se ha solucionado, a partir de Android 4.0. – CommonsWare

+1

@CommonsWare Gracias por esta información. ¿Es esto realmente un agujero ** de seguridad **? ¿O simplemente un "agujero de frustración del usuario"? – ateiob

8

En AndroidManifest.xml

<activity 
    ... 
    android:launchMode="singleTask"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <category android:name="android.intent.category.HOME" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     .... 
    </intent-filter> 
</activity> 

Es necesario launchMode="singleTask" por lo que la intención es entregado a la aplicación 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"); 

     } 
    } 

usted no recibe un evento clave

+0

que no funciona en lollipop. –

+0

Funcionó para mí en Android M y superior. – Harpreet

0

Prueba esta actividad

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

botón de inicio No, no podemos sobreescribir pero puedo depositar dinero en una solución para este ....:

public boolean isApplicationSentToBackground(final Context context) { 
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> 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(); 
} 

cambios cosméticos a la manifiesta Archivo-

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

Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. Lea este [cómo-para-responder] (http://stackoverflow.com/help/how-to-answer) para proporcionar una respuesta de calidad. – thewaywewere

0

Si alguien necesidad de detectar y ovveride INICIO comportamiento utilizar el botón Thois 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() 
         } 
        } 
       } 
      } 
     } 
    } 
} 

MainActivity

class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { 

    private var launchers = ArrayList<AppLauncher>() 
    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 
} 
Cuestiones relacionadas