简单分析
基于开发需要,需要添加一个锁屏效果,然后达到某种广告推广的目的。
为了实现这个目的,第一步我们就要获得亮屏的信号,查看资料后发现系统提供黑屏和亮屏的广播,但是这两广播不提供静态注册,所以要想用就要在代码里面动态注册,动态注册想要长期有效,就需要有一个后台服务长期活着保证能时时接到广播。
服务保活参考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
网友评论