Android - Serwis i Broadcastreceiver?

0

Cześć wszystkim,
zastanawiam się nad implementacją jednego problemu. Piszę aplikację, która powinna funkcjonować przez dane pakietowe, ale w przypadku braku internetu, podstawowe funkcjonalności powinny być wysyłane za pomocą smsów.

I teraz rozważam kilka różnych przypadków, jednym z nich jest brak internetu podczas logowania. Jeśli użytkownik się loguje bez internetu, to zabrać jego dane i trzymać do momentu aż ten internet uzyska.

No. I teraz pytanie - jak to zrobić.
Wstępnie zaimplementowałem to tak:

Override
public int onStartCommand(Intent intent, int flags, int startId) {
    DvLogs.v(TAG, "registerService loaded");

    registerReceiver(connectionStatusReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(connectionStatusReceiver);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

public BroadcastReceiver connectionStatusReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);

        DvLogs.i(TAG, "Network states:\nnoConnectivity "+noConnectivity+"\nreason: "+reason);

        if(!noConnectivity) registerUser();
    }
};

Mówiąc krótko: serwis który przez cały czas patrzy jak wygląda stan internetów. I dalej oczywiście logika logowania, ale to już pal licho.
I jak user się już zaloguje to przy starcie aplikacji ignoruję cały ten cyrk z serwisem i po prostu go nie uruchamiam.

Jednak... mam wrażenie, że to rozwiązanie jest bardzo koślawe. Dobrze czuję?
Nie do końca to działa, ale możliwe że słabo to zaimplementowałem - pracuję po części na cudzym kodzie i nie do końca widzę wszystkie zależności.

Jeśli jednak moje rozwiązanie jest typowym "prawą ręką w lewe ucho" - jak powinienem to zrobić?

Z góry dzięki za pomoc.

0

BroadcastReceiver nasłuchuje po fladze czy zdarzenie zaszło. W tym wypadku jeśli pojawił się internet to wywoła Ci service.

W ogóle nie zrozumiałem jaki masz problem i co chcesz zrobić.

podstawowe funkcjonalności powinny być wysyłane za pomocą smsów
??

0

W dużym skrócie aplikacja służy do porozumiewania się z serwerem.
W normalnych warunkach serwer wysyła do użytkownika notyfikacje przez GCM. Jeśli jednak użytkownik nie ma internetu (czy to z powodu zasięgu, czy po prostu wyłączył pakiety), aplikacja nadal działa - serwer nie dostawszy odpowiedzi wysyła do użytkownika SMSa.
Wiadomości są nasłuchiwane. Jeśli przyjdzie odpowiedni numer, wiadomość jest parsowana na UI, tak jakbyśmy ciągle mieli dostęp do internetu.

Przy starcie aplikacji, użytkownik rejestruje swój telefon w GCM. No, ale jeśli nie ma dostępu do internetu, to łapię to żądanie i puszczam w momencie kiedy połączenie zostanie udostępnione. Potem ustawiam flagę np. "userFullyLoggedIn" na true i więcej tego nie nasłuchuję.

Wydaje mi się, że robię trochę bez sensu. Serwis pracuje w tle mając uruchomionego broadcastreceivera. Czy sam receiver nie potrafi utrzymywać się w tle sam?
Bo mam wrażenie, że niepotrzebnie dubluję funkcjonalność.
Jeśli pojawi się internet -> włącz logowanie aplikacji -> Jeśli się uda -> zmień flagę w aplikacji na true -> następnym razem nie uruchamiaj nasłuchiwania, bo nie ma po co.

Czy coś mieszam?

0

Reciver nie musi się utrzymywać w systemie.Możesz zarejestrować w nim odpowiednie Intenty tak żeby np. wywalał Ci notyfikację jak zostanie uruchomiony internet. Robisz to w manifeście podając odpowiedni intent który ma go uruchomić. Dokładnie tak samo jak activity ustawiasz mu intent :)
http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1