Android仿QQ锁屏状态下消息提醒(震动+提示音)
Android仿QQ锁屏状态下消息提醒(震动+提⽰⾳)导读:
最近在开发⼀个定时提醒业务,类似于闹钟,然后遇到了⼀个问题,当APP应⽤在后台运⾏时,⽤户关闭了⼿机屏幕(⼿机进⼊灭屏休眠状态),这个时候使⽤系统震动和闹钟没有起到作⽤。why? 同样是灭屏休眠状态,为什么QQ、等都可以有消息提醒,我的APP却不⾏呢,真是百思不得其,百度了⼀番才到解决⽅法。
解决思路:
1、APP应⽤退到后台,我们想继续做些什么,当然是使⽤Service服务了。
2、在Activity活动⾥定义⼀个⼴播接收器(BroadcastReceiver),⽤于接收Service服务的命令。
3、在Activity活动⾥添加标志位(必须添加),允许锁屏状态下显⽰消息(解锁屏幕)。
4、Service服务在需要给⽤户进⾏消息提醒时,向⼴播接收器发送命令,然后由⼴播接收器来执⾏即可。
具体步骤:
微博营销技巧
⼀、在MainActivity.class活动的onCreate()⽅法⾥添加标志位,代码如下:
@Override
protected void onCreate(Bundle 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 {
@Override
public void onReceive(Context context, Intent intent) {
/*------------这⾥是要在Activity活动⾥执⾏的代码----------*/
//⼿机震动
ToolUtils.playVibrate(MainActivity.this, true);
//播放系统默认闹钟铃声
ToolUtils.defaultAlarmMediaPlayer(MainActivity.this);
/*------------这⾥是要在Activity活动⾥执⾏的代码----------*/
}
}
这⾥提供⼀下ToolUtils.java⼯具类⾥的震动和闹铃代码:
package com.xiao7.pump.Utils;
qq号注销
安徽高考时间2022具体时间表
import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
t.Context;
dia.AudioAttributes;
dia.Ringtone;
dia.RingtoneManager;
import android.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;
/**
* 唤醒⼿机屏幕并解锁
*
q名字
* @param context
*/
@SuppressLint("InvalidWakeLockTag")
public static void acquire(Context context) {
try {
/
/获取电源管理器对象
PowerManager pm = (PowerManager) SystemService(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) {好用的美白保湿面膜
}
KeyguardManager km = (KeyguardManager) SystemService(Context.KEYGUARD_SERVICE);
//这⾥参数”unLock”作为调试时LogCat中的Tag
KeyguardManager.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) SystemService(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 = DefaultUri(RingtoneManager.TYPE_NOTIFICATION);            Ringtone r = Ringtone(mContext, notification);
r.play();
} catch (Exception ex) {
}
}
/**
* 播放系统默认来电铃声
*
* @return MediaPlayer对象
* @throws Exception
*/
public static void defaultCallMediaPlayer(Context mContext) {
try {
Uri notification = DefaultUri(RingtoneManager.TYPE_RINGTONE);
Ringtone r = Ringtone(mContext, notification);
r.play();
} catch (Exception ex) {
}
}
/**
* 播放系统默认闹钟铃声
*
* @return MediaPlayer对象
* @throws Exception
*/
public static void defaultAlarmMediaPlayer(Context mContext) {
try {
Uri notification = DefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone r = Ringtone(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;
@Override
protected void onCreate(Bundle 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()启动服务时的回调
*/
@Override
public 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);
StartCommand(intent, flags, startId);
}
/**
* 通过bindService()绑定到服务的客户端
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。