2011-10-25 32 views
16

Mam odbiornik telewizyjny zarejestrowany programowo w działaniu. Odpowiada na intencję PACKAGE_REMOVED, która jest uruchamiana po usunięciu pakietu.Odbiornik i wstrzymana aktywność

Problem polega na tym, że ten komunikat się nie pojawia. Myślę, że dzieje się tak dlatego, że cel jest uruchamiany, gdy opuszczę działanie i przejdę do innej czynności, aby odinstalować aplikację, więc pierwotna aktywność została wstrzymana. Czy to możliwe, że wstrzymana czynność (gdy odbiornik nie jest wyrejestrowany w) również zatrzymuje odbiornik?

Odpowiedz

36

Po zarejestrowaniu odbiornika radiowego programowo w działaniu NIE otrzyma transmisji po wstrzymaniu aktywności. The BroadcastReceiver docs nie są tak jasne, jak mogłyby być w tym punkcie. Zalecają wyrejestrowanie na onPause wyłącznie w celu zmniejszenia obciążenia systemu.

Jeśli chcesz odbierać zdarzenia, nawet gdy Twoja aktywność nie jest na pierwszym planie, zarejestruj odbiorcę w pliku manifestu, używając elementu receiver.

+1

Czy zarejestrowany odbiorca, jeśli jest zarejestrowany w manifeście znajdującym się wewnątrz działania, które jest aktualnie wstrzymane, może uzyskać dostęp do prywatnych zmiennych związanych z jego aktywnością? – Peterdk

+0

Nieważne, teraz widzę, że klasa Odbiornika nie jest interfejsem, ale klasą, z której należy dziedziczyć. – Peterdk

+0

@chris, nie widzę tego udokumentowane w Android docs. –

2

Może zarejestrować odbiornik w usługi, która będzie działać w tle

5

Dodaj Receiver do projektu, a dostaniesz to wydarzenie, nawet nie wychodząc aplikacji.

public class TestReciver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TestReciver",intent.getAction()+"\n" 
       +intent.getDataString()+"\n" 
       +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n" 
       +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n" 
       +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 
      ); 
    } 

} 

iw swoim manifeście dodać go tak (Wewnątrz aplikacji < > tag):

<receiver android:name="TestReciver" > 
    <intent-filter > 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

Podczas korzystania z odbiornika tak nie nazywamy dowolny zarejestrowania lub wyrejestrowania tak będzie zawsze bądź gotowy, aby uzyskać dane.

Pamiętaj, że to nie zadziała, jeśli pozwolisz użytkownikom przenieść aplikację na kartę SD. Jeśli zdarzenie zostanie wysłane, gdy karta SD zostanie odłączona, odbiornik nie będzie dostępny, a Ty przegapisz wydarzenie.