2010-02-05 82 views

回答

0
android.text.method.KeyListener.onKeyDown([view],[text],KEYCODE_HOME,[event]) 

我不知道其他參數如何適應,甚至是如何實現以上,但信息是所有在keylistner documentation

但他們也提到在another page家庭鑰匙總是回家,你不能改變這一點。所以如果你打算有某種「你確定要退出」的對話框,那是行不通的。

8

您無法捕獲HOME事件並以任何方式攔截它。當用戶按主頁鍵時,他們將始終被帶到設備的主屏幕。

如果您需要知道您的活動何時發送到背景,例如用戶按住home鍵或back鍵,我會實現onStop()方法。

+2

不,那是不正確的。即使你的意思是在onPause(),這個答案難道不正確的 - 記住的onStop不能保證被調用,在所有。這些小小的「Android特定」讓我心生疑慮。 : -/ – 2014-12-04 04:00:43

3

你可以寫一個廣播監聽器和過濾器設置爲

<category android:name="android.intent.category.HOME" /> 

從廣播接收開始烏爾活動/通知活動。

+0

這是不可能的,因爲它不是廣播意圖... – Renetik 2013-12-31 16:47:49

12

您可以通過Activity.onUserLeaveHint()檢測HOME按鈕。這種方法在兩種情況下被調用;當用戶按下HOME並且開始新的活動時。確保以某種方式區分兩者。

+0

當用戶按Home鍵時,如果當前活動是當前默認啓動器,則不會調用它。 – arts777 2012-08-03 00:09:27

+1

當活動啓動其他活動時也會調用它。 – Blackhex 2013-03-28 17:27:22

+0

我同意@Blackhex。 HTTP://計算器。com/questions/6612058/android-onbackpressed-onuserleavehint/8749061#8749061問題也是這樣說的。所以,它現在不適用於所有情況。 – 2013-09-13 23:14:52

8

有沒有正式的方式來通知「首頁」按鍵。但是有一個非常簡單的解決方法,讓您的應用程序區分「主頁」按鍵和導致活動停止的任何其他操作。

對於每個需要在「家」的執行某些操作按鍵讓他們從包含該活動擴展類:

/**************************************** 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(); 
} 
+0

這些都不行。活動的'onStop()'是'leaveCalled = false'的情況太多了,就像電話,活動從服務中啓動等一樣。 – Yeung 2014-08-05 03:41:36

+0

同意 - 但這與其他「解決方法」面臨的問題相同趕上主頁按鈕。這不是包含在API中的東西。 – Graeme 2014-08-06 08:19:29

5

這是可以做到(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; 
} 
-7
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) {  

    if(keyCode == KeyEvent.KEYCODE_HOME) 
    { 

     //The Code Want to Perform. 

    } 
}); 
+0

不起作用! – amiekuser 2013-07-02 12:24:35

+0

從Android 4.0或更高版本無法正常工作 – 2013-11-19 07:11:12

+1

很好的答案 - 作品像魅力! :D NOOOOOT :) – 2014-12-04 04:02:59

38

更新 [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?。要點是家庭就像一個緊急逃生按鈕。所以你不能覆蓋它,但可以在某些方面檢測它。

一些我試過(包括上面的答案)和沒有工作是那些的:

  1. 在許多方面爲 上述使用keyCode==KeyEvent.KEYCODE_HOME。現在,如果你閱讀 KeyEvent.KEYCODE_HOME的文檔,它說This key is handled by the framework and is never delivered to applications。所以它現在沒有更多 有效。

  2. 我試過使用onUserLeaveHint()。該文件說:

    調用作爲活動週期的一部分,當活動即將 去到後臺,成爲用戶選擇的結果。例如, 用戶按Home鍵時,onUserLeaveHint()將被呼叫 ,但是當來電打電話時會導致呼叫中的動作 自動進入前臺。

    與的問題是,當你從那裏您所呼叫onUserleaveLint(), 因爲是我的情況下,在活動範圍內啓動Activity ,該方法也被調用。有關更多信息,請參閱Android onBackPressed/onUserLeaveHint問題。所以它不確定 它只會通過按home鍵來調用。

  3. 打電話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()

+0

今天幫了我:)這是一個很好的解決方案。非常感謝你。注意:不要忘記在清單中包含以下權限: idish 2013-08-09 22:37:39

+1

很高興幫助。感謝您指出了這一點。我編輯了答案。 – 2013-08-09 22:43:09

+0

完美!謝謝Shobhit! – Rendy 2013-09-16 01:56:24

6

使用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(...)。

希望這有助於:)

+0

我找到最好的答案:) – Neo 2015-04-02 04:46:31

+1

但是,當我們移動到另一個活動時,此方法會回撥。如何區分爲HOME按鈕按下。謝謝 – sandeepmaaram 2016-01-21 07:09:19

0
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..!"); 
    } 
} 
2