我正在尝试为平板电脑创建一个提醒应用。 我的问题是,如果平板电脑处于睡眠模式,则不会调用警报。 我在github上尝试了很多项目,当我的平板电脑处于睡眠模式时,没有一个能够工作。
我的代码如下:
设置闹钟的代码:
Intent intent = new Intent(getApplicationContext(),RingAlarmReceiver.class);
Intent intent = new Intent("kidsplaylist.info.waketest.MyWakefulReceiver");
PendingIntent pIntent = PendingIntent.getBroadcast(getApplicationContext(),0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent);
接收者的代码:
public class MyWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
WakeLocker.acquire(context);
// Start the service, keeping the device awake while the service is
// launching. This is the Intent to deliver to the service.
Intent service = new Intent(context, MyIntentService.class);
startWakefulService(context, service);
}
}
应该响铃的服务代码:
public class MyIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
// Do the work that requires your app to keep the CPU running.
String song = Settings.System.DEFAULT_RINGTONE_URI.toString();
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(getApplicationContext(), Uri.parse(song));
mediaPlayer.prepare();
mediaPlayer.setLooping(false);
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
// Release the wake lock provided by the WakefulBroadcastReceiver.
MyWakefulReceiver.completeWakefulIntent(intent);
}
}
任何有这么厚的经验的人都可以告诉我如何解决它
非常感谢
阿维
P.B:当设备连接到充电器或屏幕打开时,它可以正常工作 问题是设备屏幕关闭时。
答案 0 :(得分:1)
请注意,在Android 6.0及更高版本中,Doze模式和应用待机状态会影响AlarmManager
个事件。
除此之外,使用IntentService
直接播放媒体也不会有效。一旦onHandleIntent()
返回,IntentService
将被销毁,您的流程通常会在此后不久终止。
我强烈建议你提出使用此媒体作为铃声的Notification
。这将完全消除对服务的需求(您可以在Notification
中提升onReceive()
,因为这应该相当快地执行)。它使用户可以更好地控制音乐是否播放(通过Android 5.0+上的Notification
控件),并为用户提供了一种直接关闭它的方式(轻扫Notification
)。
如果您坚持自己播放媒体,则需要使用常规Service
并管理自己的WakeLock
,这样您就可以在播放媒体时保留所有优秀内容。媒体完成后,使用OnCompletionListener
至stopSelf()
服务和release()
WakeLock
。