반응형
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>
MyBroadcastReceiver
foo를 로그에 뱉도록 설정됩니다. 아무것도하지 않습니다. 어떤 제안을 부탁드립니다. 인 텐트를 포착하려면 권한을 할당해야합니까?
이러한 작업은 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
}
}
}
}
반응형
'Programing' 카테고리의 다른 글
단위 테스트 ASP.Net MVC Authorize 특성으로 로그인 페이지로의 리디렉션 확인 (0) | 2020.11.24 |
---|---|
라벨 태그에서 "for"는 무엇입니까? (0) | 2020.11.24 |
JavaScript를 사용하여 리퍼러의 도메인 / 호스트 이름을 어떻게 얻습니까? (0) | 2020.11.24 |
모델 및 ViewDataDictionary가있는 asp mvc 부분-ViewDataDictionary에 어떻게 액세스합니까? (0) | 2020.11.24 |
출력 파일을 열 수 없습니다. 권한이 거부되었습니다. (0) | 2020.11.24 |