当我们在清单中声明这样的东西时,是否保证在接收到该类型的意图时将执行该服务(如果它尚未运行)?这在Android Oreo 8.0上的工作方式是否相同?
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
答案 0 :(得分:1)
是否保证在接收该类型的意图时将执行该服务(如果它尚未运行)?
“保证”是一个强有力的术语。 通常你的陈述是真的。不包括的情景:
如果有人尝试使用隐式Intent
启动服务,那么只使用该操作字符串。设备很可能会有<intent-filter>
的多个服务,在这种情况下,Android会选择其中一个服务来启动。请注意,在Android 5.0+上禁止使用隐式Intent
的绑定,以避免出现这种情况。
如果您在运行时使用PackageManager
和setComponentEnabledSetting()
停用了该组件。
这在Android Oreo 8.0上的工作方式是否相同?
我不知道Android 8.0中<intent-filter>
上<service>
的行为有任何变化。 Android 8.0中的服务发生了更改(例如,无法从后台启动服务),但这些更改不依赖于<intent-filter>
的存在。
答案 1 :(得分:-1)
这取决于您使用的服务类型。
1。 前景 - :前台服务执行一些对用户来说很明显的操作
2:背景: - 后台服务执行的操作不会被用户直接注意到。例如,如果应用程序使用服务来压缩其存储空间,那通常就是后台服务。
Note: If your app targets API level 26 or higher, the system imposes restrictions on running background services when the app itself is not in the foreground. In most cases like this, your app should use a scheduled job instead.
3。的结合强> 当应用程序组件通过调用bindService()绑定到服务时绑定服务。
因此,正如您在Android Oreo或更高版本上看到的那样,后台服务存在某些限制。有关主题的更多信息,请阅读Here。