应用程序在后台时服务未打开 activity
Service not opening activity while app in background
我有一个 broadcastReceiver 在到达时间时打开服务。
如果应用程序已打开并且 运行 在前台,则会调用该服务,然后调用 activity。
如果应用程序已打开但 运行 在后台,则会调用服务但不会打开应用程序。
服务:
classAlarmRingService:服务(){
override fun onCreate() {
super.onCreate()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val ringIntent = Intent(this, AlarmRingActivity::class.java)
ringIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(ringIntent)
Toast.makeText(this, "activity should have started", Toast.LENGTH_LONG).show()
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
}
override fun onBind(intent: Intent): IBinder? {
return null
}
}
即使在应用程序在后台打开的情况下查看手机主屏幕时也会调用 toast。
Activity:
lateinit var binding: ActivityAlarmRingBinding
private val fragmentManager = supportFragmentManager
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAlarmRingBinding.inflate(layoutInflater)
setContentView(binding.root)
supportActionBar?.title = ""
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Toast.makeText(this, "activity started", Toast.LENGTH_LONG).show()
if (prefs.getBoolean("sp_shake", true)) {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.fragmentContainerViewAlarm, ShakeAlarmRingFragment())
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
} else {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.fragmentContainerViewAlarm, AlarmRingFragment())
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
}
}
override fun onBackPressed() {
// back not allowed
}
}
我在其他地方看到这在小米手机上不起作用,这是我进行物理测试的地方,但在模拟器中测试多部手机也会产生相同的结果。
如评论中所述,在 Android 10.
之后无法真正解决此问题
您需要打开一个可以启动您的 activity 的通知。
虽然在闹钟的情况下,振动和铃声等仍然可以从服务中调用,只是不是 activity 本身。
我有一个 broadcastReceiver 在到达时间时打开服务。
如果应用程序已打开并且 运行 在前台,则会调用该服务,然后调用 activity。
如果应用程序已打开但 运行 在后台,则会调用服务但不会打开应用程序。
服务: classAlarmRingService:服务(){
override fun onCreate() {
super.onCreate()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val ringIntent = Intent(this, AlarmRingActivity::class.java)
ringIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(ringIntent)
Toast.makeText(this, "activity should have started", Toast.LENGTH_LONG).show()
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
}
override fun onBind(intent: Intent): IBinder? {
return null
}
}
即使在应用程序在后台打开的情况下查看手机主屏幕时也会调用 toast。
Activity:
lateinit var binding: ActivityAlarmRingBinding
private val fragmentManager = supportFragmentManager
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAlarmRingBinding.inflate(layoutInflater)
setContentView(binding.root)
supportActionBar?.title = ""
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Toast.makeText(this, "activity started", Toast.LENGTH_LONG).show()
if (prefs.getBoolean("sp_shake", true)) {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.fragmentContainerViewAlarm, ShakeAlarmRingFragment())
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
} else {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.fragmentContainerViewAlarm, AlarmRingFragment())
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
}
}
override fun onBackPressed() {
// back not allowed
}
}
我在其他地方看到这在小米手机上不起作用,这是我进行物理测试的地方,但在模拟器中测试多部手机也会产生相同的结果。
如评论中所述,在 Android 10.
之后无法真正解决此问题您需要打开一个可以启动您的 activity 的通知。
虽然在闹钟的情况下,振动和铃声等仍然可以从服务中调用,只是不是 activity 本身。