我应该在前台服务和带有视图模型的片段之间进行通信吗?

时间:2019-09-06 00:29:49

标签: android viewmodel android-livedata dagger android-mvvm

我正在开发一个在前台服务上启动计时器并处理一些数据的应用程序。该前台服务具有一个显示相同数据的通知UI。我想将此数据与片段同步。

我知道我可以使用LocalBroadcasts,但是它们似乎更难以编写/同步,并且由于我的应用程序使用MVVM,因此我认为应该公开{{ 1}},这两个组件都可以观察到。

对我来说,前景服务应与其他UI组件处于同一级别,如下图所示: App Architecture

我在匕首帮助下实现了以下设计:

应用程序类

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
    }
}

这将是一个好的设计方法吗?如果不是为什么?

0 个答案:

没有答案