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();
        }
    }
}
Author: Yury, 2012-02-28

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.

 72
Author: Sadeshkumar Periyasamy,
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.

 0
Author: wildapps,
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