Programing

Android-브로드 캐스트 인 텐트 ACTION_SCREEN_ON / OFF 수신 방법

lottogame 2020. 11. 24. 07:31
반응형

Android-브로드 캐스트 인 텐트 ACTION_SCREEN_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>

MyBroadcastReceiverfoo를 로그에 뱉도록 설정됩니다. 아무것도하지 않습니다. 어떤 제안을 부탁드립니다. 인 텐트를 포착하려면 권한을 할당해야합니까?


이러한 작업은 registerReceiver()매니페스트에 등록 된 수신자를 통하지 않고 Java 코드 (를 통해 )에 등록 된 수신자 만받을 수 있다고 생각합니다 .


또는 전원 관리자를 사용하여 화면 잠금을 감지 할 수 있습니다.

@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"

위의 세 개는 매니페스트를 사용하여 등록 할 수 없습니다. 안드로이드 코어는 그들에게 "Intent.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);

In receiver you must catch the following cases:

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

참고URL : https://stackoverflow.com/questions/1588061/android-how-to-receive-broadcast-intents-action-screen-on-off

반응형