Android - Comment recevoir diffusion intention écran D'ACTION ON / OFF?

    <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 est réglé juste pour cracher du foo aux bûches. Ne fait rien. Toutes les suggestions s'il vous plaît? Dois-je attribuer des permissions pour saisir l'intention?

60
demandé sur ohnoes 2009-10-19 15:01:12

4 réponses

je crois que ces actions ne peuvent être reçues que par des récepteurs enregistrés en code Java (via registerReceiver() ) plutôt que par des récepteurs enregistrés dans le manifeste.

67
répondu CommonsWare 2009-10-19 11:55:10

vous pouvez également utiliser le power manager pour détecter le verrouillage d'écran.

@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...
    }
}
28
répondu Robert 2016-08-30 09:44:39
"android.intent.action.HEADSET_PLUG"
"android.intent.action.ACTION_SCREEN_ON"
"android.intent.action.ACTION_SCREEN_OFF"

trois d'entre eux ci-dessus, ils ne peuvent pas s'enregistrer en utilisant le Manifeste. Android core a ajouté " intention.FLAG_RECEIVER_REGISTERED_ON only" to them (maybe.. Je n'ai vérifié les codes qu'en cas de "HEADSET_PLUG".

nous devrions donc utiliser"dynamic register". Comme ci-dessous...

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;
    }
}
27
répondu cmcromance 2013-11-27 05:49:18

la façon dont j'ai mis en œuvre ceci est en enregistrant le récepteur dans mon activité principale dans onCreate (), il suffit de définir le récepteur quelque part avant:

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

puis onDestroy ():

    unregisterReceiver(lockScreenReceiver);

Dans le récepteur, vous devez attraper les cas suivants:

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
            }
        }
    }
}
5
répondu box 2016-07-13 08:25:53