0

我的搜索没有返回答案,而是一两个未回答的问题。我会尝试以一种也许我能得到答案的方式来表达它。

TL;DR 版本:

我无法弄清楚我们如何从 AndroidViewModel 类启动(VPN)服务。

更长的版本:

通常,我会从一个活动中启动这样的服务:

    @Override
    public void onClick(View v) {
        Intent intent = VpnService.prepare(this);
        if (intent != null) {
            startActivityForResult(intent, 0);
        } else {
            onActivityResult(0, RESULT_OK, null);
        }
    }

显然,在 MVVM 中,我想将点击事件传递给 AndroidViewModel(或者只是 ViewModel,但我需要 Context,所以它必须是 AndroidViewModel),并且我想在那里启动服务。

我应该这样做吗?看起来很乱。

public void startStopButtonWasClicked(WeakReference<Activity> MainActivity) {

    //do other stuff

    Intent intent = VpnService.prepare(MainActivity.get());
    if (intent != null) {
        application.startActivity (intent, 0);
        MainActivity.get().startActivityForResult(intent, 0);
    } else {
        MainActivity.get().onActivityResult(0, RESULT_OK, null);
    }

}

或者我应该在 VM 类中实现 onActivityResult 吗?

编辑:这甚至是不可能的:MainActivity.get().onActivityResult(0, RESULT_OK, null);

4

1 回答 1

0

您不是从视图模型导航,而是从视图/控制器导航,向控制器发送命令,说您要启动服务并从控制器启动它。顺便说一句,像这样获取您的活动上下文:MainActivity.get()真的很糟糕,永远不要将活动上下文放在静态成员中。

或者我应该在 VM 类中实现 onActivityResult 吗?

实际上,当您从控制器获得结果时,您可以将其发送到您的视图模型以进行处理

于 2018-04-08T14:16:49.320 回答