공부/Android

안드로이드 잠금 화면 만들기

Lim.JeiKei 2011. 12. 29. 15:09
안드로이드폰에서 hold키를 누르면 순정 lockscreen으로 화면이 잠긴다.
이 락스크린을 개발자가 직접 건드릴수는 없으므로 가짜(?) 락스크린을 만들어 넣는 방법을 생각해 볼 수 있다.
 
LockScreen.java에서 Activity를 상속 받고,
onCreate메소드에서
WindowManager를 통해 플래그를 주었다...
 
 - onCreate()
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
                              WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
setContentView(R.layout. .....);
 
위 플래그를 통해 홀드키를 누르면 안드로이드 순정 락스크린이 걸린상태에서 그 위에
LockScreen.java 액티비티를 띄우게 된다.
 
나는 서비스를 돌리고, 서비스에서 브로드캐스트 리시버를 통해 "Intent.ACTION_SCREEN_OFF" 브로드캐스트가 수신됐을때
(즉, 화면이 꺼졌을때) startActivity(new Intent(new, LockScreen.class)); 와 같은 형식으로 락스크린 액티비티를 호출해줬다.
그러면 화면이 꺼지고 안드로이드 순정 락스크린이 걸린 상태에서 그 위에 LockScreen.java 액티비티가 호출되어 있을 것이다.
 
이상태에서 다시 홀드키를 눌러 화면을 켜게되면 원래는 순정 락스크린이 떠 있어야 하지만, onCreate에서 추가해준 플래그에 의해
순정 락스크린이 떠있는 상태에서 그 위에 LockScreen.java 액티비티가 떠있게 되므로, 사용자 입장에서는
그것이 락스크린이 된다. 거기서 락을 해제할수있는 버튼을 하나 만들어서 그 버튼을 눌렀을때
LockScreen.java 액티비티는 onPause쯤에서 finish() 호출해서 액티비티를 종료 시키고,
아래 코드를 추가하면,
 
KeyguardManager km = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyLock = km.newKeyguardLock(KEYGUARD_SERVICE);
keyLock.disableKeyguard(); //순정 락스크린 해제
 
이렇게 해주면 순정 LockScreen이 종료 되면서 순정 락스크린도 함께 해제되어
모르는사람은 그게 진짜 락스크린처럼 보일 것이다..
 
위에서 사용한 코드(KeyguardManager를 사용하려면 AndroidManifest.xml에서 퍼미션을 추가해줘야 사용 가능하다.
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
 
반대로 락을 다시 걸어주는 방법은
keyLock.reenableKeyguard();를 호출해주면 순정락화면으로 잠긴다.
이때도 마찬가지, reenableKeyguard를 호출해 순정락화면으로 잠궈버리고,
다시 startActivity로 LockScreen.java액티비티를 호출하면 자연스럽게
onCreate에서 추가해준 플래그에 의해 락스크린위에 LockScreen.java 액티비티가 위로 올라가기 때문에
락스크린으로써의 기능(?)을 다 할수가 있다.
 
좀더 유연하게 쓰려면 여러가지 살을 좀 붙여야겠지만. 이정도만해도 충분히 락스크린을 만들 수 있다.
 
어떤 블로그나 자료를 보면 onCreate에서 추가한 플래그들이 락스크린을 해제 해주는 코드라고 하는데..
정확하게 말해서 락스크린을 해제 해주게 아니라, 락스크린이 안풀린 상태에서 그 위에 또다른 액티비티가 올라가기 때문에
락이 해제된 것 처럼 보일 뿐이다.




홈키 무력화 :

 

1.@Override
2.public void onAttachedToWindow() {
3.super.onAttachedToWindow();
4.this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
5.}


 

 

뒤로 가기 무력화 :

01.public boolean onKeyDown( int KeyCode, KeyEvent event )
02.{
03.if( event.getAction() == KeyEvent.ACTION_DOWN ){
04.if( KeyCode == KeyEvent.KEYCODE_BACK ){
05.//여기에 뒤로 버튼을 눌렀을때 해야할 행동을 지정한다
06. 
07.return true;
08.}
09. 
10.}
11. 
12.return super.onKeyDown( KeyCode, event );
13.}




출처 :
http://www.androidpub.com/1837688 
http://blog.naver.com/PostView.nhn?blogId=multikth&logNo=150109761153 
 

나중에 이것들 이용해서 앱 하나 만들고 싶은게 생겼음