2012-09-03 41 views
0

我有一個BroadcastReceiver它處理系統廣播,如AC連接和斷開連接。 BroadcastReceiver收到POWER_CONNECTED並啓動活動「MainActivity」,該活動解鎖KeyGuard並獲取WakeLock。在onCreateonResume我動態註冊BroadcastReceiver來收聽POWER_DISCONNECTED完成兩個活動接收相同的廣播

「MainActivity」啓動第二個「VideoPlayer活動」,該活動還會在POWER_DISCONNECTED上註冊BroadcastReceiver

當我通過adb發送ACTION_POWER_DISCONNECT時,我通過LogCat看到「MainActivity」首先停止。爲什麼?

如何處理「VideoPlayerActivity」首先完成?

感謝

回答

1

看吧(http://developer.android.com/reference/android/content/BroadcastReceiver.html):「正常播放(帶Context.sendBroadcast發送)是完全異步所有的接收器。的廣播按照未定義的順序運行,這通常是同時發生的,這樣更有效,但意味着接收者不能使用此處包含的結果或中止API。

您不能保證VideoPlayerActivity會收到。

我會建議創建一個單獨的BroadcastReceiver(這不是活動的一部分)。並且在這個廣播接收機中做這樣的事情:

videoPlayerActivity.finish();

mainActivity.finish();

當然,你需要在你的活動的onCreate或onResume中初始化這兩個變量。

+0

兩個活動他們自己的Receiver被實現爲內部類。也許可以通過自定義廣播來停止第二次啓動的活動,因此它與POWER_CONNECTED意圖無關。我會在第一次使用這個廣播,但是發送一個自定義的廣播,在第二次活動中第二個接收器將使用它。所以我可以告訴他完成。發送自定義廣播後,我會完成onReceive方法中的主要活動。我會試試這個。 – AdemC

+0

我認爲你所描述的應該起作用。但是,我不喜歡將BroadcastReceiver和Activities結合在一個實體中。主要原因是單一責任原則(http://en.wikipedia.org/wiki/Single_responsibility_principle)。 –

+0

我同意你的意見。但是我怎麼能解決這個問題,當時我不知道這兩個活動的實例。 Brodcast接受者在他們自己的班級中獨立於活動。 – AdemC

0

實際上,您在主要活動中註冊了廣播接收器,因此它在BroadcastReceiver中傳遞主要活動的上下文,因此我只能完成該活動。

所以,讓我們搞砸了這一點,你需要做的只是寫的代碼在的onReceive)這些行(斷開電源動作接收者的什麼:

public void onReceive(Context context, Intent intent) { 
Intent startMain = new Intent(Intent.ACTION_MAIN); 
      startMain.addCategory(Intent.CATEGORY_HOME); 
      startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(startMain); 
} 

享受