2012-03-22 11 views
5

Mam aktywność uruchomioną w trybie singleTop i odbiorniku C2DM. W niektórych zgłoszenia potrzebne do uruchomienia tej działalności i robią to w ten sposób:Obsługa OnNewIntent dla FLAG_ACTIVITY_NEW_TASK

Intent activity = new Intent(context, klass); 
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
context.startActivity(activity); 

Kiedy aktywność jeśli tła (np naciśnięty przycisk Start przed), wszystko działa bez zarzutu. Ale kiedy po prostu nacisnąłem przycisk zasilania, aby wyłączyć ekran, działanie bieżące nie może być powiadomione o pewnych zmianach (onNewIntent nigdy nie było wywoływane).

Jak mogę powiadomić działającą aktywność dotyczącą powiadomienia?

+0

Nie zaleciłbym aktualizacji interfejsu użytkownika tylko w trybie onCreate, ale można również skorzystać z usługi onResume. Niemniej jednak uważam, że pytanie jest zbyt nieostre i nie jestem pewien, czy mamy wszystko, na co musimy odpowiedzieć. Podaj kod działania, główne metody. – Snicolas

+0

Telefon jest zablokowany, a aktywność wydaje się być na pierwszym planie i nie jest ponownie uruchamiana, 'onResume',' onCreate' i 'onNewIntent' nie jest nazywane – skayred

+0

Możesz rozważyć użycie usługi, być może z blokadą sieci, aby upewnić się, że nadal otrzymujesz c2dm powiadomienia. – Snicolas

Odpowiedz

4

Skayred, Wierzę, że miałem dokładnie taką samą sytuację. Zauważyłem jednak, że kiedy telefon spał, a nowe działanie zostało wysłane do działania, nie uruchomiłoby ono aktywności, dopóki ekran nie był włączony (dla moich celów chciałem, żeby ekran był włączony).

Moim rozwiązaniem było nabycie wakeloku w moim odbiorniku C2DM.

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,  TAG); 
mWakeLock.acquire(); 

Oczywiście, pamiętaj o zwolnieniu blokady za pomocą mWakeLock.release() w swojej aktywności.

To dziwne zachowanie, które nie wydaje się być zgodne z innymi zachowaniami związanymi z działaniem Androida. W moim przypadku używam działania singleTask (nie jestem pewien jakiego rodzaju aktywności używasz, którego nie określiłeś). Jeśli nie jest to przykład działalności na górze stosu, a telefon jest uśpiony moja działalność rozpocznie i mogę użyć następujących w onCreate():

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

Jednak jeżeli działalność jest górna część stosu i telefon śpi, aktywność nie jest uruchamiana, dopóki nie włączę ekranu. Mam nadzieję, że to działa dla ciebie. Jeśli nie potrzebujesz ekranu, chciałbym spróbować grać z innymi flagami dla wakelocka.

1

Według ciebie konfiguracji, to powinno działać:

  • zbudować klasę aplikacji jako pojedyncza, później można go przejść łatwo
  • dać mu element danych, który jest model danych, to będzie dostępny zarówno z odbiornika powiadomień C2DM i wszystkich acitivies
  • zbudować swój model danych według obserwowalne-Observer wzorca projektowego
  • zgłoszenie C2DM zmieni model
  • działalności, onCreate będzie podłączyć detektor zdarzeń, należy odłączyć podczas onDestroy
  • kiedy model zmienia pożary zdarzenie dla wszystkich słuchaczy, i działań, gdy otrzymują zdarzenie, zaktualizuj ich UI

Jest to dobra okazja, aby uzyskać lepszy wygląd również w swojej aplikacji.

Powiązane problemy