Могу ли я переопределить кнопку "Домой" в своем приложении?
Я хочу создать свой собственный "домашний" экран на моем 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;
}