Android通知欄前台服務


一、前台服務的簡單介紹

前台服務是那些被認為用戶知道且在系統內存不足的時候不允許系統殺死的服務。前台服務必須給狀態欄提供一個通知,它被放到正在運行(Ongoing)標題之下——這就意味着通知只有在這個服務被終止或從前台主動移除通知后才能被解除。

最常見的表現形式就是音樂播放服務,應用程序后台運行時,用戶可以通過通知欄,知道當前播放內容,並進行暫停、繼續、切歌等相關操作。

二、為什么使用前台服務

后台運行的Service系統優先級相對較低,當系統內存不足時,在后台運行的Service就有可能被回收,為了保持后台服務的正常運行及相關操作,可以選擇將需要保持運行的Service設置為前台服務,從而使APP長時間處於后台或者關閉(進程未被清理)時,服務能夠保持工作。

三、前台服務的詳細使用

  1. 創建服務內容,如下(四大組件不要忘記清單文件進行注冊,否則啟動會找不到服務);
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();
    }
    
}
  1. 創建服務通知內容,例如音樂播放,藍牙設備正在連接等:
/**
 * 創建服務通知
 */
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();
}
  1. 啟動服務時,創建通知:
@Override
public void onCreate() {
    super.onCreate();
    Log.e(TAG, "onCreate");
    // 獲取服務通知
    Notification notification = createForegroundNotification();
    //將服務置於啟動狀態 ,NOTIFICATION_ID指的是創建的通知的ID
    startForeground(NOTIFICATION_ID, notification);
}
  1. 停止服務時,移除通知:
@Override
public void onDestroy() {
    Log.e(TAG, "onDestroy");
    // 標記服務關閉
    ForegroundService.serviceIsLive = false;
    // 移除通知
    stopForeground(true);
    super.onDestroy();
}
  1. 判斷服務是否啟動及獲取傳遞信息:
@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。

服務創建完畢,接下來就可以進行服務的啟動了,啟動前不要忘記在清單文件中進行前台服務權限的添加:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  1. 服務的啟動和停止
//啟動服務
if (!ForegroundService.serviceIsLive) {
    // Android 8.0使用startForegroundService在前台啟動新服務
    mForegroundService = new Intent(this, ForegroundService.class);
    mForegroundService.putExtra("Foreground", "This is a foreground service.");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(mForegroundService);
    } else {
        startService(mForegroundService);
    }
} else {
    Toast.makeText(this, "前台服務正在運行中...", Toast.LENGTH_SHORT).show();
}
//停止服務
mForegroundService = new Intent(this, ForegroundService.class);
stopService(mForegroundService);

關於前台服務的介紹及使用就到這里了,相關使用已上傳至Github開發記錄,歡迎點擊查閱及Star,我也會繼續補充其它有用的知識及例子在項目上。

歡迎點贊、評論,你們的贊同和鼓勵是我寫作的最大動力!

歡迎關注公眾號:幾圈年輪,查看更多有趣的技術、工具、閑言、資源。
公眾號.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM