2013-04-20 89 views
4

我希望我的應用能夠檢測外部存儲器的狀態是否發生更改。起初在我的AndroidManifest中定義了一個BroadcastReceiver。在這裏,我可以設置android:processandroid:exported屬性是這樣的:BroadcastReceiver:以編程方式設置android:進程

<receiver android:name=".StorageStateReceiver" android:process=":storage_state" android:exported="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> 
      <action android:name="android.intent.action.MEDIA_MOUNTED" /> 
      <action android:name="android.intent.action.MEDIA_EJECT" /> 
      <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" /> 
      <data android:scheme="file" /> 
     </intent-filter> 
    </receiver> 

然後我意識到我只在一個單一的活動使用該接收機,所以沒有必要把它實例化時,應用程序啓動,而不是我可以將其定義以編程方式在代碼中。這是我想出了:

BroadcastReceiver StorageStateReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Do what needs to be done 
     } 
    }; 
IntentFilter filter = new IntentFilter(); 
filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
filter.addAction(Intent.ACTION_MEDIA_MOUNTED); 
filter.addAction(Intent.ACTION_MEDIA_EJECT); 
filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL); 
filter.addDataScheme("file"); 
getApplicationContext().registerReceiver(StorageStateReceiver, filter); 

我把這個代碼在onCreate()方法我的活動。

但我找不到從代碼中設置process的方法。我已閱讀有關BroadcastReceiver和Context類的文檔。 BroadcastReceiver似乎沒有託管任何方法讓您定義進程名稱。 registerReceiver()另一方面可以加入兩個額外的參數:String broadcastPermissionHandler scheduler。處理程序聽起來很有希望,但我找不到可以接受字符串形式的進程名稱的Handler構造函數。我覺得我用完了想法。有沒有一種方法來設置過程名稱編程?

回答

1

然後我意識到我只在一個單獨的Activity中使用這個接收器,所以當應用程序啓動時沒有必要讓它實例化,而是我可以在代碼中以編程方式定義它。

清單註冊的BroadcastReceiver不是「在應用程序啓動時實例化」。它僅在發送匹配廣播時實例化。

但我找不到從代碼設置過程的方法。

那是因爲它是不可能的。此外,您不需要它,並且通過浪費RAM,CPU和電池來損害用戶。您不應該在清單條目中擁有android:process屬性,除非您完全和準確地知道爲什麼您需要另一個流程。絕大多數的Android應用程序都沒有。

+0

我想你是對的,現在我想起來了,真的沒有理由使用單獨的過程。出於好奇的後續問題:你可以通過編程設置android:exported嗎?它不適用於這個特定的例子,但我只是想知道。 – 2013-04-21 20:18:49

+1

@AntonCherkashyn:「你能設置android:以編程方式導出嗎?」 - 我不這麼認爲。您可以通過'PackageManager'和'setComponentEnabledSetting()'以編程方式切換'android:enabled',但我不知道切換'android:exported'的方法。 – CommonsWare 2013-04-21 20:21:14