我正在开发一个在前台服务上启动计时器并处理一些数据的应用程序。该前台服务具有一个显示相同数据的通知UI。我想将此数据与片段同步。
我知道我可以使用LocalBroadcasts
,但是它们似乎更难以编写/同步,并且由于我的应用程序使用MVVM
,因此我认为应该公开{{ 1}},这两个组件都可以观察到。
对我来说,前景服务应与其他UI组件处于同一级别,如下图所示:
我在匕首帮助下实现了以下设计:
应用程序类
ViewModel
Dagger ViewModel模块:
LiveData
使用生命周期扩展可注入类的自定义服务:
public class MyApplication extends DaggerApplication implements ViewModelStoreOwner {
private ViewModelStore viewModelStore;
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).myApplication(this).build();
}
@Override
public void onCreate() {
super.onCreate();
viewModelStore = new ViewModelStore();
}
@NonNull
@Override
public ViewModelStore getViewModelStore() {
return viewModelStore;
}
}
服务
@Module
public abstract class ViewModelFactoryModule {
@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
@Provides
@Singleton
@Named("applicationViewModelProvider")
static ViewModelProvider provideApplicationViewModelProvider(MyApplication application, ViewModelProviderFactory modelProviderFactory) {
return new ViewModelProvider(application, modelProviderFactory);
}
}
片段
public abstract class DaggerLifecycleService extends LifecycleService {
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
}
ViewModel
public class TimerForegroundService extends DaggerLifecycleService {
@Inject
@Named("applicationViewModelProvider")
private ViewModelProvider appProvider;
@Override
public void onCreate() {
super.onCreate();
TimerViewModel timerViewModel = appProvider.get(TimerViewModel.class);
//Observe timerViewModel.getTimeLiveData() and post new notification
}
}
这将是一个好的设计方法吗?如果不是为什么?