在Android程序中,BroadcastReceiver作爲對系統敏感程度的一種感知。我們所謂的開機自啓,聯網後臺自啓,短信電話過濾等,就是通過BroadcastReceiver來對相應事件進行感知。但是我們可能會有這樣的需求:BroadcastReceiver希望只是做一些初始的事情,調用一次之後不希望其再次被敏感事件喚醒。於是,我們就要對自身程序的組件進行啓用以及禁用。這樣的需求分兩步走:
第一步,我們需要根據intent-filter篩選出我們需要禁止或啓用的組件。
第二步,我們需要根據對該組件進行禁止或者啓用。
直接上代碼,應用程序自身不需要特別權限即可完成。對於進制或啓用其他程序的組件在4.0以前需要root權限,4.0之後據說可以不用,具體沒有深究,有興趣的可以通過逆向360查看。(目前我也只能對靜態註冊的廣播接收器進行此功能)
public class StaticBroadcastPolicy extends BroadcastReceiver{
private static final String TAG = "StaticBroadcastPolicy";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"-->onReceve");
//獲取廣播Intent過濾規則
String filterBroadcast = intent.getStringExtra("FilterBroadcast");
boolean enableFlag = intent.getBooleanExtra("Enable",false);
PackageManager pm = context.getPackageManager();
Intent it = new Intent(filterBroadcast);
//查詢對應Intent的廣播接收器
List<ResolveInfo> resolveInfoList = pm.queryBroadcastReceivers(it, PackageManager.GET_DISABLED_COMPONENTS);
for(int j = 0 ; j < resolveInfoList.size() ; j++){
ResolveInfo resolveInfo = resolveInfoList.get(j);
if(resolveInfo.activityInfo.packageName.equals(context.getPackageName())){
ComponentName mComponentName = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
if(enableFlag == true){
pm.setComponentEnabledSetting(mComponentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
}else{
pm.setComponentEnabledSetting(mComponentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
}
Log.d(TAG, "COMPONENT_ENABLED_STATE:" + pm.getComponentEnabledSetting(mComponentName) +
",componentName:" + resolveInfo.activityInfo.name+",packageName:"+resolveInfo.activityInfo.packageName);
break;
}
}
}
}