Android system close application after battery low

Viewed 31

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

0 Answers
Related