I try to register and unregister broadcastreceiver in non-activity class.
public class AppDetectionEnabler implements OnCheckedChangeListener {
protected final Context mContext;
private Switch mSwitch;
private String config;
PackageManager pm;
ComponentName receiver;
private IntentFilter intentFilter;
public AppDetectionEnabler(Context context, Switch swtch, String config) {
mContext = context;
this.config = config;
receiver = new ComponentName(mContext, AppDetectionService.class);
pm = mContext.getPackageManager();
intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.PACKAGE_ADDED");
intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
setSwitch(swtch);
}
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
SharedPreferences prefs;
Editor editor;
prefs = mContext.getSharedPreferences("prefs_app", Context.MODE_PRIVATE);
editor = prefs.edit();
if(config == "AppDetection"){
if(!isChecked){
mContext.unregisterReceiver(AppDetectionService.class);
}
else if(isChecked){
mContext.registerReceiver(AppDetectionService.class, intentFilter);
}
}
editor.putBoolean("APP_ENABLED", isChecked);
editor.commit();
}
}
I did it like above in onCheckedChanged method. But it is not working. I create intenfilter in above class so, there is no receiver part in manifest.xml..
when i look for error it says 'rename'.. Is there anything like 'Broadcastreceiver doesn't work in non-acticity class' or smtg like that?
AppDetectionService.java
public class AppDetectionService extends BroadcastReceiver{
ArrayList<String> added = new ArrayList<String>();
ArrayList<String> deleted = new ArrayList<String>();
Bundle b=new Bundle();
PackageManager pm;
Dictionary<String,PermissionInfo> permissions;
SharedPreferences prefs;
Editor editor;
Set<String> addSet = new HashSet<String>();
@Override
public void onReceive(Context context, Intent intent) {
//gets the installed or removed application
Uri data = intent.getData();
Log.i(AppDetectionService.class.getName(), "Action: " + intent.getAction());
Log.i(AppDetectionService.class.getName(), "The DATA: " + data);
prefs = context.getSharedPreferences("added", Context.MODE_PRIVATE);
editor = prefs.edit();
if(intent.getAction().equals("android.intent.action.PACKAGE_ADDED")){
permissions = new Hashtable<String,PermissionInfo>();
try{
pm = context.getPackageManager();
String[] pName = data.toString().split(":");
PackageInfo packageInfo = pm.getPackageInfo(pName[1], PackageManager.GET_PERMISSIONS);
added.add(pName[1]);
addSet.addAll(added);
editor.putInt("added", added.size());
editor.putStringSet("added", addSet);
//permissions
if (packageInfo.requestedPermissions != null){
for (String permName : packageInfo.requestedPermissions)
{
try
{
permissions.put(pName[1], pm.getPermissionInfo(permName, PackageManager.GET_META_DATA));
}
catch (NameNotFoundException e){}
}
}
}catch (NameNotFoundException e){}
editor.commit();
}
if(intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")){
permissions = new Hashtable<String,PermissionInfo>();
pm = context.getPackageManager();
String[] pName = data.toString().split(":");
deleted.add(pName[1]);
}
}
}
try this...
public class AppDetectionEnabler implements OnCheckedChangeListener {
protected final Context mContext;
private Switch mSwitch;
private String config;
private PackageManager pm;
private AppDetectionService receiver;
private IntentFilter intentFilter;
public AppDetectionEnabler(Context context, Switch swtch, String config) {
mContext = context;
this.config = config;
receiver = new AppDetectionService();
pm = mContext.getPackageManager();
intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.PACKAGE_ADDED");
intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
setSwitch(swtch);
}
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
SharedPreferences prefs;
Editor editor;
prefs = mContext
.getSharedPreferences("prefs_app", Context.MODE_PRIVATE);
editor = prefs.edit();
if (config == "AppDetection") {
if (!isChecked) {
mContext.unregisterReceiver(receiver);
} else if (isChecked) {
mContext.registerReceiver(receiver,intentFilter);
}
}
editor.putBoolean("APP_ENABLED", isChecked);
editor.commit();
}
}
but don't forget to unregister receiver when ever your Context going to be destroy...