<service android:name="org.mozilla.mozstumbler.service.stumblerthread.StumblerService" android:label="stumbler"> </service> <receiver android:name="org.mozilla.mozstumbler.service.uploadthread.UploadAlarmReceiver" /> <service android:name="org.mozilla.mozstumbler.service.uploadthread.UploadAlarmReceiver$UploadAlarmService" /> <!-- How Fennec and Stumbler interact: - On start, Fennec broadcasts an empty STUMBLER_REGISTER_LOCAL_LISTENER intent, indicating that Stumbler should start listening for a locally-broadcast Stumbler preferences. - In response, Stumbler's SafeReceiver registers LocalPreferenceReceiver to listen for broadcasts sent over LocalBroadcastManager which contain sensitive information. - This registration happens only once, and SafeReceiver can't unregister the listener. - LocalPreferenceReceiver responds to internal broadcasts with sensitive information, and is able to start/stop StumblerService. - Fennec startup (if stumbling is enabled) or Fennec stumbling preference adjustment will trigger a local preference intent, and Stumbler's internal state will be adjusted via LocalPreferenceReceiver. --> <receiver android:exported="false" android:name="org.mozilla.mozstumbler.service.mainthread.SafeReceiver"> <intent-filter> <action android:name="org.mozilla.gecko.STUMBLER_REGISTER_LOCAL_LISTENER" /> </intent-filter> </receiver> <receiver android:exported="true" android:name="org.mozilla.mozstumbler.service.mainthread.SystemReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> </intent-filter> </receiver>