Przyjęta odpowiedź od mbaird trafia w gwóźdź w głowę. Proponowana metoda onVisivilityChange()
, jeśli zaimplementowana, powinna obejmować wszystkie powyższe przypadki.
W międzyczasie jest to nadal poważny problem dla niektórych typów widżetów. jom wprowadził możliwość rejestracji, aby otrzymać intencje ACTION_SCREEN_OFF/ACTION_SCREEN_ON.Jest to użyteczne, ponieważ poleganie na powtarzającym się alarmie nie jest wystarczające, ponieważ inne usługi powodują pobudki. Jest to trudne, ponieważ takich działań nie można zasubskrybować za pośrednictwem AndroidManifest.xml, a AppWidgetProvider nie może wywoływać numeru context.registerReceiver()
. Kwestie te omówiono w kilku innych pytaniach dotyczących StackOverflow, w tym Listening for ACTION_SCREEN_OFF, android.intent.action.SCREEN_ON doesn't work as a receiver intent filter i Android - how to receive broadcast intents ACTION_SCREEN_ON/OFF?.
udało mi się subskrybowania ACTION_SCREEN_OFF zamiarów/ACTION_SCREEN_ON w widgecie poprzez stworzenie uzupełniającej BroascastReceiver
instancji i korzystania context.getApplicationContext().registerReceiver()
aby go zarejestrować. To może być oszustwo i przynajmniej w niektórych kolejnych wersjach Androida może się nie udać na etapie rejestracji lub może po prostu zdarzenia nie zostaną dostarczone. Zakodowałem do obsługi tych przypadków, ale na razie to działa. Niestety, to nie zadziała, jeśli i kiedykolwiek aplikacja zostanie zabita.
Inną możliwością jest użycie metody typu isHomeScreenShowing()
, zgodnie z opisem here, do której odwołuje się odpowiedź Xandy'ego. Pomysły, które tam prawdopodobnie mogłyby zostać zoptymalizowane przez buforowanie wygenerowanej listy zainstalowanych aplikacji CATEGORY_HOME
i słuchanie transmisji ACTION_PACKAGE_ADDED/ZMIENIONYCH/USUWANYCH w celu aktualizacji.
Moja strategia jest:
- Spróbuj uniknąć nazywa (poprzez powtarzalny alarm), gdy nie jest widoczny.
- Po wywołaniu sprawdź stan ekranu i inne wskaźniki widoczności, zanim zrobisz cokolwiek kosztownego.
- Następnie należy wywołać
IntentService
w celu obsługi stosunkowo kosztownej pracy, która obejmuje trwałe połączenie sieciowe. Jest to konieczne do monitorowania stanu usługi zdalnej w czasie zbliżonym do rzeczywistego.
Zagrałem, przynajmniej to mogę zrobić, odpowiedziałeś na wiele moich pytań i prawdopodobnie zrobię to w przyszłości. Dzięki. – Pentium10
Oznaczona gwiazdką, szkoda, nie będzie dostępna w milionach obecnie używanych widełek ... – tomash
Możliwe jest określenie, która aplikacja jest aktualnie uruchomiona: ActivityManager mAM = (ActivityManager) context.getSystemService (Context.ACTIVITY_SERVICE); Lista tasks = mAM.getRunningTasks (1); –
Niels