畢設小結(三)Android自身組件禁用

在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;
			}		
		}		
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章