2011-10-25 33 views
16

我有一個在活動中以編程方式註冊的廣播接收器。它對PACKAGE_REMOVED意圖做出響應,當包被移除時,該意圖就會觸發。廣播接收器和暫停的活動

問題是,它沒有得到這個消息。我認爲這是由於當我離開活動並轉到其他活動以卸載應用程序時,意圖被激發,因此原始活動已暫停。 是不是暫停的活動(在中未註冊接收者)也會暫停接收方?

回答

36

當您在活動中以編程方式註冊廣播接收機時,活動暫停時不會獲得廣播。 BroadcastReceiver docs並不像他們在這一點上那麼清楚。他們建議僅在onPause上註銷以減少系統開銷。

如果即使您的活動不在前臺,也希望接收事件,請使用receiver元素將接收器註冊到清單中。

+1

這個註冊的接收者如果註冊在當前已暫停的活動內的清單中,是否能夠訪問其封閉活動的私有變量? – Peterdk

+0

不要緊,我現在看到Receiver類不是一個接口,而是一個你需要繼承的類。 – Peterdk

+0

@chris,我沒有看到這個文檔在android文檔中。 –

2

也許你可以註冊服務接收器將運行後臺

5

添加Receiver到你的項目,你會得到這個事件,甚至沒有開始你的應用程序。

public class TestReciver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TestReciver",intent.getAction()+"\n" 
       +intent.getDataString()+"\n" 
       +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n" 
       +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n" 
       +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 
      ); 
    } 

} 

,並在你的清單中添加像這樣(裏面你<應用>標籤):

<receiver android:name="TestReciver" > 
    <intent-filter > 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

當你使用一個接收器這樣你不調用任何註冊或註銷所以它永遠會準備好獲取數據。

需要注意的是,如果您讓用戶將您的應用程序移動到SD卡上,則此功能無效。如果SD卡卸載時發送事件,接收器將無法訪問,您將錯過該事件。