他們是以什麼方式將服務作爲前臺服務啓動並在活動可見時隱藏通知?當活動可見時隱藏前臺服務的通知
考慮一個音樂播放器,當應用程序打開時,您不需要通知(即按鈕),但每當音樂播放器在後臺時,都應顯示通知。
我知道如何做到這一點,如果我不在前臺運行我的服務......但是當在前臺運行時,服務本身需要通知並顯示它,我無法自己管理通知...
我該如何解決這個問題?
他們是以什麼方式將服務作爲前臺服務啓動並在活動可見時隱藏通知?當活動可見時隱藏前臺服務的通知
考慮一個音樂播放器,當應用程序打開時,您不需要通知(即按鈕),但每當音樂播放器在後臺時,都應顯示通知。
我知道如何做到這一點,如果我不在前臺運行我的服務......但是當在前臺運行時,服務本身需要通知並顯示它,我無法自己管理通知...
我該如何解決這個問題?
你可以這樣做。此方法的一個先決條件是,您的活動必須綁定該服務。
首先你啓動服務前臺。
private Notification mNotification;
public void onCreate() {
...
startForeground(1, mNotification);
}
然後在您的活動中,您綁定和解除綁定服務,如下所示。 BIND_ADJUST_WITH_ACTIVITY
對於保持服務在綁定到可見活動時保持活動非常重要。
public void onStart() {
...
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}
public void onStop() {
...
unbindService(mConnection);
}
現在這是最後一個過去。當至少有一個客戶端連接到該服務時,您停止前臺,並在最後一個客戶端斷開連接時開始前臺。
@Override
public void onRebind(Intent intent) {
stopForeground(true); // <- remove notification
}
@Override
public IBinder onBind(Intent intent) {
stopForeground(true); // <- remove notification
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
startForeground(1, mNotification); // <- show notification again
return true; // <- important to trigger future onRebind()
}
綁定服務時,必須考慮Android應用的規則。如果綁定未啓動的服務,則除非BIND_ADJUST_WITH_ACTIVITY
標誌指定了BIND_AUTO_CREATE
標誌,否則該服務不會自動啓動。
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE
| BIND_ADJUST_WITH_ACTIVITY);
如果服務已啓動與自動創建標記,並且最後一個客戶端,然後解除綁定服務將自動停止。如果你想保持服務運行,你必須用startService()
方法啓動它。基本上,您的代碼將如下所示。
Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
調用startService()
對於已經啓動的服務上有沒有影響,因爲我們不會覆蓋onCommand()
方法。
使用以下步驟:
1.使用ActivityManager獲得當前包名稱(即活動運行在頂部)。
2.檢查如果您的應用程序則沒有顯示通知
3.else如果不是您的應用程序則顯示通知。
ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1);
String topActivityName = tasks.get(0).topActivity.getPackageName();
if(!(topActivityName.equalsIgnoreCase("your package name"))){
//enter notification code here
}
似乎做我想要的...只有一個缺點,我必須在我真正需要它之前啓動服務... – prom85
剛剛完成實施。它應該運作良好。答案已更新。 –
我之前嘗試過,沒有完美工作...我會檢查更改並再次看看它...順便說一句,沒有綁定服務和發送意圖的活動onPause/onResume改變服務的前臺狀態將無法正常工作,因爲該服務可能會被殺害,而活動是積極的?這真的可以發生嗎?或者這也可以工作? – prom85