there.
I've create simple application for Samsung Wear Watch 4, which has MainActivity => MainFragment, LifecycleService.
MainActivity:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val navController = findNavController(R.id.nav_host_fragment_content_main)
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
finish()
super.onDestroy()
}
}
MainFragment:
class MainFragment: Fragment() {
private lateinit var binding: FragmentMainBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
binding.lifecycleOwner = this
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
requestPermission()
setupClicks()
}
override fun onResume() {
super.onResume()
updateBackground()
}
override fun onDestroy() {
super.onDestroy()
requireContext().stopService(
Intent(
requireActivity(),
TrackingService::class.java
)
)
activity?.finish()
}
private fun setupClicks() {
Handler(Looper.getMainLooper()).postDelayed({
updateBackground()
}, 5000L)
binding.restart.setOnClickListener {
startTrackingService()
Log.d("CRASH", "onClick")
}
}
private fun startTrackingService() {
requireContext().stopService(
Intent(
requireActivity(),
TrackingService::class.java
)
)
Log.d("CRASH", "startTracking")
requireContext().startForegroundService(
Intent(
requireActivity(),
TrackingService::class.java
)
)
}
private fun updateBackground() {
if (isServiceTracking) {
binding.background.setBackgroundColor(
requireContext().resources.getColor(
R.color.green,
null
)
)
binding.serviceStatus.text = requireContext().getString(R.string.service_is_active)
binding.restart.visibility = View.GONE
binding.qrcodeImage.visibility = View.VISIBLE
} else {
binding.background.setBackgroundColor(
requireContext().resources.getColor(
R.color.red,
null
)
)
binding.serviceStatus.text = requireContext().getString(R.string.service_is_inactive)
binding.restart.visibility = View.VISIBLE
binding.qrcodeImage.visibility = View.VISIBLE
}
}
private fun requestPermission() {
when {
ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.BODY_SENSORS
) != PackageManager.PERMISSION_GRANTED -> {
requestPermissions(arrayOf(Manifest.permission.BODY_SENSORS), 2345)
}
}
}
}
Service:
class TrackingService : LifecycleService(), SensorsDataService {
companion object {
var isServiceTracking = false
val stepsLiveData = MutableLiveData<String>()
private var previousTotalSteps = 0f
var SAVE_PHYSICAL_PARAMETERS_INTERVAL: Long = 10000L
}
private lateinit var sensorManager: SensorManager
private lateinit var runnableCodeForSavingPhysicalParameters: Runnable
val handlerForSavingPhysicalParameters = Handler(Looper.getMainLooper())
override fun onCreate() {
super.onCreate()
sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
trackSensors()
startTimerForSavingPhysicalParameters()
}
override fun onSensorChanged(event: SensorEvent?) {
when (event?.sensor?.type) {
Sensor.TYPE_STEP_COUNTER -> {
var totalSteps = event.values[0]
if (previousTotalSteps == 0f) {
previousTotalSteps = totalSteps;
stepsLiveData.value = "0";
} else {
val currentSteps = totalSteps.toInt() - previousTotalSteps.toInt()
stepsLiveData.value = currentSteps.toString();
}
}
else -> {
}
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
TODO("Not yet implemented")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
isServiceTracking = true
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
isServiceTracking = false
handlerForSavingPhysicalParameters.removeCallbacks(runnableCodeForSavingPhysicalParameters)
stopSelf()
}
private fun trackSensors() {
getSteps()
}
private fun getSteps() {
Log.d("GPS", "Sensor ${sensorManager}")
}
private fun startTimerForSavingPhysicalParameters() {
runnableCodeForSavingPhysicalParameters = object : Runnable {
override fun run() {
try {
logSteps()
} finally {
handlerForSavingPhysicalParameters.postDelayed(
this,
SAVE_PHYSICAL_PARAMETERS_INTERVAL
)
}
}
}
runnableCodeForSavingPhysicalParameters.run()
}
private fun logSteps() {
Toast.makeText(this, "${stepsLiveData.value?.toInt()}", Toast.LENGTH_LONG).show()
Log.d("STEPS", "${stepsLiveData.value?.toInt()}")
}
}
It works fine until battery low and telephone switch off After charge battery and run application it starts service but than system closes application.
Why it's happened? How should I close and stop application correctly when battery gets low and system switches off.
Any advices please