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