@misterKno

Как сделать чтобы сервис работал постоянно?

Доброго времени суток! Я написал сервис, который показывает FPS. Однако, при закрытии приложения сервис удаляется, и FPS перестает отображаться. Как это исправить?

import android.app.Service
import android.content.Intent
import android.graphics.Color
import android.graphics.PixelFormat
import android.os.Handler
import android.os.IBinder
import android.util.Log
import android.view.Choreographer
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.widget.ImageButton
import android.widget.TextView

class FPS : Service(), Choreographer.FrameCallback {

    private var windowManager: WindowManager? = null
    private var fpsTextView: TextView? = null
    private var popupView: View? = null
    private var frameCount = 0
    private var startTime: Long = 0
    private val handler = Handler()
    private val choreographer: Choreographer by lazy { Choreographer.getInstance() }
    private var color: Int = 0

    override fun onBind(intent: Intent): IBinder? {
        return null
    }

    override fun onCreate() {
        super.onCreate()
        val params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            } else {
                WindowManager.LayoutParams.TYPE_PHONE
            },
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )

        params.gravity = android.view.Gravity.TOP or android.view.Gravity.END

        windowManager = getSystemService(WINDOW_SERVICE) as WindowManager

        val inflater = getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
        popupView = inflater.inflate(R.layout.window, null)

        fpsTextView = popupView?.findViewById(R.id.fps)
        val closeButton: ImageButton? = popupView?.findViewById(R.id.close_button)

        closeButton?.setOnClickListener {
            stopSelf()
        }

        windowManager?.addView(popupView, params)

        choreographer.postFrameCallback(this)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        intent?.let {
            color = intent.getIntExtra("color", Color.WHITE)
        }
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
        handler.removeCallbacksAndMessages(null)
        windowManager?.removeView(popupView)
    }

    override fun doFrame(frameTimeNanos: Long) {
        val currentTime = System.currentTimeMillis()
        frameCount++
        choreographer.postFrameCallback(this)

        if (currentTime - startTime >= 1000) {
            val fps = frameCount.toFloat() / ((currentTime - startTime) / 1000f)
            val roundedFps = Math.round(fps).toInt()
            Log.d("FPS", "FPS: $roundedFps")

            fpsTextView?.setTextColor(color)

            fpsTextView?.text = "FPS: $roundedFps"

            frameCount = 0
            startTime = currentTime
        }
    }
}
  • Вопрос задан
  • 232 просмотра
Решения вопроса 1
@misterKno Автор вопроса
я понял, я использовал startService, а нужно было запускать как startForegraundService
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
Во первых, ценность сервиса около нулевая с точки зрения других разработчиков, так как в режиме разработчика можно просто поставить ON на против настройки "Выводить частоту кадров".
Во вторых, в том виде как сейчас он у вас написан,

fpsTextView = popupView?.findViewById(R.id.fps)

работать без вашей активности на топе не будет.

В тетьих, что же можно сделать:
а) Полупрозрачное окно активности (тема наследованная от диалога), которое будет всегда поверх других.
б) частота кадров будет выводиться в шторке на уведомлении от foreground service (тут подлянка от андроид 13, где нотифи служб теперь по умолчанию скрыты)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Спецвузавтоматика Ростов-на-Дону
от 100 000 до 250 000 ₽
Hunt Rangers Москва
от 220 000 до 270 000 ₽
25 июн. 2024, в 01:41
12000 руб./за проект
25 июн. 2024, в 01:41
10000 руб./за проект
25 июн. 2024, в 01:35
100000 руб./за проект