| page.title=Manipulating Broadcast Receivers On Demand |
| parent.title=Optimizing Battery Life |
| parent.link=index.html |
| |
| trainingnavtop=true |
| |
| previous.title=Determining and Monitoring the Connectivity Status |
| previous.link=connectivity-monitoring.html |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#ToggleReceivers">Toggle and Cascade State Change Receivers to Improve |
| Efficiency</a></li> |
| </ol> |
| |
| |
| <h2>You should also read</h2> |
| <ul> |
| <li><a href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a> |
| </ul> |
| |
| </div> |
| </div> |
| |
| <p>The simplest way to monitor device state changes is to create a {@link |
| android.content.BroadcastReceiver} for each state you're monitoring and register each of them in |
| your application manifest. Then within each of these receivers you simply reschedule your recurring |
| alarms based on the current device state.</p> |
| |
| <p>A side-effect of this approach is that your app will wake the device each time any of these |
| receivers is triggered—potentially much more frequently than required.</p> |
| |
| <p>A better approach is to disable or enable the broadcast receivers at runtime. That way you can |
| use the receivers you declared in the manifest as passive alarms that are triggered by system events |
| only when necessary.</p> |
| |
| |
| <h2 id="ToggleReceivers">Toggle and Cascade State Change Receivers to Improve Efficiency </h2> |
| |
| <p>Use can use the {@link android.content.pm.PackageManager} to toggle the enabled state on any |
| component defined in the manifest, including whichever broadcast receivers you wish to enable or |
| disable as shown in the snippet below:</p> |
| |
| <pre>ComponentName receiver = new ComponentName(context, myReceiver.class); |
| |
| PackageManager pm = context.getPackageManager(); |
| |
| pm.setComponentEnabledSetting(receiver, |
| PackageManager.COMPONENT_ENABLED_STATE_ENABLED, |
| PackageManager.DONT_KILL_APP)</pre> |
| |
| <p>Using this technique, if you determine that connectivity has been lost, you can disable all of |
| your receivers except the connectivity-change receiver. Conversely, once you are connected you can |
| stop listening for connectivity changes and simply check to see if you're online immediately before |
| performing an update and rescheduling a recurring update alarm.</p> |
| |
| <p>You can use the same technique to delay a download that requires higher bandwidth to complete. |
| Simply enable a broadcast receiver that listens for connectivity changes and initiates the |
| download only after you are connected to Wi-Fi.</p> |