Android-Как получить широковещательные намерения экран действий ВКЛ / ВЫКЛ?
<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
устанавливается просто плевать foo на журналы. Ничего не делать.
Любые предложения, пожалуйста? Нужно ли мне назначать какие-либо разрешения, чтобы поймать намерение?
4 ответа:
Я считаю, что эти действия могут быть получены только получателями, зарегистрированными в Java-коде (через
registerReceiver()
), а не через приемники, зарегистрированные в манифесте.
кроме того, вы можете использовать диспетчер питания для обнаружения блокировки экрана.
@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... } }
"android.intent.action.HEADSET_PLUG" "android.intent.action.ACTION_SCREEN_ON" "android.intent.action.ACTION_SCREEN_OFF"
три из них выше, они не могут зарегистрироваться с помощью Манифеста. Android core добавил " намерение.FLAG_RECEIVER_REGISTERED_ONLY " к ним (возможно.. Я проверил коды только в случае "HEADSET_PLUG".
Итак, мы должны использовать "динамический регистр". Как и ниже...
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; } }
способ, которым я реализовал это, зарегистрировав приемник в моей основной деятельности в onCreate (), просто определите приемник где-то заранее:
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);
а потом onDestroy ():
unregisterReceiver(lockScreenReceiver);
в приемнике вы должны поймать следующие случаи:
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 } } } }