android: odbiornik transmisji do włączania i wyłączania ekranu
Zastanawiałem się, czy możliwe jest zarejestrowanie odbiornika nadawczego, który wykrywa włączanie/wyłączanie ekranu w manifeście aplikacji. Powodem, dla którego nie lubię programowalnej metody jest to, że wymaga ona uruchomienia aplikacji w celu wykrycia takiej rzeczy, podczas gdy: "Aplikacje z odbiornikami Rozgłoszeniowymi zarejestrowanymi w manifeście nie muszą być uruchomione, gdy intencja jest transmitowana dla odbiorników do wykonania" (źródło: Professional android 2 application Development book) {]}
Mój aplikacja jest rzeczywiście lockscreen aplikacja, która przy użyciu programowalny sposób musi być uruchomiony przez cały czas: S
Czy można to obejść?Próbuję w manifeście:
<receiver android:name=".MyBroadCastReciever">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>
I prosta klasa Mybroadcastreciver:
public class MyBroadCastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.i("Check","Screen went OFF");
Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
Log.i("Check","Screen went ON");
Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show();
}
}
}
2 answers
Dwie czynności włączania i wyłączania ekranu to:
android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON
Ale jeśli zarejestrujesz odbiornik dla tych audycji w manifeście, odbiornik nie odbierze tych audycji.
Dla tego problemu, trzeba utworzyć długo działającą usługę, która jest rejestracja lokalnego odbiornika transmisji dla tych zamiarów. Jeśli zrobisz to w ten sposób, Twoja aplikacja będzie szukać ekranu wyłączonego tylko wtedy, gdy Twoja usługa jest uruchomiona, co nie będzie irytować użytkownika.
PS: uruchom usługę na pierwszym planie, aby zrób to dłużej.
Prosty fragment kodu będzie wyglądał tak:
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);
Nie zapomnij wyrejestrować odbiornika w serwisie 'S onDestroy:
unregisterReceiver(mScreenStateReceiver);
Na wszelki wypadek dla osób, które pytają, dlaczego odbiornik nie działa z deklarowanymi transmisjami w manifeście dla ACTION_SCREEN_ON i ACTION_SCREEN_OFF:
Https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF
Nie można tego otrzymać przez składniki zadeklarowane w manifestach, tylko poprzez jawną rejestrację w kontekście.registerReceiver ().
Jest to chroniona intencja, która może być wysłana tylko przez system.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 20:16:37
Musisz utworzyć usługę w tle, aby ją sprawdzić. Następnie można ustawić go programowo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 03:07:16