2010-02-17 39 views
23

也許很容易,但我真的不能算出這個正確的那麼遠,我得到了BroadcastReceiver等待獲得由AlarmMangager觸發 - 這工作得很好。從廣播接收器告知活動,只有當它是在前臺

現在:因爲事件如果發生需要刷新主Activity屏幕上的某些元素,我想從該背景下的BroadcastReceiver發送一個Intent到我的活動 - ,但只有,如果它目前在前景,又名活躍。

如果它不運行或不可見的,我不在乎 - 我想做的最後一件事是我的意圖開始活動!我在我的onResume()方法中處理重繪視圖,所以我根本不在乎。

任何提示如何做到這一點? 謝謝!

編輯:我的BroadcastReceiver正在等待警報,必須通知用戶。所以,它必須存在並在清單中聲明。問題是:它將不得不決定所提到的活動是否在前面。

回答

37

所以這幾乎是BINO的答案,但:代替莫將接收器變成活動,使用兩個接收器,具有不同的意圖。第一個是您的原始警報Intent,您已經擁有一個在清單中註冊的接收器,然後該接收器發送第二個廣播意圖,由Bino所說的由該活動註冊的接收者處理。

我在我自己的計時器的項目做到了這一點,在GitHub上。這裏是alarm receiverrequery receiver。希望有所幫助。

+0

感謝您的簡單解決方案,我還沒有想到:) –

+0

完美 - 我正在尋找! +1給你。 – barry

+0

正是我在找的東西。 – wendelbsilva

42

我相信你熟悉AlarmManager現在(創建一個新的警報,註冊一個接收器...),所以我不會談論這一點。只要給你一個解決你的問題。

而是在一個類文件,並在清單中註冊廣播接收器,你只能在你的活動創建一個新的廣播接收器,然後在的onResume方法註冊,並在onPause方法註銷它,某事像這樣在你的活動:

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //do something  
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction("your alarm action"); 
    ... 
} 

@Override 
protected void onResume() { 
registerReceiver(mIntentReceiver, mIntentFilter); 
    ... 
super.onResume(); 
} 

@Override 
protected void onPause() { 
unregisterReceiver(mIntentReceiver); 
    ... 
super.onPause(); 
} 

當你的活動是在前臺:)的接收器只會接收報警意圖

(很抱歉,如果我的英語不太清楚)

+2

嗨,比諾!感謝您的回覆 - 我明白了,我必須更新我的問題,因爲您的回答會強加一個新問題... 我需要BroadcastReceiver **總是**在那裏,而不僅僅是在活動正在運行並且在前臺!這是一個警報 - 正是它會通知用戶他想要捕捉的公共汽車。現在:無論活動在做什麼,都必須通知警報。但是:當且僅當它處於活動狀態並且在前景中,我需要更新一個複選框,指示這個特定的警報不再被設置! :-( – Zordid