【问题标题】:start (vpn) service from AndroidViewModel从 AndroidViewModel 启动 (vpn) 服务
【发布时间】:2018-04-08 14:07:09
【问题描述】:

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

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);

【问题讨论】:

    标签: android android-intent mvvm android-service android-viewmodel


    【解决方案1】:

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

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

    确实,当您从控制器获得结果时,您可以将其发送到您的视图模型来处理它

    【讨论】:

    • 对不起,但对我来说并不完全干净。 Activity 应该用作视图,而不是 MVVM 中的控件。如果是这样,我为什么要启动一个后台服务,它在视图中没有视觉效果 - 从视图?! (另一方面,只要它是弱引用并且它是由 .get() “获取”的,那也不应该是问题 - 尽管我也不喜欢它的“清洁度”。或者我错了?
    • MVVM 并不意味着没有控制器,您的活动仍然是一个控制器,并且是在活动或片段之间导航的正确位置,视图模型是处理数据而不是导航,但您仍然可以从如果需要,使用 AndroidViewModel 的应用程序上下文
    猜你喜欢
    • 2014-08-23
    • 2019-08-16
    • 1970-01-01
    • 2021-05-26
    • 2011-01-21
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多