Jok*_*nas 17 android android-appcompat application-lifecycle android-lifecycle
我正在调查一个奇怪的问题,我们将 更改androidx.appcompat:appcompat为1.3.1,1.4.1突然我们的LifecycleObservers观察过程生命周期停止发出任何事件。
我也在使用"androidx.lifecycle:lifecycle-extensions:2.2.0",我知道这已经被弃用,但如果 appcompat 是,它可以完美地工作1.3.1
我已在清单中设置了正确的应用程序名称,我已根据文档的要求包含此提供程序。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
初始化的示例,不起作用。该对象被注入到Application类中,并且生命周期观察器被添加,但从onStart未被onStop调用。
class AppLifecycle @Inject constructor(
private val foregroundProxy: AppLifecycleProxy
) : LifecycleObserver {
init {
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
foregroundProxy.onStarted()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
foregroundProxy.onStopped()
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据 @EpicPandaForce 评论,将清单中的提供程序块更改为:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities=\"${applicationId}.androidx-startup"
android:exported="false"
tools:node=\"merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
Run Code Online (Sandbox Code Playgroud)
并将依赖项替换"androidx.lifecycle:lifecycle-extensions:2.2.0"为"androidx.lifecycle:lifecycle-common:2.4.1"解决了这个问题
Epi*_*rce 17
很有可能,您这边发生更改的原因是因为 ProcessLifecycleOwner 的初始化被重新设计为使用 Jetpack Startup 库,该库依赖于 ContentProvider,因此仅在进程的主进程中进行初始化。
在 ProcessLifecycleOwner 的实际代码中,它表示:
Run Code Online (Sandbox Code Playgroud)/** * Initializes {@link ProcessLifecycleOwner} using {@code androidx.startup}. */ public final class ProcessLifecycleInitializer implements Initializer<LifecycleOwner> { @NonNull @Override public LifecycleOwner create(@NonNull Context context) { AppInitializer appInitializer = AppInitializer.getInstance(context); if (!appInitializer.isEagerlyInitialized(getClass())) { throw new IllegalStateException( "ProcessLifecycleInitializer cannot be initialized lazily. \n" + "Please ensure that you have: \n" + "<meta-data\n" + " android:name='androidx.lifecycle.ProcessLifecycleInitializer' \n" + " android:value='androidx.startup' /> \n" + "under InitializationProvider in your AndroidManifest.xml"); } LifecycleDispatcher.init(context); ProcessLifecycleOwner.init(context); return ProcessLifecycleOwner.get(); } @NonNull @Override public List<Class<? extends Initializer<?>>> dependencies() { return Collections.emptyList(); } }
在 2021 年 3 月使用它的提交androidx.startup是这样说的:
"
lifecycle-process现在用于androidx.startup初始化流程生命周期所有者。此前,这是由
androidx.lifecycle.ProcessLifecycleOwnerInitializer.如果您过去使用过用于初始化流程生命周期,那么您需要执行以下操作
tools:node="remove"。ContentProviderRun Code Online (Sandbox Code Playgroud)<provider android:name="androidx.startup.InitializationProvider" android:authorities=\"${applicationId}.androidx-startup" android:exported="false" tools:node=\"merge"> <!-- If you are using androidx.startup to initialize other components --> <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup" /> </provider>Run Code Online (Sandbox Code Playgroud)(or) <!-- If you want to disable androidx.startup completely. --> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove"> </provider> "
因此,您专门添加的代码片段会禁用 AndroidX StartUp 进程,因此您的 ProcessLifecycleOwner 将不会被初始化。
顺便说一句,如果您禁用自动启动过程,Google 并没有提供手动安装 ProcessLifecycleOwner 的方法,但要实现它,您只需要模仿他们正在做的事情即可。例如,如果您需要在多进程应用程序中使用 ProcessLifecycleOwner,则不需要使用 ContentProvider。
在这种情况下,您可以在名为的包中创建一个Javaandroidx/lifecycle文件:
public class ProcessLifecycleInitializerAccessor {
public static LifecycleOwner initialize(Application context) {
LifecycleDispatcher.init(context);
ProcessLifecycleOwner.init(context);
return ProcessLifecycleOwner.get();
}
}
Run Code Online (Sandbox Code Playgroud)
但在你的位置,你可能只需要删除删除 ContentProvider 的代码片段。
有一个升级已androidx.lifecycle开始使用androidx.startup来初始化。因此,如果此代码位于您的清单中:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
然后您可以完全删除该代码,或tools:node="merge"使用remove.
您需要在正在初始化的合并清单中进行验证androidx.lifecycle.ProcessLifecycleInitializer。
小智 7
如果您使用生命周期库,请添加此
def lifecycle_version = "2.5.1"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6423 次 |
| 最近记录: |