在android:process
的{{1}}或service
中定义属性receiver
时,我正在寻找更多的见识
这是docs的引文:
android:process
要在其中运行服务的进程的名称。通常,应用程序的所有组件都在为该应用程序创建的默认进程中运行。它与应用程序包的名称相同。元素的process属性可以为所有组件设置不同的默认值。但是组件可以使用其自己的进程属性覆盖默认值,从而使您可以将应用程序分布在多个进程中。
如果分配给该属性的名称以冒号(':')开头,则会在需要时创建一个对应用程序私有的新进程,并且该服务将在该进程中运行。如果进程名称以小写字母开头,则该服务将在具有该名称的全局进程中运行,前提是它具有这样做的权限。这允许不同应用程序中的组件共享进程,从而减少资源使用。
在遵循有关如何编写同步服务以及接收器的各种示例时,这些样本通常包含带有单独的AndroidManifest.xml
名称的清单定义。
这里是一个示例,其中定义了接收方和服务(:remote 和:sync )
android:process
<receiver android:name="myapp.backgroundAnalysis.BackgroundAlaramReceiver"
android:process=":remote"
>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
如果我都省略<service
android:name="myapp.backgroundCloudSync.SyncService"
android:exported="false"
android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
...
</service>
,实际上会发生什么?我知道它们将在默认进程中运行,其他所有内容(主线程,线程等)也将在其中运行,但这是否会对接收器和SyncService的行为产生影响?
这会在运行时影响应用程序的行为吗?或者接收器会干扰同步吗?我知道服务将在主线程上运行,但是当计划在主线程上运行代码时,东西会停滞还是只会延迟?
(此问题的背景与一个问题相关,我需要对来自各种实体(主应用程序,接收器和SyncAdapter)的某些共享资源运行同步操作,但是共享资源无法在多进程环境中工作,因此我试图了解可能的解决方法或解决方案的含义)
答案 0 :(得分:1)
这会对接收器和SyncService的行为产生影响吗?
不直接。
这会在运行时影响应用程序的行为
在一个进程中,所有线程的线程安全问题变得越来越严重。 OTOH,这比在2个以上流程中协调工作要容易得多,以使一个流程不会影响另一流程的工作。
我知道服务将在主线程上运行
服务的生命周期方法(例如onStartCommand()
)将在主应用程序线程上运行;您的业务逻辑应在后台线程上运行。无论所有内容是在一个进程中还是在多个进程之间拆分,您都必须这样做。
计划在主线程上运行代码时,东西会停滞还是只会延迟?
如果您的服务在主应用程序线程上运行代码,则它将在该代码运行时阻止该线程上的所有其他内容。这就是服务始终使用后台线程的原因。
根据您如何同步对共享对象的访问,在后台线程上运行的服务代码可能会锁定对这些共享对象的访问,因此会暂停尝试访问这些对象的UI代码。这就是为什么我们尝试组织代码来避免阻塞用户界面上此类对象的调用,例如通过使用反应性选项(LiveData
,RxJava等)。