Могу ли я переопределить кнопку "Домой" в своем приложении?

Я хочу создать свой собственный "домашний" экран на моем Android, и я хочу вызвать этот домашний экран из своего приложения.

Как я могу переопределить кнопку "Домой", чтобы при ее нажатии приложение перенаправлялось на домашний экран вместо домашнего экрана по умолчанию? Можно ли переопределить кнопку домой?

8 ответов

Решение

Этот ответ больше не будет работать, начиная с Android 4.0.

Правильное решение состоит в том, чтобы создать приложение, которое может перехватывать намерение Домой, согласно ответу @bara ниже.


Вы можете переопределить кнопку домой как любую другую кнопку:

@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);
}

Переопределите метод ниже.

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

При использовании этого метода кнопка HOME перестает работать в этом упражнении (только в этом упражнении). Затем вы просто переопределяете, как это было обычное событие кнопки (например, кнопка возврата).

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

В 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>

Тебе нужно launchMode="singleTask" поэтому намерение доставляется в уже работающее приложение вместо создания нового экземпляра.

В деятельности:

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

        }
    }

Вы не получите ключевое событие

Кнопка "Домой" должна делать одно и только одно и последовательно. Верните пользователя на экран HOME. Даже если бы вы могли изменить его поведение, это было бы крайне недружелюбным делом для пользователя. Так что не делайте этого и решайте свою проблему иначе!

Нет, мы не можем переопределить кнопку домой, но я финансирую решение для этого....:

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();
}

внести изменения в файл манифестов

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

Если кому-то нужно обнаружить и переопределить поведение кнопки HOME, используйте этот appproach в 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()
                        }
                    }
                }
            }
        }
    }
}

Основная деятельность

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
}

Сценарий, почему вы хотите управлять кнопкой HOME. Я хотел создать собственный экран блокировки, когда пользователь заряжает устройство Android. Поэтому им нужно отсканировать определенный код, чтобы снова войти в систему. Когда приложение отключает эти кнопки (чтобы пользователь не мог выйти из приложения), это позволяет приложению оставаться доминирующим экраном, который видит пользователь.

Попробуйте это в действии

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            break;
        default:
            return super.onOptionsItemSelected(item);
    }
    return false;
}
Другие вопросы по тегам