2011-11-22 31 views
0

我有廣播接收器的應用程序,監聽到SD卡裝載/卸載,如:如何避免/取消由於BroadcastReceiver引起的應用程序自運行?

public class ExternalDatabaseRemovingBroadcastReceiver extends BroadcastReceiver 
{ 
    private static final String TAG= ExternalDatabaseRemovingBroadcastReceiver.class.getName(); 

    public ExternalDatabaseRemovingBroadcastReceiver() 
    { 
     super(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(Me.DEBUG) 
      Log.d(TAG, "SD card mount/unmount broadcast=" + intent.getAction()); 
     if(intent.getAction()==null) 
      return; 
     if(Intent.ACTION_MEDIA_UNMOUNTED.equalsIgnoreCase(intent.getAction()) || 
       Intent.ACTION_MEDIA_EJECT.equalsIgnoreCase(intent.getAction()) || 
       Intent.ACTION_MEDIA_SHARED.equalsIgnoreCase(intent.getAction())) 
     { 
       //blah-blah 
     } 
    } 
} 

廣播在AndroidManifest聲明:

<receiver android:enabled="true" 
      android:exported="true" 
      android:name=".ExternalDatabaseRemovingBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_MOUNTED"/> 
     <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> 
     <action android:name="android.intent.action.MEDIA_SHARED"/> 
     <data android:scheme="file"/> 
    </intent-filter> 
</receiver> 

現在我的問題。在設備啓動期間(無論是真實還是模擬器) - 我的應用程序無意中運行。我的意思是ActivityManager自己運行它報告:

11-22 08:56:52.239: INFO/ActivityManager(61): Start proc ru.ivanovpv.cellbox.android for broadcast ru.ivanovpv.cellbox.android/.ExternalDatabaseRemovingBroadcastReceiver: pid=288 uid=10034 gids={1015} 

請解釋什麼是布萊恩?以及如何避免應用程序自行運行?

+0

@ Dr.nik ContentObserver與此無關 - 這是另一回事! – barmaley

回答

0

在我看來,在啓動設備後,SD卡也會掛載,這會觸發您的意圖過濾器。如果您不希望此「初始」裝載由您的應用程序註冊,那麼您可以忽略在uptime的前x秒內發生的裝載。這可能不是最完美的解決方案,但...


編輯:現在我明白barmaley的原意,解決的辦法是要簡單得多。 Android清單中的Intent-filters意味着在發生外部事件時啓動應用程序。如果您只想在應用程序已經運行的情況下對卸載進行反應,只需在Application.create中以編程方式註冊您的broadcastreceiver,並分別使用Context.registerReceiverContext.unregisterReceiver取消註冊Application.destroy

+0

LogCat報告應用程序在觸發廣播之前運行! – barmaley

+0

你的意思是你的'Application'對象在你的'ExternalDatabaseRemovingBroadcastReceiver'對象之前被實例化了嗎?這個是正常的。無論使用哪個入口點,都會首先創建「應用程序」。 – mhelvens

+0

也許你是對的,但我會尋找更優雅的解決方案。當BroadcastReceiver觸發應用程序運行時,我並不高興,但這並不是很好。 – barmaley

1

它聽起來像系統響應啓動時安裝的SD卡。您可以通過刪除android:exported="true"或將其更改爲false來啓動此BroadcastReceiver白名單訪問權限,並啓用<permission>。我不知道你的最終目標是什麼,所以這可能不是最佳的行動方針。

+0

我不能把'android:exported = false',因爲我需要攔截媒體掛載/卸載事件 - 這是外部 – barmaley

相關問題