CONNECTIVITY_CHANGE is not a broadcast about the setting.  You said:
>
>
> It all works except that when WiFi is enabled the BroadcastReceiver does
> not get a notification when the user turns on mobile data from Settings. If
> there is a way around this limitation i would appreciate hearing about it.


This broadcast is instead telling you when the device establishes and loses
a data connection.  See the docs
<http://developer.android.com/reference/android/net/ConnectivityManager.html>.
So if you're on wifi and turn cell data on or off, nothing will happen and
a CONNECTIVITY_CHANGE bcast shouldn't be received.

Maybe try something like this
<http://stackoverflow.com/questions/16866438/getting-what-has-changed-in-contentobserver>
to
watch for Settings changes?

R

On Sun, Dec 27, 2015 at 4:13 PM, Mick Dawdy <[email protected]> wrote:

> For the many threads, blogs, examples and tutorials on the topic of
> Broadcast Receivers and mobile data connectivity I have not seen this
> question asked or answered.
>
> I believe, based on experimenting with one of my Apps, that the answer to
> this question is a distinct NO, that while WiFi is enabled, a Broadcast
> Receiver listening for Mobile Data CONNECTIVITY_CHANGE does not receive a
> broadcast notification when that event occurs. If I am wrong and have
> missed something or if you can confirm this independently please let me
> know.
>
> My App is a home screen Widget with two classes, ActiveMobileData is the
> AppWidgetProvider and ConnectivityChangeReceiver is the BroadcastReceiver.
> There is no App just the home screen widget. It simply toggles a home
> screen icon between red and green to indicate the current mobile data
> state. It has worked perfectly for several months with about 100 users.
>
> I decided to add the BroadcastReceiver to pick up clicks from Settings.
> This code is also straight forward - it determines the current state of
> mobile data, and uses a global boolean variable set by AppWidgetProvider to
> determine if the home screen icon is red or green. Then it simply ensures
> that the icon color matches the mobile data state.
>
> It all works except that when WiFi is enabled the BroadcastReceiver does
> not get a notification when the user turns on mobile data from Settings. If
> there is a way around this limitation i would appreciate hearing about it.
>
> I do think that the code will not help to answer the question as my
> assertion is either true or false regardless and i hope that someone has
> knowledge of this, but here is the code for the widget and then for the
> receiver.  I left out some details to keep it somewhat brief.*
> iconEnabled* is the global boolean variable shared between
> the AppWidgetProvider and BroadcastReceiver classes ...
>
> *public class ActiveMobileData extends AppWidgetProvider {*
> *static boolean iconEnabled;*
> *@Override*
> *public void onReceive(Context context, Intent intent) {*
> *    if (intent.getAction() != null)*
> *        super.onReceive(context, intent);*
> *    else {*
> *        context.startService(new Intent(context, ToggleService.class));*
> *    }*
> *}*
> *@Override*
> *public void onUpdate(Context context, AppWidgetManager appWidgetManager,
> int[]appWidgetIds) {*
> *    context.startService(new Intent(context, ToggleService.class));*
> *}*
> *public static class ToggleService extends IntentService {*
> *    public ToggleService() {*
> *        super("ActiveMobileData$ToggleService");*
> *    }*
> *    @Override*
> *    protected void onHandleIntent(Intent intent) {*
> *        ComponentName cn = new ComponentName(this,
> ActiveMobileData.class);*
> *        AppWidgetManager mgr = AppWidgetManager.getInstance(this);*
> *        mgr.updateAppWidget(cn, buildUpdate(this));*
> *    }*
> *    private RemoteViews buildUpdate(Context context) {*
> *        RemoteViews updateViews = new
> RemoteViews(context.getPackageName(), R.layout.widget);*
> *        if (!isMobileDataEnabled(getApplicationContext())) {*
> *            updateViews.setImageViewResource(R.id.mobileDataState,
> R.mipmap.ic_launcher_g);*
> *            enableMobileData(getApplicationContext(), true);*
> *            iconEnabled = true;*
> *        } else {*
> *            updateViews.setImageViewResource(R.id.mobileDataState,
> R.mipmap.ic_launcher_r);*
> *            enableMobileData(getApplicationContext(), false);*
> *            iconEnabled = false;*
> *        }*
> *        Intent i = new Intent(this, ActiveMobileData.class);*
> *        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);*
> *        updateViews.setOnClickPendingIntent(R.id.mobileDataState, pi);*
> *        return updateViews;*
> *    }*
> *    public boolean isMobileDataEnabled(Context context) {*
> *        // ... the code here is the one that uses Java reflection*
> *    }*
> *    private void enableMobileData(Context context, boolean enabled) {*
> *        // ... the code here is the one that uses Java reflection*
> *    }*
>
> *  } // public static class ToggleService*
> *} // public class ActiveMobileData*
>
> Following is the code for the BroadcastReceiver ...
>
> *public class ConnectivityChangeReceiver extends BroadcastReceiver {*
> *    @Override*
> *    public void onReceive (Context context, Intent intent) {*
> *        handleIntent(context);*
> *    }*
> *    protected void handleIntent(Context context) {*
> *        ComponentName cn = new ComponentName(context,
> ActiveMobileData.class);*
> *        AppWidgetManager mgr = AppWidgetManager.getInstance(context);*
> *        mgr.updateAppWidget(cn, buildUpdate(context));*
> *    }*
> *    private RemoteViews buildUpdate(Context context) {*
> *        RemoteViews updateViews = new
> RemoteViews(context.getPackageName(), R.layout.widget);*
> *        if (!ActiveMobileData.iconEnabled &&
> isMobileDataEnabled(context)) {*
> *            ActiveMobileData.iconEnabled = true;*
> *            updateViews.setImageViewResource(R.id.mobileDataState,
> R.mipmap.ic_launcher_g);*
> *            Intent i = new Intent(context, ActiveMobileData.class);*
> *            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
> 0);*
> *            updateViews.setOnClickPendingIntent(R.id.mobileDataState,
> pi);*
> *        } else*
> *        if (ActiveMobileData.iconEnabled &&
> !isMobileDataEnabled(context)) {*
> *            ActiveMobileData.iconEnabled = false;*
> *            updateViews.setImageViewResource(R.id.mobileDataState,
> R.mipmap.ic_launcher_r);*
> *            Intent i = new Intent(context, ActiveMobileData.class);*
> *            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
> 0);*
> *            updateViews.setOnClickPendingIntent(R.id.mobileDataState,
> pi);*
> *        }*
> *        return updateViews;*
> *    }*
> *    private boolean isMobileDataEnabled(Context context) {*
> *       // ... Identical code to that in the AppWidgetProvider*
> *    }*
> *} // class ConnectivityChangeReceiver*
>
> *Mick*
>
> --
> You received this message because you are subscribed to the Google Groups
> "Android Developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/android-developers.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/android-developers/94e80d48-bedf-4ba0-b82f-b29d687981da%40googlegroups.com
> <https://groups.google.com/d/msgid/android-developers/94e80d48-bedf-4ba0-b82f-b29d687981da%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/CABrF01BW8nbuMQPTf2OrSCsqVy7wu1Yq5TrnbJsMk5pg37t31Q%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to