2016-10-28 1 views
1

FLAG_KEEP_SCREEN_ON 플래그를 프로그래밍 방식으로 전환하려고합니다. 내 안드로이드 타블렛 앱은 내 작업의 주요 활동이 항상 켜지는 특정 작업 환경을위한 것입니다.특정 시간에 FLAG_KEEP_SCREEN_ON을 토글합니다.

우리는 레이아웃 XML의

android:keepScreenOn="true" 

를 사용하여 지금까지에 의해 입수했습니다.

불행히도 직원들은 근무일 종료시 수동으로 화면을 수동으로 끄는 것을 항상 기억하지는 않습니다. 프로그래밍 방식으로 작업 화면에서 '화면 유지'기능을 사용하지 않도록 설정하고 싶지만 일단 다시 시작하면 다시 사용하도록 설정하고 싶습니다.

onResume()에 Task/handler.postDelayed()을 사용하여 매 x 분마다 실행되며 현재 시간이 경계 내에 있는지 확인합니다. 나는 또한 onPause() 작업을 취소 할 계획이다.

내 질문 : 더 좋은 방법이 있습니까? 아니면 좋은 접근 방법입니까? 그렇다면 루퍼를 사용해야합니까?

답변

2

적절한 시간에 플래그를 설정하기 위해 AlarmManager을 사용하면 주기적으로 확인할 필요가 없습니다.

는 예를 들어, ActivityBroadcastReceiver을 정의, 즉 FLAG_KEEP_SCREEN_ON 플래그를 지 웁니다

private static final String ACTION_SCR_OFF = "yourpackagename.ACTION_SCREEN_OFF"; 

private final BroadcastReceiver screenOffReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 
}; 

등록/동적으로 등록 취소 :

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(screenOffReceiver, new IntentFilter(ACTION_SCR_OFF)); 
} 

@Override 
protected void onPause() { 
    unregisterReceiver(screenOffReceiver); 
    super.onPause(); 
} 

그리고에서이 수신기를 트리거 알람을 설정 적절한 시간 (이 예에서는 매일 16:00) :

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 16); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

Intent intent = new Intent(ACTION_SCR_OFF); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
    AlarmManager.INTERVAL_DAY, pendingIntent);