最近做项目,为了让订单信息及时得到反馈,所以要求在锁屏状态收到推送消息时,唤起屏幕显示消息。经参考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