簡體   English   中英

當應用程序在后台時,意圖服務在 android 9 上正常運行

[英]Intent Service running properly on android 9 when app is in background

我有一個 Intent 服務和一個 BroadcastReceiver。

根據 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

BroadcastReceiver class

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>

“出於服務限制目的的后台定義與 memory 管理使用的定義不同;應用程序可能在后台與 memory 管理有關,但在前台與其啟動服務的能力有關。”

-

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

PS這就是服務的全部目的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM