android - numero - que es interruptor en el celular
¿Puedo anular el botón ''Inicio'' en mi aplicación? (7)
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 mi pantalla de inicio en lugar de la pantalla de inicio predeterminada? ¿Es posible anular el botón de inicio?
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 INICIO deja de funcionar en esta actividad (solo esta actividad). Luego, simplemente se vuelve a implementar como un evento de botón normal (el botón de retroceso, 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
<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>
Necesita launchMode="singleTask"
para que la intención 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 consigues un evento clave.
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, según 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);
}
No, no podemos anular el botón de inicio, pero financio una solución para esto ...:
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();
}
hacer cambios en el archivo de manifiestos
<uses-permission android:name="android.permission.GET_TASKS" />
Prueba esto en actividad
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
break;
default:
return super.onOptionsItemSelected(item);
}
return false;
}
Se supone que el botón de inicio debe hacer una cosa y una sola y de manera consistente. Devuelve al usuario a la pantalla de INICIO. Incluso si pudiera anular su comportamiento, sería algo extremadamente hostil para el usuario. ¡Así que no lo hagas y resuelve tu problema de manera diferente!
Si alguien necesita detectar y anular el comportamiento del botón INICIO, utilice este enfoque 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<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
}