Android仿网易云音乐中锁屏后在开锁界面插屏功能
2016-05-18 17:04
459 查看
这个功能实现起来应该有多种方式,可以使用WindowManager创建window的方法。
在本文中我们使用开启一个Activity来充当锁屏界面。
实现步骤有以下两步:
一、后台开启一个Service,监听屏幕锁屏广播。
二、当屏幕熄灭,收到广播后,开启充当锁屏界面的Activity。
实现思路就是这么简单,但具体细节需要说说。
首先开启Service。
在Service监听屏幕锁屏广播。
Intent.ACTION_SCREEN_OFF表示屏幕熄灭。
在广播onReceive()方法中,收到屏幕熄灭的广播后,开启充当锁屏界面的Activity,我们知道在Service中启动Activity需要添加一个标志位。
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
这样我们便实现了锁屏功能。
问题还没有结束。
首先开启的Activity我们最好把它设置在单独的一个任务栈中,它与当前APP的任务栈没有关系,相互独立,这样才是一个好的锁屏功能。既然是锁屏,那么这个任务栈有且只有这一个Activity。
我们很容易想到singleInstance属性了。
其次,这个Activity在最近打开的Activity中不能出现,也就是按住home键出现最近打开的Activity界面中不能有它。因为它是锁屏功能嘛,解锁之后肯定就不能再看到它。
最后,在Activity设置Window的Flags,一定要在setContentView之前设置。
假如我们的手机有锁屏功能,就是系统的那种锁屏,滑动图案解锁之类的,那么我们无法越过这个界面,只能在这个界面之上加入我们的Activity,加入这两个flag保证了Activity会出现在锁屏界面。
至此我们的锁屏后插屏功能已经实现。
要完全仿的话,它首先需要滑动finish功能,且不响应back键。
不响应back键容易,覆写onBackPressed()方法什么也不做。
滑动finish功能我们这里用到开源项目SwipeBackLayout,将Activity主题设置为透明,继承SwipeBackActivity即可。
android:windowIsTranslucent表示透明。
android:windowAnimationStyle表示动画,如果锁屏Activity关闭掉后,打开的是APP,可能会短暂黑屏,那么就是因为Activity关闭动画导致的,这种需求下,可以不加这个动画。如果打开的是主页面,不会出现这个问题。
在本文中我们使用开启一个Activity来充当锁屏界面。
实现步骤有以下两步:
一、后台开启一个Service,监听屏幕锁屏广播。
二、当屏幕熄灭,收到广播后,开启充当锁屏界面的Activity。
实现思路就是这么简单,但具体细节需要说说。
首先开启Service。
Intent service = new Intent(this, LockService.class); startService(service);
在Service监听屏幕锁屏广播。
public void onCreate() { receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == Intent.ACTION_SCREEN_OFF) { System.out.println("收到锁屏广播"); Intent lockscreen = new Intent(LockService.this, LockScreenActivity.class); lockscreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(lockscreen); } } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(receiver, filter); }
Intent.ACTION_SCREEN_OFF表示屏幕熄灭。
在广播onReceive()方法中,收到屏幕熄灭的广播后,开启充当锁屏界面的Activity,我们知道在Service中启动Activity需要添加一个标志位。
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
这样我们便实现了锁屏功能。
问题还没有结束。
首先开启的Activity我们最好把它设置在单独的一个任务栈中,它与当前APP的任务栈没有关系,相互独立,这样才是一个好的锁屏功能。既然是锁屏,那么这个任务栈有且只有这一个Activity。
我们很容易想到singleInstance属性了。
android:launchMode="singleInstance" android:taskAffinity="com.example.suoping.lockscreen"
其次,这个Activity在最近打开的Activity中不能出现,也就是按住home键出现最近打开的Activity界面中不能有它。因为它是锁屏功能嘛,解锁之后肯定就不能再看到它。
android:excludeFromRecents="true"
最后,在Activity设置Window的Flags,一定要在setContentView之前设置。
this.getWindow().addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
假如我们的手机有锁屏功能,就是系统的那种锁屏,滑动图案解锁之类的,那么我们无法越过这个界面,只能在这个界面之上加入我们的Activity,加入这两个flag保证了Activity会出现在锁屏界面。
至此我们的锁屏后插屏功能已经实现。
要完全仿的话,它首先需要滑动finish功能,且不响应back键。
不响应back键容易,覆写onBackPressed()方法什么也不做。
@Override public void onBackPressed() { }
滑动finish功能我们这里用到开源项目SwipeBackLayout,将Activity主题设置为透明,继承SwipeBackActivity即可。
<style name="LockScreenBase" parent="android:Theme.Light.NoTitleBar.Fullscreen"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowAnimationStyle">@null</item> <item name="android:windowContentOverlay">@null</item> </style>
android:windowIsTranslucent表示透明。
android:windowAnimationStyle表示动画,如果锁屏Activity关闭掉后,打开的是APP,可能会短暂黑屏,那么就是因为Activity关闭动画导致的,这种需求下,可以不加这个动画。如果打开的是主页面,不会出现这个问题。
相关文章推荐
- Android app第三方支付宝支付接入教程
- android studio 快捷键及使用方法,快速掌握
- [Android] 提高ORMLite插入大量数据效率的解决方案
- Android Studio中使用 instrument junit4 环境配置问题
- Android 系统移植与调试(二)Android系统编译 amlogic RK 全志系统编译
- 详细解析RxAndroid的使用方式
- Android培训JAVA课堂重点内容汇总
- CopperDroid: Automatic Reconstruction of Android Malware Behaviors 阅读笔记
- RelativeLayout控件居中详细解析(可能是最完美的方法)
- android matrix 最全方法详解与进阶(完整篇)
- 通过Android JNI编程来学习三大结构的ARM汇编
- Android加载so库
- Android 自定义 Dialog 无法横向铺满屏幕
- 学习Android studio 日常总结
- Android开源益智游戏“斗地主”单机版源代码
- 文件的名字重复之后,svn不允许提交到服务器出现以下情况
- 跑马灯无效果问题(TextView隐藏和显示后无效果)
- Android 进程使用 Messenger 通信
- Android Tips 8
- Android--手机一键Root原理分析