android - 当应用程序在后台时,意图服务在 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>
解决方案
“出于服务限制目的而对后台的定义与内存管理使用的定义不同;应用程序可能在后台与内存管理有关,但在前台与启动服务的能力有关。”
-
https://developer.android.com/about/versions/oreo/background
PS这就是服务的全部目的
推荐阅读
- java - 通过从 JavaScript fetch API 接收 Spring MVC ModelAndView 进行重定向
- c++ - c++ 在 Visual Studio 2019 游戏窗口中显示黑屏 Windows 10
- autocomplete - CKEditor insertHtml outputTemplate
- node.js - 如何在 TypeScript 中导出库?
- typescript - 什么是类中的“at-syntax”
- python - 如何在不嵌套补丁装饰器的情况下修补这些功能
- excel - 将包含多于 X 行数据的工作表复制到另一个工作簿
- python - Catch 22 ModuleNotFoundError:ImportError:如果我修复一个,我会得到另一个
- django - 使用 DRF 创建用户配置文件
- sql - PostgreSQL SQL 语句运行并从 pgAdmin 4 v5 返回值,语句通过 Flutter/dart db conn 运行它不返回任何内容