一個簡單的Android 鎖屏小Demo,可以設置左滑有滑,我簡單的了解一下自定義鎖屏,順便總結了一下思路順便畫個圖幫助理解。
我的效果圖
代碼思路
鎖屏分為兩塊,一塊是UI(自定義布局)另一塊這就是服務了
自定義鎖屏布局
ACTION_DOWN按下:中間的ImageView會變成另一種形態(tài)
ACTION_MOVE移動: 移動到左/右邊,左/右ImageView形態(tài)也要發(fā)生變化,
ACTION_UP抬起:判斷滑動到左/右那邊,或者回到最初位置
*服務
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Override public void onCreate() { super .onCreate(); mContext = getApplicationContext(); //管理打開的窗口程序 mWinMng = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); i = new Intent(mContext, MyService. class ); i.setAction(MyService.LOCK_ACTION); zdLockIntent = new Intent(MyService. this , MyService. class ); //設置此狀態(tài),首先會查找是否存在和被啟動的Activity具有相同的親和性的任務棧 zdLockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); /*注冊廣播*/ IntentFilter mScreenOnFilter = new IntentFilter( "android.intent.action.SCREEN_ON" ); MyService. this .registerReceiver(mScreenOnReceiver, mScreenOnFilter); /*注冊廣播*/ IntentFilter mScreenOffFilter = new IntentFilter( "android.intent.action.SCREEN_OFF" ); MyService. this .registerReceiver(mScreenOffReceiver, mScreenOffFilter); } |
這個View 就是之前自定義的View,我只說說核心的代碼 稍后上Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent!= null ){ String action = intent.getAction(); if (TextUtils.equals(action, LOCK_ACTION)) //鎖屏添加view addView(); else if (TextUtils.equals(action, UNLOCK_ACTION)) { //解屏移除view removeView(); } } return Service.START_STICKY; } |
當程序銷毀的時候.服務要重新啟動,不然這個app的鎖屏,會隨著app的銷毀而被銷毀
1
2
3
4
5
6
7
8
|
@Override public void onDestroy(){ super .onDestroy(); MyService. this .unregisterReceiver(mScreenOnReceiver); MyService. this .unregisterReceiver(mScreenOffReceiver); //在此重新啟動 startService( new Intent(MyService. this , MyService. class )); } |
當屏幕變量或者變暗的時候,要解除屏幕鎖定的方法,如果不解除 那只能一直鎖著了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//屏幕變亮的廣播,我們要隱藏默認的鎖屏界面 private BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context , Intent intent) { Log.i(TAG, intent.getAction()); if (intent.getAction().equals( "android.intent.action.SCREEN_ON" )){ //鍵盤鎖的服務 mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE); mKeyguardLock = mKeyguardManager.newKeyguardLock( "zdLock 1" ); mKeyguardLock.disableKeyguard(); startService(i); } } }; //屏幕變暗/變亮的廣播 , 我們要調(diào)用KeyguardManager類相應方法去解除屏幕鎖定 private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context , Intent intent) { String action = intent.getAction() ; Log.i(TAG, intent.toString()); if (action.equals( "android.intent.action.SCREEN_OFF" ) || action.equals( "android.intent.action.SCREEN_ON" ) ){ mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE); mKeyguardLock = mKeyguardManager.newKeyguardLock( "zdLock 1" ); mKeyguardLock.disableKeyguard(); startService(i); } } }; |
權限問題
1
2
3
4
5
|
<uses-permission android:name= "android.permission.DISABLE_KEYGUARD" /><!-- 屏蔽HOME鍵需要的權限 --> <uses-permission android:name= "android.permission.VIBRATE" /> <uses-permission android:name= "android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name= "android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name= "android.permission.SYSTEM_ALERT_WINDOW" /> |
這個鎖屏Demo涉及到的東西有點多,我寫的這個博客掐不住重點,寫的繁瑣反而浪費大家時間,什么也不說了全在代碼中↓
源碼地址:鎖屏
補充一點
用小米手機當測試機,一定要把這個Demo鎖屏權限打開,手機設置中找到app,打開鎖屏,不然一運行就崩掉。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/MacaoPark/article/details/73477986