导读:

最近在开发一个定时提醒业务,类似于闹钟,然后遇到了一个问题,当APP应用在后台运行时,用户关闭了手机屏幕(手机进入灭屏休眠状态),这个时候使用系统震动和闹钟没有起到作用。why? 同样是灭屏休眠状态,为什么QQ、微信等都可以有消息提醒,我的APP却不行呢,真是百思不得其姐,百度了一番才找到解决方法。

解决思路:

1、APP应用退到后台,我们想继续做些什么,当然是使用Service服务了。

2、在Activity活动里定义一个广播接收器(BroadcastReceiver),用于接收Service服务的命令。

3、在Activity活动里添加标志位(必须添加),允许锁屏状态下显示消息(解锁屏幕)。

4、Service服务在需要给用户进行消息提醒时,向广播接收器发送命令,然后由广播接收器来执行即可。

具体步骤:

一、在MainActivity.class活动的onCreate()方法里添加标志位,代码如下:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 添加标志位,允许锁屏状态下显示消息,四个标志位分别是:*  1.锁屏状态下显示*  2.解锁*  3.保持屏幕长亮(可选)*  4.打开屏幕* 当Activity启动的时候,它会解锁并亮屏显示*/getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //锁屏状态下显示| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解锁| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持屏幕长亮| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //打开屏幕}

二、在MainActivity.class活动里定义一个内部类广播接收器,代码如下:

    /*** 定义广播接收器,用于执行Service服务的需求(内部类)*/private class ServiceNeedBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {/*------------这里是要在Activity活动里执行的代码----------*///手机震动ToolUtils.playVibrate(MainActivity.this, true);//播放系统默认闹钟铃声ToolUtils.defaultAlarmMediaPlayer(MainActivity.this);           /*------------这里是要在Activity活动里执行的代码----------*/}}

这里提供一下ToolUtils.java工具类里的震动和闹铃代码:

package com.xiao7.pump.Utils;import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.os.Vibrator;public class ToolUtils {private static Vibrator vibrator;private static PowerManager.WakeLock wakeLock;/*** 唤醒手机屏幕并解锁** @param context*/@SuppressLint("InvalidWakeLockTag")public static void acquire(Context context) {try {//获取电源管理器对象PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);//获取PowerManager.WakeLock对象wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");//点亮屏幕30秒wakeLock.acquire(30 * 1000);//灭屏(释放锁)if (null != wakeLock) {wakeLock.release();}KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);//这里参数”unLock”作为调试时LogCat中的TagKeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");//解锁kl.disableKeyguard();} catch (Exception ex) {}}/*** 手机震动** @param context* @param isRepeat 是否重复震动*/public static void playVibrate(Context context, boolean isRepeat) {/** 设置震动,用一个long的数组来表示震动状态(以毫秒为单位)* 如果要设置先震动1秒,然后停止0.5秒,再震动2秒则可设置数组为:long[]{1000, 500, 2000}。* 别忘了在AndroidManifest配置文件中申请震动的权限*/try {vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);long[] patern = new long[]{1000, 500, 2000};AudioAttributes audioAttributes = null;/*** 适配android7.0以上版本的震动* 说明:如果发现5.0或6.0版本在app退到后台之后也无法震动,那么只需要改下方的Build.VERSION_CODES.N版本号即可*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {audioAttributes = new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).setUsage(AudioAttributes.USAGE_ALARM) //key.build();vibrator.vibrate(patern, isRepeat ? 1 : -1, audioAttributes);}else {vibrator.vibrate(patern, isRepeat ? 1 : -1);}} catch (Exception ex) {}}/*** 关闭震动*/public static void closeVibrate() {if (vibrator != null) {vibrator.cancel();vibrator = null;}}/*** 播放系统默认提示音** @return MediaPlayer对象* @throws Exception*/public static void defaultMediaPlayer(Context mContext) {try {Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);Ringtone r = RingtoneManager.getRingtone(mContext, notification);r.play();} catch (Exception ex) {}}/*** 播放系统默认来电铃声** @return MediaPlayer对象* @throws Exception*/public static void defaultCallMediaPlayer(Context mContext) {try {Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);Ringtone r = RingtoneManager.getRingtone(mContext, notification);r.play();} catch (Exception ex) {}}/*** 播放系统默认闹钟铃声** @return MediaPlayer对象* @throws Exception*/public static void defaultAlarmMediaPlayer(Context mContext) {try {Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);Ringtone r = RingtoneManager.getRingtone(mContext, notification);r.play();} catch (Exception ex) {}}
}

三、在MainActivity.class活动的onCreate()方法里注册广播实例,代码如下:

public class MainActivity extends AppCompatActivity {//声明一个操作常量字符串public static final String ACTION_SERVICE_NEED = "action.ServiceNeed";//声明一个内部广播实例public ServiceNeedBroadcastReceiver broadcastReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 添加标志位,允许锁屏状态下显示消息,四个标志位分别是:*  1.锁屏状态下显示*  2.解锁*  3.保持屏幕长亮(可选)*  4.打开屏幕* 当Activity启动的时候,它会解锁并亮屏显示*/getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //锁屏状态下显示| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解锁| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持屏幕长亮| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //打开屏幕/*** 注册广播实例(在初始化的时候)*/IntentFilter filter = new IntentFilter();//给意图过虑器增加一个Action(用来区分广播来源,相当于是广播的身份证)filter.addAction(ACTION_SERVICE_NEED);broadcastReceiver = new ServiceNeedBroadcastReceiver();registerReceiver(broadcastReceiver, filter);
}

四、Service服务里给广播接口器发送指令(关于Service服务的用法,我就直接省略了,不懂的可以看我其他的博文),代码如下:

public class taskService extends Service {/*** 调用startService()启动服务时的回调*/@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {/在Service服务类中发送广播消息给Activity活动界面Intent intentBroadcastReceiver = new Intent();//设置意图过虑器Action(用来区分广播来源,相当于是广播的身份证)intentBroadcastReceiver.setAction(MainActivity.ACTION_SERVICE_NEED);//添加NEW_TASK标志位(必须加这个,否则不能在锁屏下实现消息提醒)intentBroadcastReceiver.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//发送无序广播sendBroadcast(intentBroadcastReceiver);return super.onStartCommand(intent, flags, startId);}/*** 通过bindService()绑定到服务的客户端*/@Overridepublic IBinder onBind(Intent intent) {return null;}
}

Android仿QQ锁屏状态下消息提醒(震动+提示音)相关推荐

  1. 游戏陪玩平台源码开发,锁屏状态下消息提醒的实现

    当游戏陪玩平台源码在后台运行时,如果用户关闭了手机屏幕(手机进入灭屏休眠状态),这个时候有消息进来怎么办?这就需要在游戏陪玩平台源码开发时实现手机锁屏状态下消息提醒功能. 解决思路: 1.游戏陪玩平台 ...

  2. android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Windo ...

  3. android shell检查是否锁屏_锁屏状态下的华为手机不显示消息?这样设置!

    点击蓝字关注我们 最近两天同事小张总是一副闷闷不乐的样子,小编琢磨着,刚过完情人节,这状态不对呀. 后来一问才知道,原来是小张晚上打游戏,女朋友微信找他,小张没看到,所以俩人就吵了起来.果然,男人们都 ...

  4. android 锁屏界面弹出qq,Android锁屏状态下弹出activity,如新版qq的锁屏消息提示

    Android锁屏状态下弹出activity,如新版qq的锁屏消息提示 发布时间:2020-06-26 21:27:13 来源:51CTO 阅读:1643 作者:lp5345 在接收消息广播的onRe ...

  5. Android锁屏状态下点亮屏幕并弹窗提醒

    类似于手机锁屏状态下QQ来消息然后点亮屏幕并弹窗,如图. 相信QQ的这个功能大家都是很熟悉的了,下面就开始讲具体的实现步骤. 一.新建一个Activity并在OnCreate中添加四个标识 @Over ...

  6. Android锁屏状态下信息的显示

    Android窗口的显示很简单,但很多人不知道锁屏状态下窗口的显示,今天就来展示一下. 先上QQ的效果图 1:显示 就一句代码,在需要显示的Activity中onCreate方法中加入 this.ge ...

  7. 安卓开发--关于锁屏状态下如何实现消息推送

    安卓开发–关于锁屏状态下如何实现消息推送 1. 新建一个AlarmHandlerActivity并设置在锁屏状态下弹窗! onCreate方法中添加标志: /* * 分别是锁屏状态下显示,解锁,保持屏 ...

  8. Android 锁屏状态下启动应用很慢的原因分析

    最近在工作中遇到一个需求就是,在锁屏状态下直接拨打电话,功能实现之后测试给的反馈是操作之后到电话拨出的时间太长(大概5秒).希望能优化一下.后来经过分析确定不是应用层的问题.然后就一顿百度.Googl ...

  9. Android锁屏状态下service不能正常工作的探究

    理想情况下例如音乐播放等service在锁屏状态下都是可以正常播放的. 最近在用android5.0做开发,写了蓝牙4.0的服务和socket的网络请求服务,需求是每隔一段时间自动查询服务器数据,如果 ...

最新文章

  1. Java Spring MVC项目搭建(三)——“Hello World”
  2. 某宝千万级规模高性能、高并发的网络架构
  3. ejb java bean的区别_关于ejb:Bean,Java Bean和Enterprise Java Bean之间的区别
  4. AudioRecorder 录音相关的处理流程
  5. python解决问题asp_用python实现面向对像的ASP程序实例
  6. 微服务中集成分布式配置中心 Apollo
  7. PP视频怎么设置文件的缓存路径
  8. java中对象清空值_对象的引用和清除_Java语言程
  9. Spring入门学习手册 2:怎么用注解来DI/IOC
  10. java response cookie_JavaWeb部分 (Response Cookie)
  11. 取代树莓派,这 9 款系统基础芯片跃跃欲试!
  12. 机器学习代码实战——线性回归(多变量)(Linear Regression)
  13. varnish运行机制及管理优化
  14. 设置notepad++背景护眼色
  15. Microsoft edge升级之后收藏夹内容丢失_等了这么久,Edge 终于成为我的默认浏览器...
  16. MySQL基础 + 34道练习 +Mysql高级 + sql优化
  17. [导入]【沈殿霞张曼玉经典爆笑鬼片】《双肥临门》【国语DVD中字】
  18. 标准模板库(STL)介绍
  19. Label Matching Semi-Supervised Object Detection
  20. Altium Designer-集成库制作

热门文章

  1. 单身的我写了一个七夕表白程序
  2. 名帖296 傅山 行书《行书帖选》
  3. OSRM开源地图导航引擎介绍一
  4. ICEM-圆柱与长方体相切
  5. 蝴蝶影视服务器响应异常,elasticsearch的服务器响应异常及解决策略(转)
  6. 福岛第1核电站2号3号反应堆辐射量急剧上升
  7. python 使用精灵代理
  8. linux开源项目github,GitHub 上的优质 Linux 开源项目,真滴牛逼!
  9. 安卓开发实战讲解!Android开发了解这些自然无惧面试,终局之战
  10. JAVAWeb开发:Tomcat出现The origin server did not find a current representation for the target reso...的问题