回答
android.text.method.KeyListener.onKeyDown([view],[text],KEYCODE_HOME,[event])
我不知道其他參數如何適應,甚至是如何實現以上,但信息是所有在keylistner documentation。
但他們也提到在another page家庭鑰匙總是回家,你不能改變這一點。所以如果你打算有某種「你確定要退出」的對話框,那是行不通的。
您無法捕獲HOME事件並以任何方式攔截它。當用戶按主頁鍵時,他們將始終被帶到設備的主屏幕。
如果您需要知道您的活動何時發送到背景,例如用戶按住home鍵或back鍵,我會實現onStop()方法。
你可以寫一個廣播監聽器和過濾器設置爲
<category android:name="android.intent.category.HOME" />
從廣播接收開始烏爾活動/通知活動。
這是不可能的,因爲它不是廣播意圖... – Renetik 2013-12-31 16:47:49
您可以通過Activity.onUserLeaveHint()檢測HOME按鈕。這種方法在兩種情況下被調用;當用戶按下HOME並且開始新的活動時。確保以某種方式區分兩者。
有沒有正式的方式來通知「首頁」按鍵。但是有一個非常簡單的解決方法,讓您的應用程序區分「主頁」按鍵和導致活動停止的任何其他操作。
對於每個需要在「家」的執行某些操作按鍵讓他們從包含該活動擴展類:
/**************************************** On Home **********************************/
private boolean leaveCalled = false;
@Override
public void startActivity(Intent intent) {
leaveCalled= true;
super.startActivity(intent);
}
@Override
public void onBackPressed() {
leaveCalled = true;
super.onBackPressed();
}
@Override
protected void onStop() {
super.onStop();
// Home button pressed
if(!leaveCalled) {
// Do whatever you like.
}
leaveCalled = false;
}
編輯
您還需要延長你的片段來自包含這個的父類。這是因爲片段會以其他方式提供額外的路線,以預期而非「主頁」的方式在應用中的活動之間切換。
@Override
public void startActivity(Intent intent) {
getActivity().startActivity(intent);
}
EDIT 2
我越來越接近想着這是不是對付這種最簡單的方法......你還需要添加onConfigurationChange =「方向」所有的你使用這種方法的活動。然後,你可以補充一點:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
leaveCalled = true;
finish();
startActivity(getIntent());
}
編輯3
Urgh
@Override
public void finish() {
leaveCalled = true;
super.finish();
}
這是可以做到(uptil 2.3 ATLEAST)。測試Android 2.3.5版HTC WildFire-S。代碼片段捕捉/禁用所有的控制鍵:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_SEARCH )
{
Toast.makeText(getApplicationContext(),"You pressed a control button with keyCode : " + keyCode, Toast.LENGTH_SHORT).show();
return false;
}
else
{
Toast.makeText(getApplicationContext(),"You pressed" + keyCode, Toast.LENGTH_SHORT).show();
}
return true;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_SEARCH )
{
return false;
}
else
{
// Do nothing
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//The Code Want to Perform.
}
});
不起作用! – amiekuser 2013-07-02 12:24:35
從Android 4.0或更高版本無法正常工作 – 2013-11-19 07:11:12
很好的答案 - 作品像魅力! :D NOOOOOT :) – 2014-12-04 04:02:59
更新 [2015年8月]:爲每JM Lord的評論,因爲所需的設備和棒棒糖上面這個答案可能無法正常工作。見Alternative to getRunningTasks in Android L
雖然,它的一個老問題,但大部分的答案並沒有爲我在API級別17及以上的工作。我正在回答最後爲我工作的東西。我嘗試了很多方法,但沒有一個像今天一樣工作。我試着
Call method when home button pressed on android答案,
Detect home button press in android和
Overriding the Home button - how do I get rid of the choice?。要點是家庭就像一個緊急逃生按鈕。所以你不能覆蓋它,但可以在某些方面檢測它。
一些我試過(包括上面的答案)和沒有工作是那些的:
在許多方面爲 上述使用
keyCode==KeyEvent.KEYCODE_HOME
。現在,如果你閱讀 KeyEvent.KEYCODE_HOME的文檔,它說This key is handled by the framework and is never delivered to applications
。所以它現在沒有更多 有效。我試過使用
onUserLeaveHint()
。該文件說:調用作爲活動週期的一部分,當活動即將 去到後臺,成爲用戶選擇的結果。例如, 用戶按Home鍵時,onUserLeaveHint()將被呼叫 ,但是當來電打電話時會導致呼叫中的動作 自動進入前臺。
與的問題是,當你從那裏您所呼叫
onUserleaveLint()
, 因爲是我的情況下,在活動範圍內啓動Activity
,該方法也被調用。有關更多信息,請參閱Android onBackPressed/onUserLeaveHint問題。所以它不確定 它只會通過按home鍵來調用。打電話
onStop()
。當活動在現有活動之上並且完全覆蓋活動時,也可以調用它。所以這也不行。
最後以下工作我:
看How to check current running applications in Android?,你可以說,如果你是在長按home鍵顯示近期的任務,然後將其發送到後臺。
所以,在你的你在哪裏試圖檢測按下home鍵的活動onPause()
,您可以檢查應用程序是否已發送到後臺。
@Override
public void onPause() {
if (isApplicationSentToBackground(this)){
// Do what you want to do on detecting Home Key being Pressed
}
super.onPause();
}
函數來檢查你是否是最近被髮送到後臺應用程序:
public boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
感謝@idish用於指出不要忘記,包括以下權限您的清單:
<uses-permission android:name="android.permission.GET_TASKS" />
我不確定這是否有任何缺點,但它對我很好。希望有一天能幫助別人。 P:如果您在已使用FLAG_ACTIVITY_NO_HISTORY
標誌啓動的活動中使用此方法,那麼這將不會有用,因爲它會檢查最近的歷史記錄以確定是否點擊了Home
按鈕。在活動
@Override
protected void onUserLeaveHint()
{
super.onUserLeaveHint();
}
http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()
使用onUserLeaveHint()方法,我發現基於由@Springfeed建議此解決方案。現在的問題是相當通用的,注意,這個特殊的解決方案:
- 上棒棒堂的工作,以及更低的Android版本(基於ActivityManager我的先例代碼失敗的棒棒糖)
- 同時捕捉家庭和歷史記錄按鈕
- 如果活動本身被定義爲家庭活動,則不會捕捉家庭活動 - 總是
- 如果活動是多種家庭活動中的一種,或者根本沒有活動,則會捕捉家庭活動。
此代碼是在我的基地Activity
類(其中的所有活動繼承)
public boolean startingActivity = false;
@Override
protected void onUserLeaveHint()
{
if(startingActivity)
{
// Reset boolean for next time
startingActivity = false;
}
else
{
// User is exiting to another application, do what you want here
Log.i(TAG, "Exiting");
...
}
}
@Override
public void startActivity(Intent intent)
{
startingActivity = true;
super.startActivity(intent);
}
@Override
public void startActivityForResult(Intent intent, int requestCode)
{
startingActivity = true;
super.startActivityForResult(intent, requestCode);
}
正如一些方法也可以使用應用程序上下文推出的意圖,我定義我的應用程序類召開ContextWrapper切換布爾以及(注意,我要通過基類的靜態訪問我自己的應用程序的最上面的活動)。
public class MyContext extends ContextWrapper
{
public MyContext(Context base)
{
super(base);
}
@Override
public void startActivity(Intent intent)
{
BaseActivity activity = BaseActivity.getActivity();
if(activity != null)
{
activity.startingActivity = true;
}
super.startActivity(intent);
}
}
如果有必要,可能還想覆蓋startActivities(...)。
希望這有助於:)
我找到最好的答案:) – Neo 2015-04-02 04:46:31
但是,當我們移動到另一個活動時,此方法會回撥。如何區分爲HOME按鈕按下。謝謝 – sandeepmaaram 2016-01-21 07:09:19
public boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
public void onPause() {
super.onPause();
if(isApplicationSentToBackground(this))
{
Log.i("Home", "Home Pressed..!");
}
}
- 1. 如何檢測用戶在鍵盤上的活動
- 2. 當用戶按下Home鍵
- 3. 重寫Home鍵長按類別.HOME活動
- 4. 如何控制活動流程 - 後退按鈕與Home鍵
- 5. 檢測用戶活動
- 6. 如何檢測用戶在Chrome中的不活動?
- 7. 如何檢測用戶在Qt中的不活動?
- 8. 如何在我的應用程序中檢測用戶不活動(windows mobile,c#)
- 9. Android:檢測用戶不活動/檢測(軟鍵盤)鍵盤輸入
- 10. 如何在活動progrmmatically安卓禁用home鍵
- 11. 如何在Excel工作簿中檢測用戶不活動
- 12. 無論如何檢測用戶在Java中不活動?
- 13. 如何檢測在ios9中兩次點擊home按鈕
- 14. C++檢測用戶按下的ENTER鍵
- 15. 在Android上按住home鍵時,活動失去焦點
- 16. 如何檢測JComboBox中的TAB按鍵?
- 17. 如何檢測Safari中的「tab」按鍵
- 18. 如何檢測Python中的ESCape按鍵?
- 19. 如何在我的場景中讓Java檢測按鍵?
- 20. 在我的網站上檢測用戶不活動
- 21. 在Android中,如何檢測我的活動恢復原因?
- 22. 檢測用戶活動windows phone 8
- 23. 當HOME鍵被按下時,終止所有活動android
- 24. 檢測按鍵
- 25. 在Python中使用win32api檢測按鍵
- 26. 如何檢測用戶何時在輸入字段中按Enter鍵
- 27. 如何檢測iPad用戶點擊鍵盤隱藏按鈕?
- 28. 防止HOME按鈕關閉活動
- 29. 活動結束於HOME按鈕
- 30. 如何檢測鍵盤在iOS 8中按下「PAGE UP」鍵?
不,那是不正確的。即使你的意思是在onPause(),這個答案難道不正確的 - 記住的onStop不能保證被調用,在所有。這些小小的「Android特定」讓我心生疑慮。 : -/ – 2014-12-04 04:00:43