Android 锁屏弹窗

最近做项目,为了让订单信息及时得到反馈,所以要求在锁屏状态收到推送消息时,唤起屏幕显示消息。经参考http://blog.csdn.net/maosidiaoxian/article/details/40587935完成该项功能。

首先,在应用界面发一条广播,模仿后台发出一条推送消息:

handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent=new Intent();
                intent.setAction("testScreenDown");
                sendBroadcast(intent);
            }
        },5*1000);

广播接受到消息处理(记得注册广播):

<span style="white-space:pre">	</span>//锁屏弹窗
        KeyguardManager km
                = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        //判断是否在锁屏状态
        if (km.inKeyguardRestrictedInputMode()) {
            Intent alarmIntent = new Intent(context, ScreenDownActivity.class);
            //从广播里跳转至activity,需要添加以下标志,不然会报错!
            alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(alarmIntent);
        }

这里用到一个KeyguardManager,锁屏与解锁的管理类,不过其有关解锁的内部类已经从api13开始废弃了:


可以看到,解锁与锁屏都可以用2个Flag代替,使用起来会更简单,待会用到。

继续,就要开始写锁屏时要弹出来的activity了,先注册:

 <!-- 锁屏弹窗界面-->
        <activity
            android:name=".activity.ScreenDownActivity"
            android:excludeFromRecents="true"
            android:launchMode="singleInstance"
            android:taskAffinity=""
            android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
            ></activity>

其中excludeFromRecents属性按照字母理解,就是让整个界面不出现在最近访问的历史中,主题设置很重要,该主题是让界面背景设置成当前手机的桌面背景,这样看起来就不会显得突兀了!

acitvity中代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_down);
        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);

        initViews();

    }

当中就用到之前提到的flag,另外提一下另一种方法唤醒(已过时,可以不用,了解一下):

 @Override
    protected void 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();
//        }
    }

最后附上效果图:


附加github地址:https://github.com/george-wind/ScreenDownWindow






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值