唤醒lockingandroid服务重复

我有这个应用程序需要运行一个服务(背景),周期性地发出嘟嘟声。 手机需要每隔一分钟哔一声,持续5秒钟(在服务中使用一个处理程序)。 我已经实现了这个完美的服务,但是当手机进入深度睡眠模式时,这个处理程序的执行停止。 在这个问题中使用这个答案,我设法使用唤醒锁,它工作正常。 但是,当我明确地把手机置于深度睡眠模式时,处理程序停止执行。 我在哪里放置唤醒服务。 下面的代码片段。

public class PlaySound extends Service{ PowerManager.WakeLock wl ; PowerManager pm; private SoundManager mSoundManager; boolean wakeUpFlag = false; @Override public void onCreate(){ super.onCreate(); mSoundManager = new SoundManager(); mSoundManager.initSounds(getBaseContext()); mSoundManager.addSound(1, R.raw.sound); } @Override public int onStartCommand(Intent intent, int flags, int startId) { startservice(); return START_STICKY; } private void startservice() { System.out.println("Started the service"); timer.scheduleAtFixedRate( new TimerTask() { public void run() { toastHandler.sendEmptyMessage(0); } }, 0, 60000); } private final Handler toastHandler = new Handler() { @Override public void handleMessage(Message msg) { result =start(); System.out.println("result"+result); close(); } }; protected void close() { try { if(wakeUpFlag){ wl.release(); System.out.println("Released the wakelock"); } if(!pm.isScreenOn()){ System.out.println("Screen is off - back to sleep"); pm.goToSleep(1000); } else{ System.out.println("Screen is on - no need to sleep"); } bs.close(); writer.close(); System.out.println("Closed socket and writer"); System.out.println("Size of file:"+f.length()/1024); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } public void start(){ try{ wakeUpFlag = false; pm = (PowerManager)getSystemService(Context.POWER_SERVICE); if(!pm.isScreenOn()) { wakeUpFlag = true; wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"CollectData"); System.out.println("Screen off - wake lock acquired"); wl.acquire(); } else{ System.out.println("Screen on - no need of wake lock"); } } catch(Exception e){ e.printStackTrace(); } mSoundManager.playSound(1); } 

Solutions Collecting From Web of "唤醒lockingandroid服务重复"

按照Mark Murphy提供的WakefulIntentService模式 。 我build议拿起他的书,不仅要详细解释这个课程,还要包括其中一个例子的例子,但是你会发现其中的大量信息。

我最近刚刚为我的主应用程序实现了这个模式,这个类就像一个魅力。

我不认为你正在使用正确的国旗accorinding的android文档fior PowerManager :

*如果持有部分唤醒锁,CPU将继续运行,不pipe任何定时器,甚至在用户按下电源button之后。 在所有其他唤醒锁中,CPU将运行,但用户仍然可以使用电源button使设备进入睡眠状态。

换句话说,尝试使用PARTIAL_WAKE_LOCK因为这是保证cpu运行的唯一一个

我想你最好使用android.app.AlarmManager来安排唤醒警报。 但是要小心 – 你不想在你的onReceive()方法中做任何长期的工作,就像在主线程中通常调用的那样,并且会挂起你的活动。 您仍然需要在任务期间获取唤醒锁,以防止电话中途中断。