Android 自定义锁屏(带页面切换)

我简单的了解一下自定义锁屏,顺便总结了一下思路顺便画个图帮助理解

这里写图片描述

我的效果图

这里写图片描述

代码思路
锁屏分为两块,一块是UI(自定义布局)另一块这就是服务了

自定义锁屏布局
ACTION_DOWN按下:中间的ImageView会变成另一种形态
ACTION_MOVE移动: 移动到左/右边,左/右ImageView形态也要发生变化,
ACTION_UP抬起:判断滑动到左/右那边,或者回到最初位置

*服务

 @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);
        //设置此状态,首先会查找是否存在和被启动的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


    @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的销毁而被销毁

  @Override
    public void onDestroy(){
        super.onDestroy();
        MyService.this.unregisterReceiver(mScreenOnReceiver);
        MyService.this.unregisterReceiver(mScreenOffReceiver);
        //在此重新启动
        startService(new Intent(MyService.this, MyService.class));
    }

当屏幕变量或者变暗的时候,要解除屏幕锁定的方法,如果不解除 那只能一直锁着了=_=

  //屏幕变亮的广播,我们要隐藏默认的锁屏界面
    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);

            }
        }

    };
      //屏幕变暗/变亮的广播 , 我们要调用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);
            }
        }

    };

权限问题

  <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涉及到的东西有点多,我写的这个博客掐不住重点,写的繁琐反而浪费大家时间,什么也不说了全在代码中↓

源码地址
http://download.csdn.net/detail/macaopark/9861172

补充一点
用小米手机当测试机,一定要把这个Demo锁屏权限打开,手机设置中找到app,打开锁屏。不然一运行就崩掉

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值