@Robert Greenwalt Thank you very much. First because you got me to think in 
the right way, that changing the setting does not trigger 
a CONNECTIVITY_CHANGE; and second for the suggestion to use the 
ContentObserver. That enabled me to find this on StackOverflow ...

boolean mobileDataAllowed = Settings.Secure.getInt(getContentResolver(), 
"mobile_data", 1) == 1;
Now, if i can get a content observer notification for this change, or for 
any change and then filter this one, i will have exactly what i want. I
may be back with another question :)

*Mick*

On Monday, December 28, 2015 at 2:18:47 PM UTC-5, Robert Greenwalt wrote:
>
> 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://www.google.com/url?q=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F16866438%2Fgetting-what-has-changed-in-contentobserver&sa=D&sntz=1&usg=AFQjCNFRKRMpQNwF22FdD8-LzIlBNaTltA>
>  to 
> watch for Settings changes?
>
> R
>
> On Sun, Dec 27, 2015 at 4:13 PM, Mick Dawdy <[email protected] 
> <javascript:>> 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/a1f02c8c-7863-46a5-bfd9-06b813b79773%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to