Android仿QQ实现锁屏消息提醒
今天带来的是,可以在锁屏下弹窗显示消息来提醒用户。
效果图:

适用应用场景
实现思路
在收到自己服务器的推送消息时,发送一条广播,在接收到指定广播之后在广播的onReceive()中判断当前屏幕是否处于关闭状态,如果处于关闭状态,则显示这个弹窗消息,反之,则不需要显示。
实现步骤
*** 模拟推送,在退出APP后的一段时间发送消息*//*** 模仿推送,发消息*/private void sendMessage() {new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Intent intent = new Intent();intent.setAction("com.zx.lockscreenmsgdemo.LockScreenMsgReceiver");sendBroadcast(intent); //发送广播}}).start();}}
*** 监听锁屏消息的广播接收器*/public class LockScreenMsgReceiver extends BroadcastReceiver {private static final String TAG = "LockScreenMsgReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "onReceive:收到了锁屏消息 ");String action = intent.getAction();if (action.equals("com.zx.lockscreenmsgdemo.LockScreenMsgReceiver")) {//管理锁屏的一个服务KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);String text = km.inKeyguardRestrictedInputMode() ? "锁屏了" : "屏幕亮着的";Log.i(TAG, "text: " + text);if (km.inKeyguardRestrictedInputMode()) {Log.i(TAG, "onReceive:锁屏了 ");//判断是否锁屏Intent alarmIntent = new Intent(context, MessageActivity.class);//在广播中启动Activity的context可能不是Activity对象,所以需要添加NEW_TASK的标志,否则启动时可能会报错。alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(alarmIntent); //启动显示锁屏消息的activity}}}}
- KeyguardManager类,用来管理锁屏的,4.1之后该类的API新增了一个isKeyguardLocked()的方法判断是否锁屏,但在4.1之前,我们只能用inKeyguardRestrictedInputMode()方法,如果为true,即为锁屏状态。 
- 在广播中启动Activity的context可能不是Activity对象,有可能是Service或者其他BroadcastReceiver,所以需要添加NEW_TASK的标志,否则启动时会报错。 
QQ的弹窗一开始我以为是悬浮View,用WindowManager去添加,后来尝试,查阅资料之后才发现是一个Activity,只不过它的背景用的就是你手机的这个背景而已。
public class MessageActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("tag", "onCreate:启动了消息内容的activity ");//四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕。这样当Activity启动的时候,它会解锁并亮屏显示。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); //打开屏幕// Drawable wallPaper = WallpaperManager.getInstance( this).getDrawable();// win.setBackgroundDrawable(wallPaper);setContentView(R.layout.activity_message);}}
//先解锁系统自带锁屏服务,放在锁屏界面里面KeyguardManager keyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);keyguardManager.newKeyguardLock("").disableKeyguard(); //解锁//点击进入消息对应的页面mContext.startActivity(new Intent(mContext, DetailsActivity.class));finish();
android:name=".activity.MessageActivity"android:excludeFromRecents="true"android:launchMode="singleInstance"android:taskAffinity="" />
https://github.com/zhouxu88/LockScreenMsgDemo
评论
