Ich habe mich nur gefragt, ob es möglich ist, einen Broadcast-Empfänger zu registrieren, der Screen ON/OFF 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, während: „Anwendungen mit im Manifest registrierten Broadcast-Empfängern müssen nicht ausgeführt werden, wenn die Absicht ist Broadcast für die auszuführenden Empfänger” (Quelle: Professional Android 2 Application Development book)
Meine App ist eigentlich eine Lockscreen-App, die auf programmierbare Weise die ganze Zeit laufen 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();
}
}
}
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 lang laufenden Dienst erstellen, der einen lokalen Broadcast-Empfänger für diese Absichten registriert. Wenn Sie auf diese Weise vorgehen, sucht Ihre App nur dann nach Bildschirm aus, wenn Ihr Dienst ausgeführt wird, was den Benutzer nicht irritiert.
PS: Starten Sie den Dienst im Vordergrund, damit er länger läuft.
Ein einfaches Code-Snippet sieht in etwa 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 in der abzumelden Bedienung‘S aufZerstören:
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 funktioniert:
https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON https://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 mit 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 danach zu suchen. Dann können Sie es programmgesteuert festlegen.
Können Sie mir eine Probe geben, die funktioniert? Ich möchte etwas tun, wenn der Bildschirm gesperrt oder entsperrt wird.
– محمد
18. Januar 2015 um 13:42 Uhr