2016-02-16 15 views
1

這是一個known bug用於保持NotificationListenerService存活的解決方法

NotificationListenerService在應用程序更新期間被殺死,有時甚至是隨機的,並且不會自動重新啓動。此外,它甚至不能手動啓動,但我們必須提示用戶重啓設備,因爲該服務似乎只能在設備啓動時啓動。

下不起作用(試圖手動啓動該服務):

startService(new Intent(this, NotificationService.class)); 

是否有此任何變通辦法?我需要服務不斷運行並獲取OnNotificationPosted事件。

+0

嘿Aditya,你找到了解決方法嗎? 我曾想過要求用戶禁用電池優化,並將其轉變爲前臺服務。我還沒有嘗試過。 – geecko

回答

0

這可能無法完全解決您的問題,但它可能有助於服務被隨機殺死。我有一個與my own app類似的問題。儘管我以另一種方式解決了這個問題,但我發現了前臺服務。

顯然,Android殺死您的通知服務以節省內存,並解釋看似隨機殺死。

要解決此問題,您可以使用不會被Android終止的前臺服務,並且服務將始終運行。見Running a Service on Foreground

+0

操作系統負責啓動服務。我們所能做的只是添加一個意圖過濾器,並要求用戶爲我們的應用啓用「通知訪問」。我們不應該(也不能)直接啓動或停止擴展[NotificationListenerService](http://developer.android.com/reference/android/service/notification/NotificationListenerService.html)的服務。 –

0

你試過設置START_STICKY
關於它的更多信息:https://developer.android.com/reference/android/app/Service.html#START_STICKY

可能是我的答案也可以幫助你。請看看 https://stackoverflow.com/a/35435065/1554094

+0

操作系統負責啓動服務。我們所能做的只是添加一個意圖過濾器,並要求用戶爲我們的應用啓用「通知訪問」。我們不應該(也不能)直接啓動或停止擴展[NotificationListenerService](http://developer.android.com/reference/android/service/notification/NotificationListenerService.html)的服務。它由Android自動啓動。使用startService()或stopService()不起作用。 –

0

試試這個代碼來手動禁用&重新啓用該服務

private void toggleNotificationListenerService() { 
    PackageManager pm = getPackageManager(); 

    pm.setComponentEnabledSetting(new ComponentName(this, your.NotificationListenerServiceImpl.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
    pm.setComponentEnabledSetting(new ComponentName(this, your.NotificationListenerServiceImpl.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 
} 

你能趕上廣播Intent.ACTION_PACKAGE_CHANGED當服務被停用,就知道了。

而且您可以使用此代碼來檢查您的通知服務是否已啓用。

private static boolean isNotificationListenerServiceEnabled(Context context) { 
    Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(context); 
    if (packageNames.contains(context.getPackageName())) { 
     return true; 
    } 
    return false; 
} 
相關問題