首页 > 解决方案 > 当应用程序在后台时,意图服务在 android 9 上正常运行

问题描述

我有一个意图服务和一个广播接收器。

根据 Android Oreo 及以上版本的后台限制,后台应用程序(当应用程序不是前台时)不能使用已启动的服务。当您从后台应用程序调用startService () 方法时,只需通过 IllegalStateException。

但就我而言,即使应用程序在后台,我的意图服务也能正常运行。我正在使用 ADB cmd 来触发广播。

请纠正我失踪的地方。

adb shell am broadcast -a android.intent.action.TEST --es maxCountValue 10 -n com.example.servicedemo/.MyReceiver
enter code here

广播接收器类

class MyReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Toast.makeText(context, "CompleteReceiver", Toast.LENGTH_LONG).show()
        if (intent!!.action.equals("android.intent.action.TEST")) {
            val mIntent = Intent(context, MyIntentService::class.java).apply {
                Log.v("MyIntentService", intent.data.toString())
                this.putExtra("maxCountValue", 100)
            }
            context?.startService(mIntent)
        }
    }
}

意向服务

private const val SERVICE_NAME = "MyIntentService"

class MyIntentService : IntentService(SERVICE_NAME) {
    private val handler = Handler()

    override fun onCreate() {
        super.onCreate()
        showToast("Job Execution Started")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        showToast("Job Execution onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
        showToast("Job Execution onDestroy")
    }
    override fun onHandleIntent(intent: Intent?) {
        val maxCount = intent!!.getIntExtra("maxCountValue", -1)

        for (i in 0 until maxCount) {
            Log.d(SERVICE_NAME, "onHandleWork: The number is: $i")
            try {
                Thread.sleep(100)
            } catch (e: InterruptedException) {
                Log.d(SERVICE_NAME, "Exception: ")
                e.printStackTrace()
            }
        }
    }

    private fun showToast(msg: String) {
        handler.post {
            Toast.makeText(this@MyIntentService, msg, Toast.LENGTH_LONG).show()
        }
    }
}

显现 :

<service android:name=".MyIntentService"/>

        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="android.intent.action.TEST" />
            </intent-filter>
        </receiver>

标签: androidkotlinandroid-serviceandroid-8.0-oreoandroid-intentservice

解决方案


“出于服务限制目的而对后台的定义与内存管理使用的定义不同;应用程序可能在后台与内存管理有关,但在前台与启动服务的能力有关。”

-

https://developer.android.com/about/versions/oreo/background

PS这就是服务的全部目的


推荐阅读