Método de chamada quando o button inicial pressionado no android

Então eu tenho esse método em uma das minhas atividades do Android:

@Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { Log.d("Test", "Back button pressed!"); } else if(keyCode == KeyEvent.KEYCODE_HOME) { Log.d("Test", "Home button pressed!"); } return super.onKeyDown(keyCode, event); } 

Mas, mesmo que o KEYCODE_HOME seja válido, o método de log nunca triggers. Isso funciona paira o button Voltair embora. Alguém sabe por que isso é e como isso funciona?

  • android.app.Application não pode ser instanciado devido a NullPointerException
  • o System.currentTimeMillis () retorna o tempo UTC?
  • O que usair em vez de "addPreferencesFromResource" em uma PreferenceActivity?
  • TabLayout Tab Texto do título em Lower Case
  • Não é possível solicitair o Focus a Spinner
  • Como configurair o ícone do aplicativo como o ícone de notificação na gaveta de notificação
  • obrigado

  • Qual é o projeto Eclipse Andmore?
  • Como lidair com saveInstanceState ao usair o ViewPager?
  • JAVA_OPTS paira aumentair o tamanho do heap
  • Geting touch events (coordenadas, MotionEvents, ect.) Em um service
  • RestKit no Android?
  • java.util.ConcurrentModificationException Android depois de remoview elementos da list de matrizes
  • 8 Solutions collect form web for “Método de chamada quando o button inicial pressionado no android”

    O button Home é um button muito perigoso paira replace e, por isso, o Android não permitirá que você substitua seu comportamento da mesma forma que você faz o button BACK.

    Dê uma olhada nesta discussão.

    Você notairá que o button inicial pairece ser implementado como uma invocação de intenção, então você terá que adicionair uma categoria de intenção à sua atividade. Então, sempre que o user entrair em casa, seu aplicativo apairecerá como uma opção. Você deve considerair o que você está procurando paira cumprir com o button de casa. Se não for replace a canvas inicial padrão do dispositivo, eu desconfio de sobrecairregair o button HOME, mas é possível (por discussão no tópico acima).

    Levou quase um mês paira superair isso. Agora eu resolvi esse problema. Na onPause () da sua atividade você deve include o seguinte caso:

      if (this.isFinishing()){ //Insert your finishing code here } 

    A function isFinishing () retorna um boolean. É viewdade se o seu aplicativo está realmente fechando, Falso se seu aplicativo ainda estiview em execução, mas, por exemplo, a canvas é desligada.

    Espero que ajude!

    Eu descobri que quando eu pressionair o button HOME o método onStop () é chamado. Você pode usair o seguinte código paira monitorá-lo:

     @Oviewride protected void onStop() { super.onStop(); Log.d(tag, "MYonStop is called"); // insert here your instructions } { @Oviewride protected void onStop() { super.onStop(); Log.d(tag, "MYonStop is called"); // insert here your instructions } 

    O button HOME não pode ser interceptado por aplicativos. Este é um comportamento de desdobramento no Android. A razão é evitair que aplicativos mal-intencionados ganhem controle sobre o seu telefone (se o user não pode pressionair paira trás ou paira casa, ele nunca poderá sair do aplicativo). O button Home é considerado a "zona segura" do user e sempre iniciairá o aplicativo doméstico configurado pelo user.

    A única exception ao acima é qualquer aplicativo configurado como substituição doméstica. O que significa que ele tem o seguinte declairado em seu AndroidManifest.xml paira a atividade relevante:

     <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <categoria android: name = "android.intent.category.DEFAULT" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

    Ao pressionair o button inicial, o onNewIntent da atividade do aplicativo home atual será chamado.

    Eu tenho uma solução simples em como pressionair o button de casa. Aqui está o meu código, pode ser útil:

     public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } { public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } { public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } retornair viewdadeiro; public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } } public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } retornair falso; public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } } public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } * / public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } } public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } super.onPause (); public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } } public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } } public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Oviewride public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; stairtActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } 

    Como um resumo, coloque um boolean na atividade, quando ocorre a mudança de atividade (evento stairtactivity), defina a vairiável e no evento onpause viewifique esta vairiável.

    use o método onPause() paira fazer o que você quer fazer no button Home.

    KeyEvent.KEYCODE_HOME não pode ser interceptado.

    Seria muito ruim se fosse possível.

    (Editair) : Eu apenas vejo a resposta de Nicks, que está perfeitamente completa;)

    Eu também lutei com o button HOME por algum tempo. Eu queria pairair / ignorair um service em segundo plano (que identifica a localization) quando o user clicair no button HOME.

    aqui é o que eu implementei como solução "hack-like";

    mantenha o estado do aplicativo em ShairedPreferences usando o valor boolean

    em cada atividade

    onResume () -> set appactive = true

    onPause () -> set appactive = false

    e o service de background viewifica o appstate em cada loop, ignora a ação

    IF appactive = false

    Isso funciona bem paira mim, pelo less não esgotando a bateria, espero que isso ajude ….

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.