2012-09-17 33 views
4

我想每次Intent.ACTION_BATTERY_CHANGED都會調用Broadcastreceiver,以便我可以跟蹤一些數據。如何獲得可靠的BroadcastReceiver

我現在擁有的一切:

public class ReceiverApplication extends Application { 

    @Override 
    public void onCreate() { 
     // Register Receiver 
    } 
    public static BroadcastReceiver myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Start Service to progress data 
     }  
    }; 
} 

,直到我用最近的應用程序「任務管理器」刷卡離開我的優先選擇屏幕或我的主要活動之一這工作得很好。然後BroadcastReceiver不再被調用。如果我開始執行其中一項活動,ReceiverApplication的onCreate()會被調用並重新開始工作。

我可以通過運行一個空服務來解決這個問題。該服務似乎並沒有通過刷掉活動而被殺死,並且onCreate()在一段時間後被調用,並且在沒有做任何事情的情況下重新啓動BroadcastReceiver。這裏的問題是我不想讓服務一直運行。

那麼,只要用戶想要,我怎樣才能在任何可以接收廣播的Acitivity或Service之外獲得Broadcastreceiver?

+0

看到這個有用的答案在SO:http://stackoverflow.com/questions/7257378/android-how-to-force-restart-service-os-killing-on-low-memory-behavior以及這一個:http://stackoverflow.com/a/7877466/490961 –

+0

@MarvinLabs謝謝,你到底是什麼意思?因爲如果可能的話,我不想使用服務。 – user1566228

回答

0

代替嵌套的廣播接收器,並動態地對其進行註冊的,聲明一個在你的Android清單根據該文件,BATTERY_CHANGED無法在清單中聲明:

您無法通過聲明組件收到此在清單中,只能通過Context.registerReceiver()明確註冊。請參閱ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED,瞭解與電池相關的廣播,這些廣播可以通過清單接收器發送併發送。

我會註冊一個廣播接收器收到所有這些事件:

<receiver 
     android:name="MyBroadcastReceiver"> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.BATTERY_LOW" /> 
      <category 
       android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.BATTERY_OKAY" /> 
      <category 
       android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
      <category 
       android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
      <category 
       android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

廣播接收器將不管您的應用程序是否正在運行的或不通知。

+2

可悲的是我不認爲BATTERY_CHANGED可以通過清單 – user1566228

+0

@ user1566228註冊您說得對。文檔說,你可以聽個別電池事件,但是。這對你有用嗎?看到我更新的答案。 – Samuel

+0

謝謝,但沒有抱歉,我特別需要在batterylevel改變時獲得廣播,所以我想這不會起作用。 – user1566228

0

除了已經做出的回答之外,當您使用任務管理器「將其滑走」時,您的應用停止正常工作是正常的。 taskmanager會阻止它,因爲用戶要求它。

如果你不想停止你的活動的生命週期,只是不要這樣做......你的應用程序將調用onPause()方法,如果需要的話可以調用其他方法,並且你的broacast仍然可用即使用戶沒有真正使用你的應用程序。任務管理器將殺死應用程序和所有「相關」線程。

如果您想了解活動的生命週期中的一些細節,請大家看看官方文檔:http://developer.android.com/reference/android/app/Activity.html

2

我每天Intent.ACTION_BATTERY_CHANGED被broacasted時間想一個BroadcastReceiver被調用,所以我可以跟蹤一些數據。

該廣播可以發送很多。因此,Android只允許正在運行的應用程序接收這個廣播,所以它不必爲了告訴一堆應用程序而分叉一堆進程「電池電平發生了變化」。

這工作正常,直到我使用最近的應用程序「Taskmanager」來刷掉我的首選項屏幕或我的主要活動之一。然後BroadcastReceiver不再被調用。

該行爲終止您的過程。

因此,只要用戶需要,我如何才能在任何可以接收廣播的Acitivity或Service之外獲得Broadcastreceiver?

通常情況下,您將在清單中註冊廣播。對於ACTION_BATTERY_CHANGED,這是不可能的。

記住,你可以調查ACTION_BATTERY_CHANGED - 而不是調用registerReceiver()與實際BroadcastReceiver,傳遞nullregisterReceiver()的返回值將爲末尾ACTION_BATTERY_CHANGEDIntent。因此,如果您每隔幾分鐘就能找到一次電池電量,請使用AlarmManager每隔幾分鐘喚醒一次,並檢查當前的電池電量。

相關問題