1. 程式人生 > >Android通知欄前臺服務

Android通知欄前臺服務

### 一、前臺服務的簡單介紹 > 前臺服務是那些被認為使用者知道且在系統記憶體不足的時候不允許系統殺死的服務。前臺服務必須給狀態列提供一個通知,它被放到正在執行(Ongoing)標題之下——這就意味著通知只有在這個服務被終止或從前臺主動移除通知後才能被解除。 最常見的表現形式就是**音樂播放服務**,應用程式後臺執行時,使用者可以通過通知欄,知道當前播放內容,並進行暫停、繼續、切歌等相關操作。 ### 二、為什麼使用前臺服務 > 後臺執行的Service系統優先順序相對較低,當系統記憶體不足時,在後臺執行的Service就有可能被回收,為了保持後臺服務的正常執行及相關操作,可以選擇將需要保持執行的Service設定為前臺服務,從而使APP長時間處於後臺或者關閉(程序未被清理)時,服務能夠保持工作。 ### 三、前臺服務的詳細使用 1. 建立服務內容,如下(四大元件不要忘記清單檔案進行註冊,否則啟動會找不到服務); ```java public class ForegroundService extends Service { private static final String TAG = ForegroundService.class.getSimpleName(); @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate"); } @Nullable @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind"); return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.e(TAG, "onDestroy"); super.onDestroy(); } } ``` 2. 建立服務通知內容,例如音樂播放,藍芽裝置正在連線等: ```java /** * 建立服務通知 */ private Notification createForegroundNotification() { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 唯一的通知通道的id. String notificationChannelId = "notification_channel_id_01"; // Android8.0以上的系統,新建訊息通道 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //使用者可見的通道名稱 String channelName = "Foreground Service Notification"; //通道的重要程度 int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId, channelName, importance); notificationChannel.setDescription("Channel description"); //LED燈 notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.RED); //震動 notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000}); notificationChannel.enableVibration(true); if (notificationManager != null) { notificationManager.createNotificationChannel(notificationChannel); } } NotificationCompat.Builder builder = new NotificationCompat.Builder(this, notificationChannelId); //通知小圖示 builder.setSmallIcon(R.drawable.ic_launcher); //通知標題 builder.setContentTitle("ContentTitle"); //通知內容 builder.setContentText("ContentText"); //設定通知顯示的時間 builder.setWhen(System.currentTimeMillis()); //設定啟動的內容 Intent activityIntent = new Intent(this, NotificationActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); //建立通知並返回 return builder.build(); } ``` 3. 啟動服務時,建立通知: ```java @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate"); // 獲取服務通知 Notification notification = createForegroundNotification(); //將服務置於啟動狀態 ,NOTIFICATION_ID指的是建立的通知的ID startForeground(NOTIFICATION_ID, notification); } ``` 4. 停止服務時,移除通知: ```java @Override public void onDestroy() { Log.e(TAG, "onDestroy"); // 標記服務關閉 ForegroundService.serviceIsLive = false; // 移除通知 stopForeground(true); super.onDestroy(); } ``` 5. 判斷服務是否啟動及獲取傳遞資訊: ```java @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand"); // 標記服務啟動 ForegroundService.serviceIsLive = true; // 資料獲取 String data = intent.getStringExtra("Foreground"); Toast.makeText(this, data, Toast.LENGTH_SHORT).show(); return super.onStartCommand(intent, flags, startId); } ``` 以上就是前臺服務的建立過程,相關注釋已經很明白了,具體使用可以檢視文末的Demo。 服務建立完畢,接下來就可以進行服務的啟動了,啟動前不要忘記在清單檔案中進行前臺服務許可權的新增: