Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我可以覆盖';主页';我的应用程序中的按钮?_Android - Fatal编程技术网

Android 我可以覆盖';主页';我的应用程序中的按钮?

Android 我可以覆盖';主页';我的应用程序中的按钮?,android,Android,我想在android上创建我自己的“主”屏幕,我想从我的应用程序调用该主屏幕 我如何覆盖“主页”按钮,以便当按下该按钮时,应用程序将重定向到我的主页屏幕而不是默认的主页屏幕?是否可以覆盖home(主页)按钮?home(主页)按钮应该做一件事,而且只能做一件事,并且是一致的。让用户返回主屏幕。即使您可以覆盖它的行为,这也是一件非常不利于用户的事情。所以不要这样做,用不同的方式解决你的问题 自Android 4.0以来,这个答案将不再有效 正确的解决方案是创建 您可以将“主页”按钮替代为任何其他按

我想在android上创建我自己的“主”屏幕,我想从我的应用程序调用该主屏幕


我如何覆盖“主页”按钮,以便当按下该按钮时,应用程序将重定向到我的主页屏幕而不是默认的主页屏幕?是否可以覆盖home(主页)按钮?

home(主页)按钮应该做一件事,而且只能做一件事,并且是一致的。让用户返回主屏幕。即使您可以覆盖它的行为,这也是一件非常不利于用户的事情。所以不要这样做,用不同的方式解决你的问题

自Android 4.0以来,这个答案将不再有效

正确的解决方案是创建


您可以将“主页”按钮替代为任何其他按钮:

@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();  
}
使用此方法,“主页”按钮将在此活动(仅此活动)中停止工作。然后,您只需重新实现,因为这是一个正常的按钮事件(例如back按钮)


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>
您没有获得关键事件

请在“活动”中尝试此操作

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

不,我们无法覆盖“主页”按钮,但我为此提供了一个解决方案….:

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();
}
public boolean isApplicationSentToBackground(最终上下文){
ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
列表任务=am.getRunningTasks(1);
如果(!tasks.isEmpty()){
ComponentName topActivity=tasks.get(0).topActivity;
如果(!topActivity.getPackageName().equals(context.getPackageName())){
返回true;
}
}
返回false;
}
@凌驾
公共void onStop(){
如果(是应用程序入口背景(本)){
//把你的代码放在这里你想做什么
}
super.onStop();
}
更改清单文件-

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

如果有人需要检测和验证主页按钮行为,请使用KOTLIN中的thois appproach

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()
                        }
                    }
                }
            }
        }
    }
}
main活动

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
}
class MainActivity:SimpleActivity(),RefreshRecycleServiceWListener{
private var launchers=ArrayList()
私有变量mStoredPrimaryColor=0
私有变量mStoredTextColor=0
私有变量mStoredUseEnglish=false
专用var接收器:BroadcastReceiver?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
HomeButtonWatcher()
}
有趣的HomeButtonWatcher()
{
val mHomeWatcher=家庭观察者(applicationContext)
mHomeWatcher.setOnHomePressedListener(对象:OnHomePressedListener{
在HomePressed()上覆盖{
//在这里做点什么。。。
Toast.makeText(applicationContext,“onHomePressed”,Toast.LENGTH\u LONG.show())
}
覆盖HomeLongPressed()上的乐趣{
//在这里做点什么。。。
Toast.makeText(applicationContext,“onHomeLongPressed”,Toast.LENGTH\u LONG.show())
}
})
mHomeWatcher.startWatch()
}
//其他代码
}


实际上,当我自己的主屏幕出现时,我想锁定该屏幕。这就是为什么我想在我自己的主屏幕上控制主屏幕按钮。在我看来,这毫无意义。我不知道Smith想做什么,但覆盖主屏幕按钮几乎是启动程序的标准,例如,显示应用程序列表,所以我认为在它自己的家里做这件事没有什么坏处screen@Aleadam:是的,我想有些用例是可以的。总的来说,我不喜欢我的主页按钮做任何意想不到的事情。我认为这也取决于Android的版本。对于我的HTC Desire HD和Android 2.2,我不希望任何东西覆盖我的主页按钮。当我点击home按钮上方的向上箭头时,会显示应用程序列表。此外,还有一些为Android编程的非市场应用程序需要此功能,以限制设备的使用(例如,公司购买100部手机进行实地调查).非常感谢,因为我们在这个话题上讨论了很多..这个问题是在主屏幕启动器问题的同时提出的..你给了我解决方案..再次感谢..这在任何版本的Android上都不起作用,AFAIK,当然不是在最近的任何东西中。@commonware我最初认为你是对的,因为我在输入
活动时立即返回true。onKeyDown()
:除了home按钮外,所有按钮都被禁用了!但是后来我尝试了下面@ucasneo的
onAttachedToWindow()
技巧,主页按钮也被禁用了!幸运的是,长时间按“后退”按钮使我不必重新启动手机…@commonware再次调用,
onAttachedToWindow()
在每次活动启动时只调用一次,因此如果禁用了
home
按钮(必须在活动刚启动时),则无法在该活动的生命周期内重新启用它。因此,即使这种方法是有效的,它也有很大的局限性。不适用于棒棒糖。请编辑最新解决方案的答案@Aleadam@ateiob:幸运的是,从Android 4.0开始,这个安全漏洞已经修复。@Commonware感谢您提供此信息。这真的是一个安全漏洞吗?或者仅仅是一个“用户挫败漏洞”?@ateiob:如果恶意软件阻止您删除恶意软件,这是一个安全漏洞。@Commonware您可以提供一个链接到changelog,列出“HOME button override”bug fix吗?@lucasneo没有名为TYPE_KEYGUARD的选项如何执行此操作,而此代码可能会回答问题,提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读这篇文章,以获得高质量的答案。请查看哪些地址制作了一个能够捕捉“主页”按钮的主页启动器。这是最近的正确答案,自Android 4.0以来就一直如此
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
}