편집 기록

편집 기록
  • 프로필 정토드님의 편집
    날짜2017.01.03

    안드로이드 잠금화면 만드는 중 궁금한 것이 있습니다..


    foreground서비스를 이용해서 죽지않는 서비스를 많들었구여,

    브로드캐스트 리시버를 이용해서 화면이 꺼지면 기본잠금화면을 없애고 제가만든 잠금화면(액티비티)을 생성해주었습니다.

    그런데 , 화면을 껏다키면 기본잠금화면이 0.5초~1초정도 보인뒤에 제가 만든 잠금화면이 나타납니다

    그리고 제가만든 잠금화면을 해제하면 기본잠금화면이 여전히 잇습니다..

    뭔가 기본잠금화면 해제 구현에 문제있는거 같은데 잘 못찾겠습니다..

    매니페스트에 < uses-permission android:name="android.permission.DISABLE_KEYGUARD" />도 등록해놧습니다

    제가만든 잠금화면(액티비티)에는

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

    라고 onCreate에 써놧습니다..

    브로드캐스트 리시버는 다음과 같습니다.. 뭐가 문제일까요?..

    public class ScreenReceiver extends BroadcastReceiver {
    
        private KeyguardManager km = null;
        private KeyguardManager.KeyguardLock keyLock = null;
        private TelephonyManager telephonyManager = null;
        private boolean isPhoneIdle = true;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
    
                if (km == null)
                    km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    
                if (keyLock == null)
                    keyLock = km.newKeyguardLock(Context.KEYGUARD_SERVICE);
    
                if(telephonyManager == null){
                    telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
                    telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
                }
    
                if(isPhoneIdle) {
    
                    disableKeyguard();
    
                    Intent i = new Intent(context, Activity1_1.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(i);
                }
            }
        }
    
        public void reenableKeyguard() {
            keyLock.reenableKeyguard();
        }
    
        public void disableKeyguard() {
            keyLock.disableKeyguard();
        }
    
        private PhoneStateListener phoneListener = new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber){
                switch(state){
                    case TelephonyManager.CALL_STATE_IDLE :
                        isPhoneIdle = true;
                        break;
                    case TelephonyManager.CALL_STATE_RINGING :
                        isPhoneIdle = false;
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK :
                        isPhoneIdle = false;
                        break;
                }
            }
        };
    }
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2016.11.17

    안드로이드 잠금화면 만드는 중 궁금한 것이 있습니다..


    foreground서비스를 이용해서 죽지않는 서비스를 많들었구여,

    브로드캐스트 리시버를 이용해서 화면이 꺼지면 기본잠금화면을 없애고 제가만든 잠금화면(액티비티)을 생성해주었습니다.

    그런데 , 화면을 껏다키면 기본잠금화면이 0.5초~1초정도 보인뒤에 제가 만든 잠금화면이 나타납니다

    그리고 제가만든 잠금화면을 해제하면 기본잠금화면이 여전히 잇습니다..

    뭔가 기본잠금화면 해제 구현에 문제있는거 같은데 잘 못찾겠습니다..

    매니페스트에 < uses-permission android:name="android.permission.DISABLE_KEYGUARD" />도 등록해놧습니다

    제가만든 잠금화면(액티비티)에는

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

    라고 onCreate에 써놧습니다..

    브로드캐스트 리시버는 다음과 같습니다.. 뭐가 문제일까요?..

    public class ScreenReceiver extends BroadcastReceiver {
    
        private KeyguardManager km = null;
        private KeyguardManager.KeyguardLock keyLock = null;
        private TelephonyManager telephonyManager = null;
        private boolean isPhoneIdle = true;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
    
                if (km == null)
                    km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    
                if (keyLock == null)
                    keyLock = km.newKeyguardLock(Context.KEYGUARD_SERVICE);
    
                if(telephonyManager == null){
                    telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
                    telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
                }
    
                if(isPhoneIdle) {
    
                    disableKeyguard();
    
                    Intent i = new Intent(context, Activity1_1.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(i);
                }
            }
        }
    
        public void reenableKeyguard() {
            keyLock.reenableKeyguard();
        }
    
        public void disableKeyguard() {
            keyLock.disableKeyguard();
        }
    
        private PhoneStateListener phoneListener = new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber){
                switch(state){
                    case TelephonyManager.CALL_STATE_IDLE :
                        isPhoneIdle = true;
                        break;
                    case TelephonyManager.CALL_STATE_RINGING :
                        isPhoneIdle = false;
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK :
                        isPhoneIdle = false;
                        break;
                }
            }
        };
    }