webentwicklung-frage-antwort-db.com.de

android: rundfunkempfänger für bildschirm ein und bildschirm aus

Ich habe mich nur gefragt, ob es möglich ist, einen Rundfunkempfänger zu registrieren, der Bildschirm EIN/AUS im Anwendungsmanifest erkennt. Der Grund, warum ich die programmierbare Methode nicht mag, ist, dass die App ausgeführt werden muss, um so etwas zu erkennen Broadcast für die Empfänger ausführen "(Quelle: Professional Android 2 Application Development Book)

Meine App ist eigentlich eine Lockscreen-App, die unter Verwendung der programmierbaren Methode ständig ausgeführt werden muss: S

Gibt es einen Ausweg?

Ich versuche Folgendes im Manifest:

<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>

und einfache MyBroadCastReciever-Klasse:

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();
        }
    }
}
58
himura

Die beiden Aktionen zum Ein- und Ausschalten des Bildschirms sind:

Android.intent.action.SCREEN_OFF
Android.intent.action.SCREEN_ON

Wenn Sie jedoch einen Empfänger für diese Sendungen in einem Manifest registrieren, empfängt der Empfänger diese Sendungen nicht.

Für dieses Problem müssen Sie einen Dienst mit langer Laufzeit erstellen, der einen lokalen Rundfunkempfänger für diese Zwecke registriert. Auf diese Weise sucht Ihre App nur dann nach ausgeschaltetem Bildschirm, wenn Ihr Dienst ausgeführt wird, was den Benutzer nicht irritiert.

PS: Starten Sie den Dienst im Vordergrund, damit er länger ausgeführt wird.

Ein einfaches Code-Snippet sieht ungefähr so ​​aus:

IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);

Vergessen Sie nicht, den Empfänger im Dienst onDestroy abzumelden. :

unregisterReceiver(mScreenStateReceiver);

Nur für den Fall, dass Leute fragen, warum der Empfänger nicht mit den deklarierten Broadcasts im Manifest für ACTION_SCREEN_ON und ACTION_SCREEN_OFF arbeitet:

https://developer.Android.com/reference/Android/content/Intent.html#ACTION_SCREEN_ONhttps://developer.Android.com/reference/Android/content/Intent. html # ACTION_SCREEN_OFF

Sie können dies nicht über in Manifesten deklarierte Komponenten erhalten, sondern nur, indem Sie sich explizit bei Context.registerReceiver () dafür registrieren.

Dies ist eine geschützte Absicht, die nur vom System gesendet werden kann.

Sie müssen einen Hintergrunddienst erstellen, um dies zu überprüfen. Dann können Sie es programmgesteuert einstellen.

0
wildapps