MyBroadcastReceiver ist nur darauf eingestellt, foo in die Protokolle zu spucken. Tut nichts. Irgendwelche Vorschläge bitte? Muss ich irgendwelche Berechtigungen zuweisen, um die Absicht zu erfassen?
Ich glaube, dass diese Aktionen nur von Empfängern empfangen werden können, die im Java-Code registriert sind (via registerReceiver()) und nicht über im Manifest registrierte Empfänger.
Okay, das habe ich mir gerade gedacht. Was ist der Grund dafür?
– Oh nein
19. Oktober 2009 um 12:06 Uhr
Android scheint keine im Manifest registrierten Empfänger für Fälle zu unterstützen, in denen sie wirklich keinen neuen Prozess starten möchten. Zum Beispiel sehen Sie den gleichen Effekt bei den Batterieinfo-Aktionen (z. B. BATTERY_LOW). Darüber hinaus habe ich jedoch nicht viele Gründe – ich habe es nicht geschrieben. 🙂
– CommonsWare
19. Oktober 2009 um 12:50 Uhr
@CommonsWare Wie kann ich Receiver() registrieren, wenn der Netzschalter gedrückt wird?
– Venki
21. Juni 2012 um 6:16 Uhr
@dirtydexter: Nein, es gibt keine solche Liste, und diese beiden Sendungen sollten entweder vom Manifest oder von Empfängern abgeholt werden können, die über registriert sind registerReceiver()SO VIEL ICH WEISS.
– CommonsWare
24. November 2014 um 11:39 Uhr
@PrimožKralj: Nun, unter Android 8.0+ müssen die meisten programmgesteuert registriert werden – die Ausnahmen sind aktiviert eine Whitelist. Bei früheren Versionen von Android versuchen Sie es im Allgemeinen. Wenn es nicht funktioniert, wenn es im Manifest registriert ist, bestätigen Sie Ihre Ergebnisse, indem Sie die Broadcast-Aktion in Stack Overflow und ähnlichen Ressourcen untersuchen. Im Idealfall hätte dies eine bessere Dokumentation.
– CommonsWare
17. September 2018 um 22:18 Uhr
Robert
Alternativ können Sie den Power Manager verwenden, um die Bildschirmsperre zu erkennen.
@Override
protected void onPause()
{
super.onPause();
// If the screen is off then the device has been locked
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
isScreenOn = powerManager.isInteractive();
} else {
isScreenOn = powerManager.isScreenOn();
}
if (!isScreenOn) {
// The screen has been locked
// do stuff...
}
}
+1 für Ansatz mit PowerManager Sehr nette Geste, wenn jemand es nicht benutzen möchte BroadcastReceiver
– Simon Dorociak
6. August 2013 um 11:20 Uhr
Ich wollte nur hinzufügen, dass dies zwar in 99% der Fälle gut funktioniert, aber unter bestimmten Umständen tatsächlich fehlschlagen kann. Bei Geräten, die den Bildschirm sehr schnell ein- und ausschalten können, wie z. B. Galaxy S4, können Sie dieses Verhalten überprüfen, indem Sie es mit einem ProximityLock kombinieren. Wenn Sie die Sperre auslösen, um den Bildschirm schnell aus- und wieder einzuschalten, gibt isScreenOn in onPause() tatsächlich true zurück.
– i Code 4 Essen
24. Januar 2014 um 8:25 Uhr
@iCode4Food Was du beschrieben hast, ist richtig, aber wie löst man es?
– zionpi
25. Januar 2016 um 7:31 Uhr
@SimonDorociak wo kann ich das in einem Dienst hinzufügen? (für eine Dienstleistung)
Drei der oben genannten können sich nicht mit Manifest registrieren. Der Android-Kern hat ihnen “Intent.FLAG_RECEIVER_REGISTERED_ONLY” hinzugefügt (vielleicht … habe ich Codes nur im Fall von “HEADSET_PLUG” überprüft).
Also sollten wir “dynamisches Register” verwenden. Wie unten…
private BroadcastReceiver mPowerKeyReceiver = null;
private void registBroadcastReceiver() {
final IntentFilter theFilter = new IntentFilter();
/** System Defined Broadcast */
theFilter.addAction(Intent.ACTION_SCREEN_ON);
theFilter.addAction(Intent.ACTION_SCREEN_OFF);
mPowerKeyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String strAction = intent.getAction();
if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) {
// > Your playground~!
}
}
};
getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter);
}
private void unregisterReceiver() {
int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 7) {
try {
getApplicationContext().unregisterReceiver(mPowerKeyReceiver);
}
catch (IllegalArgumentException e) {
mPowerKeyReceiver = null;
}
}
else {
getApplicationContext().unregisterReceiver(mPowerKeyReceiver);
mPowerKeyReceiver = null;
}
}
+1, schön. Das einzige, was zu beachten ist, ist, dass Build.VERSION.SDK nicht veraltet ist.
– Vikram.exe
12. August 2013 um 10:14 Uhr
Die unregisterReceiver() Code-Teil war wirklich nützlich für mich. Danke @cmcromance !! +1
– Silsur
9. März 2018 um 13:52 Uhr
Ich habe dies so implementiert, dass ich den Empfänger in meiner Hauptaktivität in onCreate() registriert habe, definiere den Empfänger einfach vorher irgendwo:
lockScreenReceiver = new LockScreenReceiver();
IntentFilter lockFilter = new IntentFilter();
lockFilter.addAction(Intent.ACTION_SCREEN_ON);
lockFilter.addAction(Intent.ACTION_SCREEN_OFF);
lockFilter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(lockScreenReceiver, lockFilter);
Und dann onDestroy():
unregisterReceiver(lockScreenReceiver);
Im Empfänger müssen Sie die folgenden Fälle abfangen:
public class LockScreenReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent != null && intent.getAction() != null)
{
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
// Screen is on but not unlocked (if any locking mechanism present)
}
else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
// Screen is locked
}
else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT))
{
// Screen is unlocked
}
}
}
}
Hier ist die Kotlin-Version von @cmcromance (Danke für Ihre Antwort. Bitte vergessen Sie nicht, die ursprüngliche Antwort zu verbessern)
private var mPowerKeyReceiver: BroadcastReceiver? = null
private fun registBroadcastReceiver() {
val theFilter = IntentFilter()
/** System Defined Broadcast */
theFilter.addAction(Intent.ACTION_SCREEN_ON)
theFilter.addAction(Intent.ACTION_SCREEN_OFF)
mPowerKeyReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.e("onReceive", "onReceive called")
val strAction = intent!!.action
// if (strAction == Intent.ACTION_SCREEN_OFF || strAction == Intent.ACTION_SCREEN_ON) {
if (strAction == Intent.ACTION_SCREEN_ON) {
// > Your playground~!
Log.e("strAction", strAction)
val intent = Intent(context, SplashScreenMainAppActivity::class.java)
startActivity(intent)
}
}
}
applicationContext.registerReceiver(mPowerKeyReceiver, theFilter)
}
private fun unregisterReceiver() {
val apiLevel = Build.VERSION.SDK_INT
if (apiLevel >= 7) {
try {
applicationContext.unregisterReceiver(mPowerKeyReceiver)
} catch (e: IllegalArgumentException) {
mPowerKeyReceiver = null
}
} else {
applicationContext.unregisterReceiver(mPowerKeyReceiver)
mPowerKeyReceiver = null
}
}
8691300cookie-checkAndroid – Wie erhalte ich Übertragungsabsichten ACTION_SCREEN_ON/OFF?yes