2010-11-04 73 views
2

我想趕上當用戶已經按下主頁按鈕。我以爲我可以使用Android - 如何捕捉主頁按鈕被按下?

protected void onResume() 
{ 
    registerReceiver(homeReceiver, new IntentFilter(Intent.CATEGORY_HOME)); 
} 
... 
private BroadcastReceiver homeReceiver = new BroadcastReceiver() 
     { 
      public void onReceive(Context context, Intent intent) 
      { 
      // logic here 
      } 
     }; 

但這似乎並不奏效。我知道onPause會被調用,但是我的特定應用程序有一些我需要單獨處理的邏輯。短故事基於一些信息進入,應用程序將向用戶顯示新活動。爲了防止後退按鈕問題,當每個活動命中它的onStop它調用完成本身。但是,如果用戶按下主頁按鈕,我不希望活動調用完成,以便當用戶在主屏幕上按下應用程序圖標或通過最近運行的應用程序列表時,最後一個活動被取消。

我懷疑我做了這個複雜得多計劃。任何建議表示讚賞。

+0

對不起你是什麼試圖在這裏完成?默認情況下,你有你似乎想要的行爲。無需劫持後面或家庭按鈕。 – schwiz 2010-11-04 21:24:55

+0

更長的故事是活動A啓動B,這取決於傳入的數據將顯示C,D或F. C,D或F的顯示可以在新數據進入時更改。我想要「後退」按鈕成爲退出按鈕。如果C,D和F在onStop中沒有完成調用,那麼按下Back可以循環返回前一個顯示。由於我目前無法分辨何時按下主頁按鈕,因此當前顯示的活動會觸及其onStop並調用完成。但是,當用戶按下圖標返回應用時,Android不會回到我們離開的位置。 – bursk 2010-11-04 21:54:27

+0

你嘗試過使用startActivityForResult嗎? – schwiz 2010-11-04 22:32:57

回答

0

長話短說是我放棄了嘗試趕上主頁按鈕被按下。我假設它是完成(),每個活動在onStop上調用本身,這是問題。由於我仍然需要在每個Activity上調用finish()以避免後退按鈕問題,所以我更新了B,首先使用startActivityForResult啓動新Activity,然後立即在前一個Activity上調用finishActivity。這似乎解決了整體問題。現在,當我按主頁按鈕並最小化應用程序時,當我從主屏幕或主頁的最近運行的應用程序列表中選擇應用程序的圖標時,我將正確的活動帶到前臺。

現在我只需要弄清楚爲什麼 - 有時 - 按Home按鈕導致我的服務停止。但是,如果我無法弄清楚這將是一個新問題。感謝大家提出你的想法。

+0

Just和FYI,我發現我的服務停止的原因是因爲我使用bindService來啓動它們而不是startService。 – bursk 2010-11-08 17:39:28

+1

我仍然認爲,如果您只需點擊主頁按鈕,很多情況會更輕鬆。 – bursk 2010-11-08 17:39:49

1

主頁按鈕不能被覆寫。您只能捕捉意圖並顯示一個不同的家,但用戶將始終可以選擇。

不要亂用多麼艱難按鈕的工作這麼多,用戶喜歡一致的行爲。

+3

我不是想覆蓋主頁按鈕的行爲,我只是想知道它已被按下,所以我可以知道不會打電話onFinish – bursk 2010-11-05 02:03:57

0

按鈕的行爲,我只是想知道 其已被按下,所以我可以知道 不叫onFinishnot叫onFinish - cbursk

您可以在此改變onPause()吧? onFinish()如果home鍵按下不叫... onFinish()當按下後退按鈕叫...和後退按鈕可以onKeyDown()被重寫,這樣

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     // action goes here 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+0

我已執行該代碼以捕獲後臺並在該Activity上調用完成。訣竅是我得到了這些活動C,D和F.他們可能會被用戶導航。因此,讓我們說第一個B顯示C,然後用戶轉到F,然後是D,F,C,D,C。然後,當用戶按下後退按鈕時,我抓住它並調用完成,在上面的示例C中消失, D顯示,回擊,C等等。 – bursk 2010-11-05 09:41:02

+0

因此,我基本上已經開始挖這個洞,以避免後退按鈕地獄 – bursk 2010-11-05 10:04:01

+0

如果你繼續打開一個「活動」,它將像卡片一樣堆疊。所以當你點擊頂部活動的'back'按鈕時,它會返回1步到最後一個打開的活動....就像你的情況一樣,當你在C中時,點擊按鈕,它會顯示D.回來, C顯示...如果你不想像這樣堆棧,只需在啓動一個活動時加上'finish()'。 – 2010-11-08 07:44:21

2

我不是英語(俄羅斯)好。 是的,你不能趕上主頁按鈕點擊。我發現的唯一方法是讀取log(logcat)並解析結果。當HOME活動正在運行時 - 下一條記錄出現在logcat中:

開始活動:意圖{act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android .launcher/.Launcher}

U可以通過正則表達式解析此條目。所以,這是我發現點擊主頁的最佳方式

+0

任何人都可以爲此添加一些代碼嗎? – 2013-03-13 13:25:18

+0

這是一致的嗎?我的意思是不同的OEM可能會改變日誌的顯示方式。 – 2015-02-16 11:51:41

3

您可以監控活動的生命週期。當按下下面的方法序列的主頁按鈕被稱爲:

onPause() 
onStop() 
onRestart() 
onStart() 
onResume() 

當你開始一個新的actvity:

onPause() 
onStart() 
onResume() 
onStop() 

當您從一些活動回來已經開始:

onPause() 
onRestart() 
onStart() 
onResume() 
onStop() 
0

最簡單的方法是在退出該活動以進入其他活動時將布爾變量置於false。 然後在onResume方法中將變量置於true。 檢查onStop()方法是否爲false,如果爲true,則按下Home按鈕。

喜歡的東西:

boolean exit=false; 

...

//wherever other activity starting 
exit=false; 
startActivity(activity); 

...

@Override 
protected void onResume() { 
    super.onResume(); 
    exit=true; 
} 

...

@Override 
protected void onStop() { 
    super.onStop(); 
    if(exit){ 
     //Home button is pressed 
    } 
}