美文网首页
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