关闭

android开发技巧——仿新版QQ锁屏下弹窗

标签: 锁屏弹窗仿QQ仿QQ弹窗
25071人阅读 评论(28) 收藏 举报
分类:

新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能。经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意。

下面是实现过程。

1.使用Activity,而不是View

QQ的弹窗一开始我以为是悬浮View,用WindowManager去添加,但是无论如何就是不显示,后来在朋友提示下换成Activity来实现,在锁屏状态下就能弹窗了。

2.Activity的设置

Activity需要进行以下设置,才可以在锁屏状态下弹窗。
首先是onCreate方法,需要添加4个标志,如下:
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Window win = getWindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        // 自己的代码
    }

四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕。这样当Activity启动的时候,它会解锁并亮屏显示。
然后在AndroidManifest.xml文件当中,对该activity的声明需要加上以下属性:
        <activity android:name=".alarm.AlarmHandlerActivity"
                  android:launchMode="singleInstance"
                  android:excludeFromRecents="true"
                  android:taskAffinity=""
                  android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>

而对于布局文件,要显示的view居中,背景透明。由于上面已经设置了背景为壁纸的背景,所以显示的是桌面的背景。如果背景设为默认的白色,则导致弹窗后面是一片白色,看起来很丑。如果背景设置为透明,则弹窗后面会显示出解锁后的界面(即使有锁屏密码,也是会显示解锁后的界面的),一样很影响视觉效果。

3.在广播中启动锁屏弹窗

我们设置的是锁屏下才弹窗的,非锁屏下就不适合弹出这个窗口了(你可以试一下,效果会很怪)。一般是注册一个广播接收器,在接收到指定广播之后判断是否需要弹窗,所以在BroadcastReceiver的接收代码中需要先判断是否为锁屏状态下:
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(LOG_TAG, intent.getAction());
        KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        if (km.inKeyguardRestrictedInputMode()) {
            Intent alarmIntent = new Intent(context, AlarmActivity.class);
            alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(alarmIntent);
        }
    }

这里用到的是KeyguardManager类,用来管理锁屏的,4.1之后该类的API新增了一个isKeyguardLocked()的方法判断是否锁屏,但在4.1之前,我们只能用inKeyguardRestrictedInputMode()方法,如果为true,即为锁屏状态。需要注意的是,在广播中启动Activity的context可能不是Activity对象,所以需要添加NEW_TASK的标志,否则启动时可能会报错。

4.更新弹窗信息

如果弹窗Activity本身并不主动更新信息,当有新的信息来时需要更新Activity的界面,由于在上面我们设的是singleInstance启动模式,所以需要覆写onNewIntent(Intent intent)方法,这样当再次启动这个activity时,新的intent会在该方法中传入。

5.再次亮起屏幕

如果该Activity并未退出,但是被手动按了锁屏键,当前面的广播接收器再次去启动它的时候,屏幕并不会被唤起,所以我们需要在activity当中添加唤醒屏幕的代码,这里用的是电源锁。可以添加在onNewIntent(Intent intent),因为它会被调用。也可以添加在其他合适的生命周期方法。添加代码如下:
        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
        if (!pm.isScreenOn()) {
            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |
                    PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
            wl.acquire();
            wl.release();
        }

6.一些权限

下面是实现过程中需要的一些权限,由于我是从项目代码中抽取出来的,难免多加或遗漏,开发者自己注意一下:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

第一条是解锁屏幕需要的,第二条是申请电源锁需要的。

本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/40587935

参考资料:
http://bbs.csdn.net/topics/390425777 CSDN论坛帖子 发帖人: JJMM2009
android api 文档。
9
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android下屏幕锁屏弹窗的正确姿势

最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我在这里进行整理总结。本文将从以下两点对屏幕锁屏进行解析: 1. 如何监听系统屏幕锁屏...
  • u012124438
  • u012124438
  • 2016-09-03 11:13
  • 6143

锁屏界面弹出视图实践---类似QQ锁屏界面弹出消息提示框

按一般思维理解手机锁屏了,手机窗体应该是处于非活动状态的。而视图的显示 必须依赖活动的窗体。然而在使用市面应用的时候,很多应用却都可以再锁屏界面上活动自己的视图------比如QQ在锁屏时有消息到达,...
  • killer991684069
  • killer991684069
  • 2016-11-09 10:06
  • 1027

Android锁屏状态下弹出activity

Android在有些情况下需要较强的提示,这里仅仅使用通知栏是不够,例如:来电、闹钟。要在特定的情况下唤醒屏幕,设置是在锁屏的情况下。 我们现在的这个项目就有这个需求,其实解决起来很简单,只要在act...
  • u014544193
  • u014544193
  • 2016-01-25 15:50
  • 2066

KeyguardManager简介

android.app.KeyguardManager类用于对Keyguard进行管理,即对锁屏进行管理 Class Overview Class that can be used to ...
  • hudashi
  • hudashi
  • 2011-12-15 11:25
  • 23042

Android 5.0 新技术研究-锁屏通知(一)

Android 5.0 新技术研究-锁屏通知(一)下面是几个相关部分:(1)通知Notification API NotificationManager–获取通知栏 NotificationManag...
  • u012562723
  • u012562723
  • 2016-05-03 11:45
  • 1465

android6.0锁屏界面接收新通知处理流程

android6.0锁屏界面接收新通知处理流程 灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进...
  • w690333243
  • w690333243
  • 2017-06-18 17:44
  • 1009

android锁屏状态下, 新消息唤醒屏幕,并跳转到指定页面

最近在做一个项目,有个功能,就和QQ电话差不多,我这边手机锁屏状态,当QQ电话过来时,立刻唤醒屏幕,并显示QQ来电界面,我的是当设备端有事件发生时通知app端弹出界面,实时显示设备端信息。 最核心的...
  • yang1159
  • yang1159
  • 2016-08-22 15:44
  • 6872

Android锁屏通知(activity实现)类似新版qq的锁屏消息提示

效果图: 1、在接收消息广播的onReceive里,跳转到你要显示的界面。如: Intent intent = new Intent(arg0,MainActivity.cla...
  • ATangSir
  • ATangSir
  • 2016-11-21 22:00
  • 643

Android Notification不显示浮动通知,不显示锁屏通知

问题不显示浮动通知,不显示锁屏通知。解决1. 首先手机得先开启权限应用详情 -> 自定义通知 -> 开启对应的权限2. 设置Notification的flagNotification的flag有5个。...
  • niubitianping
  • niubitianping
  • 2017-03-10 17:10
  • 4523

如何实现在锁屏上层显示Activity,如qq锁屏显示消息弹框

用过Android端手机QQ的用户都知道,qq锁屏显示消息弹框,类似这样通过获取最上层activity的命令adb shell dumpsys activity | findstr “mFocused...
  • halibobo1998
  • halibobo1998
  • 2016-02-02 15:22
  • 1796
    个人资料
    • 访问:2130794次
    • 积分:14236
    • 等级:
    • 排名:第1010名
    • 原创:139篇
    • 转载:0篇
    • 译文:89篇
    • 评论:891条
    欢迎访问我的博客
    个人博客:http://githang.com
    QQ群
    博客专栏
    最新评论
    我的公众号
    微信关注我的公众号
    站长统计