美文网首页
Android 充电锁屏页面

Android 充电锁屏页面

作者: 水言 | 来源:发表于2017-06-27 10:49 被阅读586次

    简单分析

    基于开发需要,需要添加一个锁屏效果,然后达到某种广告推广的目的。
    为了实现这个目的,第一步我们就要获得亮屏的信号,查看资料后发现系统提供黑屏和亮屏的广播,但是这两广播不提供静态注册,所以要想用就要在代码里面动态注册,动态注册想要长期有效,就需要有一个后台服务长期活着保证能时时接到广播。
    服务保活参考1
    服务保活参考2
    这两个例子可以在一定程度上面保证服务活着,但是杀不死的服务目前没有解决。
    然后由于广播发送本身存在不稳定性,等接到开屏广播后再去响应就存在时效性问题,效果不佳,一般在接到熄屏广播后就处理信号,等下一次亮屏的时候就能展示我们需要的东西了。

    关于锁屏页的展示目前发现实现的方式有两种,一种通过悬浮窗口实现,一种通过启动一个新的Activity实现。

    一.悬浮窗

    在接收到锁屏广播后,向Window添加一层布局,代码如下:

        //添加锁屏悬浮窗
        private void addLockView(){
            if(mWindowManager == null) return ;
            mRootView = new RootView(LockerService.this);//悬浮窗布局
            WindowManager.LayoutParams param = new WindowManager.LayoutParams();
            param.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
            if(Config.sIsFull) param.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
            param.format = PixelFormat.RGBA_8888;
            param.width = WindowManager.LayoutParams.MATCH_PARENT;
            param.height = WindowManager.LayoutParams.MATCH_PARENT;
            mWindowManager.addView(mRootView, param);
        }
    

    完成操作后依次窗口的代码

        //移除锁屏悬浮窗
        private void removeLockView(){
            if(mWindowManager == null) return ;
            mWindowManager.removeView(mRootView);
        }
    

    通过这个方式添加锁屏也后,部分手机(小米和华为等)需要有悬浮窗的权限,关键问题是需要用户手动去开启这个权限,这个就尴尬了。
    出于这个考虑,这个方案不是特别理想,除非你能一步步引导用户去开启。

    二.Activity展示引导页

    这个的实现也是简单了,在接到黑屏广播后启动一个Activity。

               Intent jmpSLA = new Intent(context, ChargingActivity.class);
               jmpSLA.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity(jmpSLA);
    
    锁屏效果图

    滑动的时候为了保证下面的页面能够展示,我的做法是将Activity设置成透明的,Activity属性如下:

        <style name="LockScreenBase" parent="android:Theme.DeviceDefault.Light.NoActionBar.Fullscreen">
            <item name="android:windowContentOverlay">@null</item>
            <item name="android:backgroundDimEnabled">false</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowBackground">@color/transparent</item>
        </style>
    

    滑动的时候Activity内的View上移,这样透明的Activityi就可以显示出下面的东西。

    解锁屏幕想要显示在系统锁屏之上那么这个Activitiy需要设置成:

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

    隐藏下面的导航软键盘:

            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav
                            | View.SYSTEM_UI_FLAG_IMMERSIVE);
    

    项目源码:
    链接:http://pan.baidu.com/s/1c1BO3D2 密码:wyt0
    参考:
    http://blog.csdn.net/shaw1994/article/details/48116353

    相关文章

      网友评论

          本文标题:Android 充电锁屏页面

          本文链接:https://www.haomeiwen.com/subject/wqcuqxtx.html