2011-11-21 28 views
3

我開發了一個應用程序,啓動一個自定義服務,啓動一個倒計時器。該服務在計時器的開始和結束時的其他時間運行通知。 在測試過程中,我看到有關通知和鎖定屏幕的問題。我描述了我所做的測試:安卓鎖定設備通知不聽起來

1)如果我運行該應用程序,並且不讓手機關閉或鎖定,則該服務將正確播放通知聲音,就好像主應用程序(活動)在前面一樣。在這兩種情況下,服務都會完美地發出通知。

2)如果我鎖定了手機,並且應用程序在鎖定之前位於前面,則該服務會正確播放通知聲音。

3)這裏是我的問題:如果我鎖定手機,並且在鎖定之前應用程序沒有在前面,通知不會響起,但服務看起來像正在運行,因爲當我按下「on」按鈕時我的手機,然後在屏幕打開之後連續播放,它會播放通知(聲音和圖標),只需在鎖定屏幕中解鎖手機即可。

我的服務代碼將取消先前的通知,這是定時器運行後通知代碼結束:

private void notificacion_fin() { 
    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.cancel(0); 
    Notification not = new Notification(); 
    // Ponemos la nueva notificacion de que hemos acabado 
    SharedPreferences preferences = this.getSharedPreferences("com.fsp.mypref", 0); 
    String not_sound = preferences.getString("notification_tone",""); 
    not.audioStreamType = AudioManager.STREAM_NOTIFICATION; 
    not.sound = Uri.parse(not_sound); 
    if (tipo_cronometro == 1) { 
     not.icon = R.drawable.ic_stat_notify_time; 
     not.tickerText = "Task has finished"; 
    } else { 
     not.icon = R.drawable.ic_stat_notify_complete; 
     not.tickerText = "Type 2 task has finished"; 
    } 
    not.when = System.currentTimeMillis(); 
    not.defaults |= Notification.DEFAULT_VIBRATE; 
    not.vibrate = new long[] {300,300,300,300,300}; 
    not.flags |= Notification.FLAG_AUTO_CANCEL; 
    Intent notificationIntent = new Intent(this, MyActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
    not.setLatestEventInfo(this, "My app", not.tickerText, contentIntent); 
    notificationManager.notify(0, not); 
    notificacion = true; 
} 

我懷疑我的問題可能是一些相對而言, 會這樣?有誰知道會發生什麼? 爲什麼我的第3次測試不能正確運行?
任何幫助將是很好的。
在此先感謝。

P.S:當我說通知聲音我的意思是聲音+圖標

+0

可以使用desrcibe如何解決您的問題我也面臨同樣的問題...你可以發表你的正確的代碼 – user3233280

回答

1

好吧,只要你鎖定屏幕(一兩分鐘內,通常情況下)手機進入睡眠模式。你有三個選擇,其中兩個更好。

  1. 對您的服務使用startForeground。這樣,它將基本上在前面。但它仍然會受到睡眠模式的影響。
  2. 使用WAKE_LOCK - 這是我最喜歡的選項,但它需要應用程序的額外權限,這是無知的用戶通常無法理解的。
  3. 使用Alarm Manager設置鬧鐘 - 由於播放通知不需要花費時間,因此這可能是最好的方法,然後當鬧鈴觸發時會發出廣播,導致BroadcastReceiver發出通知聲音。

如果你需要一個可視倒數計時器,那麼也運行該服務,但不要依賴服務保持喚醒而不使用WAKE_LOCK。如果用戶手機壞了,或者嘗試使用太多內存的應用程序,服務也可能被破壞 - 我的手機可能會因爲我的手機太爛而殺死它。

我喜歡喚醒鎖,但報警管理器可能是最好的方法。

而且Context將保持不變,不管手機是醒着還是睡着。上下文基於正在運行的進程/類/代碼塊。如果上下文導致問題,我希望它會拋出異常並強制關閉。

+0

我正在調查wake_lock,這對我來說更容易。如果我這樣做,我必須在我的通知之前放置wakeLock.acquire,在我的例程中第一行,並在最後一行wakeLock.release()?或者我必須做到與衆不同?此外,wakeLock.acquire()是否會打開屏幕,還是隻在屏幕先前打開時纔會運行,以便不會關閉?我的目的是什麼是四旗中最好的?謝謝 – Tibor

+0

你想要一個可以在屏幕上打開或關閉的部分喚醒鎖。它只是讓CPU保持清醒。您將在服務創建時獲得並在服務的銷售中發佈。 – Jakar

+0

謝謝。我已經用這個解決方案解決了這個問題 – Tibor