2012-09-24 1 views
2

J'ai une application pour WP7 et Android, et cette demande doit être supporthas support pour le type de connexion "any" (WiFi, NFC, Bluetooth, etc.)Faire un soutien multiplateforme mono pour la tâche/intention

Je puis créé un modèle en couches avec MVVMCross https://github.com/slodge/MvvmCross

J'ai une interface par exemple Android Bluetooth doit mettre en œuvre

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

Je veux être en mesure de demander à l'utilisateur d'accès Bluetooth, mais je ne veux pas programmer mon interface utilisateur spécifique à Android Bluetooth, donc la vue et le modèle de vue ne devraient pas savoir quelle intention est utilisée, tout cela devrait être géré par la classe implémentant IConnectionService

Le problème est que cela devrait aussi fonctionner pour Windows Phone qui n'utilise pas les intentions, il utilise des tâches, alors comment puis-je créer une interface qui me permette de faire une requête d'intention ou une requête de tâche sans que personne ne sache quel type de requête est nécessaire?

Répondre

5

Ceci est similaire à la façon dont MvvmCross permet aux utilisateurs de passer des appels téléphoniques.

Lorsque vous utilisez ce modèle:

Le code ViewModel consume une plate-forme de service indépendante via une interface - par exemple:

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

consommée par

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

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

Le code d'installation de l'application injecte la plate-forme spécifique i XECUTION pour l'interface - par exemple:

 RegisterServiceType<IMvxPhoneCallTask, MvxPhoneCallTask>(); 

Dans WP7 - celui-ci utilise le 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 
} 

Dans Droid - il utilise le 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 - il utilise juste 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 
} 

Dans la version vNext de mvvmcross, cette approche est en outre officialisé en utilisant des plugins - voir une brève introduction à ces derniers dans la présentation « aller portable » à http://slodge.blogspot.co.uk/2012/06/mvvm-mvvmcross-monodroid-monotouch-wp7.html

Par exemple, dans vNext l'appel téléphonique code ci-dessus est contenu dans le plugin PhoneCall - https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/PhoneCall


l'un des défis de votre tâche est peut-être le mot « tout » - les différences dans la mise en œuvre de la plate-forme pourrait rendre difficile à dé bien une interface multiplateforme qui fonctionne sur toutes les plates-formes pour l'un de NFC, Bluetooth, etc, et encore moins tous.