2

我有一个适用于 WP7 和 Android 的应用程序,该应用程序必须支持“任何”连接类型(WiFi、NFC、蓝牙等)

然后我用 MVVMCross https://github.com/slodge/MvvmCross创建了一个分层模型

我有一个接口,例如 Android 蓝牙必须实现

interface IConnectionService
{
    List<TargetDevice> FindDevices();
    void Connect(TargetDevice targetDevice);
    void Disconnect();
    byte[] Read();
    void Write(byte[] command);
}

我希望能够请求用户进行蓝牙访问,但我不想将我的 UI 专门编程为 Android 蓝牙,所以视图和视图模型不应该知道使用了哪个意图,所有这些都应该由类处理实现 IConnectionService

问题是它也应该适用于不使用意图的 Windows Phone,它使用任务,所以我如何制作一个界面,允许我在不知道需要什么类型的请求的情况下发出意图请求或任务请求?

4

1 回答 1

5

这类似于 MvvmCross 允许用户拨打电话的方式。

使用此模式时:

ViewModel 代码通过接口使用与平台无关的服务 - 例如:

public interface IMvxPhoneCallTask
{
    void MakePhoneCall(string name, string number);
}

被消耗

    protected void MakePhoneCall(string name, string number)
    {
        var task = this.GetService<IMvxPhoneCallTask>();
        task.MakePhoneCall(name, number);
    }

https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.Core/ViewModels/BaseViewModel.cs

应用程序设置代码为接口注入平台特定的实现 - 例如:

        RegisterServiceType<IMvxPhoneCallTask, MvxPhoneCallTask>();

在 WP7 - 这使用PhoneCallTask- https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/WindowsPhone/Platform/Tasks/MvxPhoneCallTask​​.cs

public class MvxPhoneCallTask : MvxWindowsPhoneTask, IMvxPhoneCallTask
{
    #region IMvxPhoneCallTask Members    

    public void MakePhoneCall(string name, string number)
    {
        var pct = new PhoneCallTask {DisplayName = name, PhoneNumber = number};
        DoWithInvalidOperationProtection(pct.Show);
    }

    #endregion
}

在 Droid 中 - 它使用ActionDial Intent- https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Platform/Tasks/MvxPhoneCallTask​​.cs

public class MvxPhoneCallTask : MvxAndroidTask, IMvxPhoneCallTask
{
    #region IMvxPhoneCallTask Members

    public void MakePhoneCall(string name, string number)
    {
        var phoneNumber = PhoneNumberUtils.FormatNumber(number);
        var newIntent = new Intent(Intent.ActionDial, Uri.Parse("tel:" + phoneNumber));
        StartActivity(newIntent);
    }


    #endregion
}

In Touch - 它只使用 Urls - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Platform/Tasks/MvxPhoneCallTask ​​.cs

public class MvxPhoneCallTask : MvxTouchTask, IMvxPhoneCallTask
{
    #region IMvxPhoneCallTask Members

    public void MakePhoneCall(string name, string number)
    {
        var url = new NSUrl("tel:" + number);
        DoUrlOpen(url);
    }

    #endregion
}

在 mvvmcross 的 vnext 版本中,这种方法使用插件进一步形式化 - 请参阅http://slodge.blogspot.co.uk/2012/06/mvvm-mvvmcross-monodroid的“便携式”演示文稿中对这些方法的简要介绍-monotouch-wp7.html

例如,在 vNext 中,上面的电话代码包含在 PhoneCall 插件中 - https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/PhoneCall


您的任务的挑战之一可能是“任何”这个词 - 平台实现的差异可能会导致难以定义跨平台接口,该接口适用于 NFC、蓝牙等任何一个平台,更不用说所有平台了。他们。

于 2012-09-24T11:53:19.383 回答