0

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?

enter image description here

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]);

    }




     }


}
Kara
  • 6,115
  • 16
  • 50
  • 57
aysbtl_
  • 339
  • 1
  • 3
  • 18

1 Answers1

0

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...

Gopal Gopi
  • 11,101
  • 1
  • 30
  • 43