Android – Wie erhalte ich Übertragungsabsichten ACTION_SCREEN_ON/OFF?

Lesezeit: 5 Minuten
    <application>
         <receiver android:name=".MyBroadcastReceiver" android:enabled="true">
                <intent-filter>
                      <action android:name="android.intent.action.ACTION_SCREEN_ON"></action>
                      <action android:name="android.intent.action.ACTION_SCREEN_OFF"></action>
                </intent-filter>
         </receiver>
...
    </application>

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

Android Wie erhalte ich Ubertragungsabsichten ACTION SCREEN ONOFF
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)

    – Sarah Cartenz

    19. Juli 2018 um 18:59 Uhr

1645915987 656 Android Wie erhalte ich Ubertragungsabsichten ACTION SCREEN ONOFF
cmromantik

"android.intent.action.HEADSET_PLUG"
"android.intent.action.ACTION_SCREEN_ON"
"android.intent.action.ACTION_SCREEN_OFF"

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

869130cookie-checkAndroid – Wie erhalte ich Übertragungsabsichten ACTION_SCREEN_ON/OFF?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy