#7 Para los datos, sí, debes guardarlos en una bbdd o cualquier otro sitio de persistencia si quieres sincronizarlo más adelante.
No, el Broadcast y el Service son cosas independientes:
http://developer.android.com/reference/android/content/BroadcastReceiver.html
http://developer.android.com/guide/components/services.html
Ahora que lo pienso, ni si quiera hace falta que lo hagas con Broadcast xD. Registra directamente tu Service para que se lance cuando cambie la conectividad, para simplificar puedes usar un IntentService:
http://developer.android.com/reference/android/app/IntentService.html
Revisa todo lo que te escribo ahora porque puede que tenga fallos o esté muy simplificado y puedan fallar cosas a la hora de comprobar la connectividad
Manifest:
<manifest ... >
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application ... >
<service android:name=".ExampleService" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.example.intent.action.SYNC" />
</intent-filter>
</service>
...
</application>
</manifest>
Y tu service así:
public class MyService extends IntentService {
public static final String ACTION_SYNC = "com.example.intent.action.SYNC";
public static final String ACTION_SYNC_FINISHED = "com.example.intent.action.SYNC_FINISHED";
@Override
protected void onHandleIntent(Intent intent) {
// no nos hace falta comprobar el tipo de action porque siempre vamos a hacer lo mismo y el unico requisito es que esté conectado.
if (isConnected()) {
sync();
}
}
private boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
return ni != null && ni.isConnected();
}
private void sync() {
// Sincronizas tus datos en caso de que sea necesario
sendBroadcast(new Intent(ACTION_SYNC_FINISHED));
}
}
Eso ya escucharía cuando hay cambios de la connectividad o cuando se ha lanzado un intent, para lanzar un intent desde tus activities o cualquier otro sitio que lance el service (no olvides registrar un broadcast para el ACTION_SYNC_FINISHED y así actualizar tu vista):
context.startService(new Intent(MyService.ACTION_SYNC));
// si lo de arriba no funciona que no estoy seguro ahora mismo:
Intent i = new Intent(context,MyService.class);
i.setAction(MyService.ACTION_SYNC); // realmente ni haría falta y podrías borrarlo del manifest tmb.
context.startService(i);