在Android中,在服务中访问viewModel

17

如何在服务中初始化 viewModel。在片段中,我们使用 Kotlin 委托“by activityViewModels”进行初始化。或者我们可以使用 ViewModelProvider().get 进行初始化。但是据我所知,我们无法在服务中这样做,因为我们需要像活动或片段一样的“ViewModelStoreOwner”。

那么在服务中初始化 ViewModel 是最佳实践吗?

我的项目在这里


3
因为我需要从我的服务中调用仓库类,所以您不需要使用视图模型来实现这一点。 - CommonsWare
@CommonsWare 是的,你说得对。 - imansdn
2个回答

17
不建议在服务中使用ViewModel。您可以直接从服务调用存储库。
ViewModel 应该与Activity或Fragment密切配合使用,因此它注定要存在于应用程序的UI层。因此,我不建议在服务中使用ViewModel。创建一个不同的类,该类将在服务中使用,并且如果需要,在ViewModel中也会使用。这样可以确保关注点分离并避免给ViewModel分配更多不必要的责任。
参考链接:https://github.com/android/architecture-components-samples/issues/137#issuecomment-327854042

4
定义一个基础服务,然后您可以像在活动/片段中使用ViewModel一样使用它。
public class LifecycleAndViewStoreOwnerService extends LifecycleService implements ViewModelStoreOwner, HasDefaultViewModelProviderFactory {

    final ViewModelStore mViewModelStore = new ViewModelStore();
    ViewModelProvider.Factory mFactory;

    @NonNull
    @Override
    public ViewModelStore getViewModelStore() {
        return mViewModelStore;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                if (source.getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
                    mViewModelStore.clear();
                    source.getLifecycle().removeObserver(this);
                }
            }
        });
    }

    @NonNull
    @Override
    public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
        return mFactory != null ? mFactory : (mFactory = new ViewModelProvider.AndroidViewModelFactory(getApplication()));
    }
}

扩展上述类,在服务中显示一个覆盖窗口

public class MyLifecycleService extends LifecycleAndViewStoreOwnerService {

    private static final String TAG = "MyLifecycleService";

    @Override
    public void onCreate() {
        super.onCreate();
        final OverlayWindowBinding binding = OverlayWindowBinding.inflate(LayoutInflater.from(this));
        binding.setViewModel(new ViewModelProvider(this).get(ViewModel.class));
        binding.setLifecycleOwner(this);

        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getSystemService(WindowManager.class).addView(binding.getRoot(), layoutParams);

        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                if (source.getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
                    getSystemService(WindowManager.class).removeViewImmediate(binding.getRoot());
                    source.getLifecycle().removeObserver(this);
                }
            }
        });
    }

    public static class ViewModel extends AndroidViewModel {
        public ViewModel(@NonNull Application application) {
            super(application);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接