Android仿QQ实现锁屏消息提醒
龙旋
共 3957字,需浏览 8分钟
· 2021-10-28
今天带来的是,可以在锁屏下弹窗显示消息来提醒用户。
效果图:
适用应用场景
实现思路
在收到自己服务器的推送消息时,发送一条广播,在接收到指定广播之后在广播的onReceive()中判断当前屏幕是否处于关闭状态,如果处于关闭状态,则显示这个弹窗消息,反之,则不需要显示。
实现步骤
**
* 模拟推送,在退出APP后的一段时间发送消息
*/
/**
* 模仿推送,发消息
*/
private void sendMessage() {
new Thread(new Runnable() {
@Override
public 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";
@Override
public 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 {
@Override
protected 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
评论
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
2024跨屏营销指南
下载报告去公众号:硬核刘大 后台回复“ 跨屏营销”,即可下载完整PDF文件。更多报告内容,可加微信:chanpin628 领取。(ps:加过微信:yw5201a1 的不要再加,分享的内容一样,有一个号就行。)申明:报告版权 勾正科技&MMA
产品刘
0
字节面试:如何解决MQ消息积压问题?
面试题大全:www.javacn.siteMQ(Message Queue)消息积压问题指的是在消息队列中累积了大量未处理的消息,导致消息队列中的消息积压严重,超出系统处理能力,影响系统性能和稳定性的现象。1.消息积压是哪个环节的问题?MQ 执行有三大阶段:消息生产阶段。消息存储阶段。消息消费阶段。
Java中文社群
0
屏论丨“重温经典”频道走红背后的危与机
屏论今年2月1日,“重温经典”频道正式开播,作为免费向观众提供应看爱看、脍炙人口的经典内容的公益性频道,“重温经典”频道对于“双治理”背景下正在进行电视公共服务属性与商业属性新一轮沉淀的电视大屏而言,意义重要而特殊。从频道开播以来的实际表现来看,的确亮眼。比如春节期间,“重温经典”频道在21个地区收
流媒体网
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
是谁还在坚持用 QQ?腾讯回应:好冷漠...
转自:电脑报近日,“仍有5亿人坚持用QQ”的话题登上微博热搜,引发网友热议。根据腾讯财报,截至2023年第三季度,QQ智能终端月活跃用户数为5.58亿,仅占微信四成。但换个角度看,作为一款25岁的元老级社交应用,QQ破5亿的月活仍然是很多社交App羡慕的存在,超过了微博和知乎总和。只是在用户增量上,
dotNET全栈开发
10
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2