Search code examples
androidbroadcastreceiver

Register broadcast receiver in non-activity class


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

    }




     }


}

Solution

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