While I was trying to create my tracking application in Android, I have noticed that application is getting killed, from time to time. After some research I have found this web site, which it seems that solved my problem, but please note that I am testing only on one device, since I am doing it for my self as a hobby.

First I have started empty activity.

Second I have added File -> New -> Service -> Service

Last one I have added File -> New -> Other -> Broadcast Receiver

In the manifest I added FOREGROUND_SERVICE permission:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
and android:process=":MyService". My Manifest looks like:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.milosev.myapplication">

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true" />

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"
            android:process=":MyService" />

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
In Gradle I added:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1"
So my gradle looks like:
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.milosev.myapplication"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.6.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1"
}
MyBroadcastReceiver.kt looks like:
package com.milosev.myapplication

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.milosev.getgpslocation.MyService

class MyBroadcastReceiver : BroadcastReceiver() {

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onReceive(context: Context, intent: Intent) {
        when (intent?.action) {
            "MyAction" -> {
                val myIntent = Intent(context, MainActivity::class.java).setAction("MyAction")
                LocalBroadcastManager.getInstance(context).sendBroadcast(myIntent)
            }
            "Restart" -> {
                val intent = Intent(context, MyService::class.java)
                intent.action = "startForeground"
                context.startForegroundService(intent)
            }
        }
    }
}
MyService.kt looks like:
package com.milosev.getgpslocation

import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.os.CountDownTimer
import android.os.IBinder
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import kotlinx.coroutines.*

class MyService : Service(),CoroutineScope by MainScope() {

    private var job: Job? = null

    override fun onBind(intent: Intent): IBinder {
        TODO("Return the communication channel to the service.")
    }

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        when (intent?.action) {
            "startForeground" -> {

                val channelId = createNotificationChannel("my_service", "My Background Service")
                val notificationBuilder = NotificationCompat.Builder(this, channelId)
                val notification = notificationBuilder.setOngoing(true)
                    .setContentTitle("test")
                    .setContentText("test")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setPriority(1)
                    .setCategory(Notification.CATEGORY_SERVICE)
                    .build()

                startForeground(101, notification)
                val context = this

                job = launch {
                    while(true) {
                        val myIntent = Intent(context, MyBroadcastReceiver::class.java).setAction("MyAction")
                        sendBroadcast(myIntent);
                        delay(1_000)
                    }
                }
            }
        }
        if (intent?.action.equals("stopForeground")) {
            job?.cancel()
            stopForeground(true)
            stopSelfResult(startId)
        }
        return START_STICKY;
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private fun createNotificationChannel(channelId: String, channelName: String): String {
        val chan = NotificationChannel(
            channelId,
            channelName, NotificationManager.IMPORTANCE_LOW
        )
        chan.lightColor = Color.RED
        chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
        val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        service.createNotificationChannel(chan)
        return channelId
    }

    override fun onDestroy() {
        super.onDestroy()
        val myIntent = Intent(this, MyBroadcastReceiver::class.java).setAction("Restart")
        sendBroadcast(myIntent);
    }

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        val myIntent = Intent(this, MyBroadcastReceiver::class.java).setAction("Restart")
        sendBroadcast(myIntent);
    }
}
POI:
override fun onDestroy() {
	super.onDestroy()
	val myIntent = Intent(this, MyBroadcastReceiver::class.java).setAction("Restart")
	sendBroadcast(myIntent);
}

override fun onTaskRemoved(rootIntent: Intent?) {
	super.onTaskRemoved(rootIntent)
	val myIntent = Intent(this, MyBroadcastReceiver::class.java).setAction("Restart")
	sendBroadcast(myIntent);
}
In main activity:
@RequiresApi(Build.VERSION_CODES.O)
override fun onResume() {
	super.onResume()
	LocalBroadcastManager.getInstance(this)
		.registerReceiver(broadCastReceiver, IntentFilter("MyAction"))

	val intent = Intent(this, MyService::class.java)
	intent.action = "startForeground"
	startForegroundService(intent)
}
Notice that there is a problem with onResume because it will start the service immediately.

Edit: 2022-06-05: Unfortunately after latest update of Huawei my app is again getting killed. Here you can find informations about this issuse.