Xamarin
Focus su Xamarin.Android
Focus
 Xamarin.Android espone la versione completa di Android
SDK per gli sviluppatori .NET.
 Permette di creare app Android completamente native con
C# o F# in Visual Studio.
Activity Lifecycle
 Activity o schermata è una concetto specifico di
android
 Activity possiede un metodo onCreate da dove parte il
programma di ogni activity
 Ogni Activity può lanciare un’altra activity
 Ogni applicazione ha un’activity principale che viene
impostata come punto di ingresso dell’app
Stati delle Activity
 Active or Running: entrano in questo stato quando vengono poste un foreground. Sono considerate al top dello stack delle activity. Possono essere terminate dal sistema
solo se UI diventa non responsiva o per eccesso di allocazione di memoria
 Paused: un’activity entra in questo stato se il device entra nello stato di sleep mode o quando viene era in forgreound e viene sostituita da un’altra. Le activity nello stato
Paused sono sempre vive e mantengono loro stato. L’activity viene parzialmente oscurata all’utente.
 Stopped: un’activity paused può entrare e nello stato stopped se ha completato la sua esecuzione e non è più visibile dall’utente, il sistema tende a scegliere le activity per
liberare risorse necessarie al sistema
 Restarted: una qualsiasi activity stopped o paused può essere ripristinata se l’utente lo richiede viene ripristinata con lo stato che aveva memorizzato
Lifecycle delle activity
Metodi delle Activity (1)
 OnCreate è il metodo che viene chiamato subito dopo la creazione dell’activity
 Bundle un dizionario viene utilizzato per lo scambio dati e per salvare lo stato dell’activity e per lo scambio dati tra activity
 In questa fase viene impostato il layout tramite il metodo SetContentView e nome della risorsa di layout
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
}
Metodi delle Activity (2)
 OnStart() viene chiamato quando l’activity diventa visibile all’utente
 OnResume() viene chiamato quando l’utent inizia a interagire con l’activity
 OnPause() viene chiamato quando app entra nello stato paused
 OnStop() viene chiamato quando l’app non è più visibile all’utente
 OnRestart() viene chiamato quando un’activity riparte dopo essere stata fermata
Es. Start Activity (1)
 Qui riporto un esempio di come poter implementare una
parte dell’applicazione in maniera nativa nel caso la libreria
di Xamarin forms non fosse sufficiente a rispettare le
specifiche applicative
 In questi casi si fa uso DependencySevice come visto in
precedenza, in modo da implementare diversamente la
parte che stiamo costruendo su i vari sistemi
Metodi delle Activity (4)
 Ora vado ad implementare l’interfaccia aggiungendo nel
progetto Android la classe, aggiungendola come servizio di
dependecy injection
using Android.Content;
using AppXamarinAndroid.Droid;
using Xamarin.Forms;
[assembly: Dependency(typeof(NativePages))]
namespace AppXamarinAndroid.Droid
{
public class NativePages : INativePages
{
public NativePages()
{
}
public void StartAc()
{
var intent = new Intent(Forms.Context, typeof(ActivityTwo));
Forms.Context.StartActivity(intent);
}
}
}
Metodi delle Activity (5)
 Nel progetto PCL MainPage.xaml aggiungo un pulsante
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppXamarinAndroid"
x:Class="AppXamarinAndroid.MainPage">
<StackLayout>
<Button Text="Go to native" Clicked="Button_Clicked"></Button>
</StackLayout>
</ContentPage>
Metodi delle Activity (6)
 Nel progetto PCL in MainPage.cs aggiunto
l’implementazione dell’evento che lancia l’activity
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void Button_Clicked(object sender, EventArgs e)
{
Xamarin.Forms.DependencyService.Register<INativePages>();
DependencyService.Get<INativePages>().StartAc();
}
}
Metodi delle Activity (7)
Xamarin.Essentials (1)
 Xamarin presenta una serie di API che permetto di accedere a feature e hardware dei sistemi in maniera unificata, le più importanti sono
 Accelerometer permette di ottenere dati nello spazio tridimensionale
 App Information permette di recuperare le informazioni riguardanti l’applicazione
 Barometer monitorare i dati del barometro per la pressione
 Battery conoscere il livello e lo stato della batteria
 Clipboard per leggere o scrivere facilmente sulla clipboard
 Color Converter convertitore di codici di colore nelle varie codifiche
 Connectivity controllare lo stato e cambiamenti di connettività
 Detect shake intercettare un movimento di shake
 Device Display Information conoscere le metriche dello schermo
 Device information trovare le informazioni del device
 Email inviare email in maniera semplice
Xamarin.Essentials (2)
 FlashLight permette di utilizzare il flash
 Geocoding permette di geocoding e il reverse geocoding
 Geolocation recuperare la posizione tramite GPS
 Gyroscope rotazione del device attorno ai tre assi primari
 Launcher permette di chiamare un URI nel device, utilizzando un custom uri scheme ad es. per lanciare un app disponibile su device
 Magnetometer conoscere l’orientamento rispetto all’asse magnetico terrestre
 Connectivity controllare lo stato e cambiamenti di connettività
 Open Browser aprire il browser a una determinata URL
 Orientation Sensor conoscere l’orientamento del device nello spazio 3D
 Preferences memorizzare e leggere in maniera persistente le impostazioni di un’applicazione
 Secure Storage memorizzare dai in maniera sicura
 Share condividere testo o URI con altre app
Invio Email Xamarin.Essential (1)
 Requisti Android
 Xamarin.Essentials supporta Android 4.4 o superiori
 Target Android version 8.1, API level 27.
 Un’app di invio mail come Gmail o Outlook disponibile su device
Invio Email Xamarin.Essential (2)
 Scaricare e installare se non già presente
Xamarin.essentials da Nuget su tutti i progetti
 Impostare in MainActivity.cs nel progetto Android
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[]
grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
Invio Email Xamarin.Essential (3)
 Aggiungere nel progetto PCL la classe EmailSenderusing System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
namespace AppSentEmail
{
public class EmailSender
{
public async Task SendEmail(string subject, string body, List<string> recipients)
{
var message = new EmailMessage
{
Subject = subject,
Body = body,
To = recipients,
};
await Email.ComposeAsync(message);
}
}
}
Invio Email Xamarin.Essential (4)
 Nel progetto PCL in MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppSentEmail"
x:Class="AppSentEmail.MainPage">
<StackLayout>
<Button Text="Send" Clicked="Button_Clicked">
</Button>
</StackLayout>
</ContentPage>
Invio Email Xamarin.Essential (4)
 Nel progetto PCL in MainPage.xaml.cs
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void Button_Clicked(object sender, EventArgs e)
{
EmailSender emailSender = new EmailSender();
List<string> list = new List<string>();
list.Add("yourname@yourdomain");
try
{
await emailSender.SendEmail("test", "this is a test from xamarin ", list);
}
catch (FeatureNotSupportedException fbsEx)
{
// Email is not supported on this device
await DisplayAlert("Alert", "Please install app supports send email feature", "OK");
}
catch (Exception ex)
{
// Some other exception occurred
await DisplayAlert("Error", ex.Message, "OK");
}
Invio Email Xamarin.Essentials (5)
Es. Lettore barcode (1)
 Il lettore barcode non è presente su Xamarin.Essentials.
 Questo esempio sfrutta un pacchetto Nuget
 Requisiti
 Pacchetto nuget Zxing.Net.Mobile e Zxing.Net.Mobile.Forms
 Permessi Android
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.FLASHLIGHT" />
Es. Lettore barcode (2)
 Nel progetto Android inserire nel metodo onCreate della
MainActivity
 Zxing.Net.Mobile.Forms.Android.Platform.Init();
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
ZXing.Net.Mobile.Forms.Android.Platform.Init();
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
Es. Lettore barcode (3)
 Aggiunta della richiesta di permessi nel progetto Android
protected override void OnResume()
{
base.OnResume();
if (ZXing.Net.Mobile.Android.PermissionsHandler.NeedsPermissionRequest(this))
ZXing.Net.Mobile.Android.PermissionsHandler.RequestPermissionsAsync(this);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[]
grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
global::ZXing.Net.Mobile.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
Es. Lettore barcode (4)
 Nel progetto PCL MainPage.xaml imposto la pagina a full screen per la scansione barcode e imposto come metodo che intercetta il risultato
Handle_OnScanResult
<?xml version="1.0" encoding="utf-8" ?>
<zxing:ZXingScannerPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppBarcode"
xmlns:zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"
x:Class="AppBarcode.MainPage"
Title="Full screen" OnScanResult="Handle_OnScanResult" IsScanning="true">
</zxing:ZXingScannerPage>
Es. Lettore barcode (5)
 Nel progetto PCL MainPage.xaml.cs intecetto il codice
risultante e lo mostro a schermo
public partial class MainPage : ZXingScannerPage
{
public MainPage()
{
InitializeComponent();
}
public void Handle_OnScanResult(Result result)
{
Device.BeginInvokeOnMainThread(async () =>
{
await DisplayAlert("Scanned result", result.Text, "OK");
});
}
}
Es. Lettore barcode (6)

Xamarin.android

  • 1.
  • 2.
    Focus  Xamarin.Android esponela versione completa di Android SDK per gli sviluppatori .NET.  Permette di creare app Android completamente native con C# o F# in Visual Studio.
  • 3.
    Activity Lifecycle  Activityo schermata è una concetto specifico di android  Activity possiede un metodo onCreate da dove parte il programma di ogni activity  Ogni Activity può lanciare un’altra activity  Ogni applicazione ha un’activity principale che viene impostata come punto di ingresso dell’app
  • 4.
    Stati delle Activity Active or Running: entrano in questo stato quando vengono poste un foreground. Sono considerate al top dello stack delle activity. Possono essere terminate dal sistema solo se UI diventa non responsiva o per eccesso di allocazione di memoria  Paused: un’activity entra in questo stato se il device entra nello stato di sleep mode o quando viene era in forgreound e viene sostituita da un’altra. Le activity nello stato Paused sono sempre vive e mantengono loro stato. L’activity viene parzialmente oscurata all’utente.  Stopped: un’activity paused può entrare e nello stato stopped se ha completato la sua esecuzione e non è più visibile dall’utente, il sistema tende a scegliere le activity per liberare risorse necessarie al sistema  Restarted: una qualsiasi activity stopped o paused può essere ripristinata se l’utente lo richiede viene ripristinata con lo stato che aveva memorizzato
  • 5.
  • 6.
    Metodi delle Activity(1)  OnCreate è il metodo che viene chiamato subito dopo la creazione dell’activity  Bundle un dizionario viene utilizzato per lo scambio dati e per salvare lo stato dell’activity e per lo scambio dati tra activity  In questa fase viene impostato il layout tramite il metodo SetContentView e nome della risorsa di layout protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); }
  • 7.
    Metodi delle Activity(2)  OnStart() viene chiamato quando l’activity diventa visibile all’utente  OnResume() viene chiamato quando l’utent inizia a interagire con l’activity  OnPause() viene chiamato quando app entra nello stato paused  OnStop() viene chiamato quando l’app non è più visibile all’utente  OnRestart() viene chiamato quando un’activity riparte dopo essere stata fermata
  • 8.
    Es. Start Activity(1)  Qui riporto un esempio di come poter implementare una parte dell’applicazione in maniera nativa nel caso la libreria di Xamarin forms non fosse sufficiente a rispettare le specifiche applicative  In questi casi si fa uso DependencySevice come visto in precedenza, in modo da implementare diversamente la parte che stiamo costruendo su i vari sistemi
  • 9.
    Metodi delle Activity(4)  Ora vado ad implementare l’interfaccia aggiungendo nel progetto Android la classe, aggiungendola come servizio di dependecy injection using Android.Content; using AppXamarinAndroid.Droid; using Xamarin.Forms; [assembly: Dependency(typeof(NativePages))] namespace AppXamarinAndroid.Droid { public class NativePages : INativePages { public NativePages() { } public void StartAc() { var intent = new Intent(Forms.Context, typeof(ActivityTwo)); Forms.Context.StartActivity(intent); } } }
  • 10.
    Metodi delle Activity(5)  Nel progetto PCL MainPage.xaml aggiungo un pulsante <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:AppXamarinAndroid" x:Class="AppXamarinAndroid.MainPage"> <StackLayout> <Button Text="Go to native" Clicked="Button_Clicked"></Button> </StackLayout> </ContentPage>
  • 11.
    Metodi delle Activity(6)  Nel progetto PCL in MainPage.cs aggiunto l’implementazione dell’evento che lancia l’activity public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } private void Button_Clicked(object sender, EventArgs e) { Xamarin.Forms.DependencyService.Register<INativePages>(); DependencyService.Get<INativePages>().StartAc(); } }
  • 12.
  • 13.
    Xamarin.Essentials (1)  Xamarinpresenta una serie di API che permetto di accedere a feature e hardware dei sistemi in maniera unificata, le più importanti sono  Accelerometer permette di ottenere dati nello spazio tridimensionale  App Information permette di recuperare le informazioni riguardanti l’applicazione  Barometer monitorare i dati del barometro per la pressione  Battery conoscere il livello e lo stato della batteria  Clipboard per leggere o scrivere facilmente sulla clipboard  Color Converter convertitore di codici di colore nelle varie codifiche  Connectivity controllare lo stato e cambiamenti di connettività  Detect shake intercettare un movimento di shake  Device Display Information conoscere le metriche dello schermo  Device information trovare le informazioni del device  Email inviare email in maniera semplice
  • 14.
    Xamarin.Essentials (2)  FlashLightpermette di utilizzare il flash  Geocoding permette di geocoding e il reverse geocoding  Geolocation recuperare la posizione tramite GPS  Gyroscope rotazione del device attorno ai tre assi primari  Launcher permette di chiamare un URI nel device, utilizzando un custom uri scheme ad es. per lanciare un app disponibile su device  Magnetometer conoscere l’orientamento rispetto all’asse magnetico terrestre  Connectivity controllare lo stato e cambiamenti di connettività  Open Browser aprire il browser a una determinata URL  Orientation Sensor conoscere l’orientamento del device nello spazio 3D  Preferences memorizzare e leggere in maniera persistente le impostazioni di un’applicazione  Secure Storage memorizzare dai in maniera sicura  Share condividere testo o URI con altre app
  • 15.
    Invio Email Xamarin.Essential(1)  Requisti Android  Xamarin.Essentials supporta Android 4.4 o superiori  Target Android version 8.1, API level 27.  Un’app di invio mail come Gmail o Outlook disponibile su device
  • 16.
    Invio Email Xamarin.Essential(2)  Scaricare e installare se non già presente Xamarin.essentials da Nuget su tutti i progetti  Impostare in MainActivity.cs nel progetto Android protected override void OnCreate(Bundle savedInstanceState) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } }
  • 17.
    Invio Email Xamarin.Essential(3)  Aggiungere nel progetto PCL la classe EmailSenderusing System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Xamarin.Essentials; namespace AppSentEmail { public class EmailSender { public async Task SendEmail(string subject, string body, List<string> recipients) { var message = new EmailMessage { Subject = subject, Body = body, To = recipients, }; await Email.ComposeAsync(message); } } }
  • 18.
    Invio Email Xamarin.Essential(4)  Nel progetto PCL in MainPage.xaml <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:AppSentEmail" x:Class="AppSentEmail.MainPage"> <StackLayout> <Button Text="Send" Clicked="Button_Clicked"> </Button> </StackLayout> </ContentPage>
  • 19.
    Invio Email Xamarin.Essential(4)  Nel progetto PCL in MainPage.xaml.cs public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } private async void Button_Clicked(object sender, EventArgs e) { EmailSender emailSender = new EmailSender(); List<string> list = new List<string>(); list.Add("yourname@yourdomain"); try { await emailSender.SendEmail("test", "this is a test from xamarin ", list); } catch (FeatureNotSupportedException fbsEx) { // Email is not supported on this device await DisplayAlert("Alert", "Please install app supports send email feature", "OK"); } catch (Exception ex) { // Some other exception occurred await DisplayAlert("Error", ex.Message, "OK"); }
  • 20.
  • 21.
    Es. Lettore barcode(1)  Il lettore barcode non è presente su Xamarin.Essentials.  Questo esempio sfrutta un pacchetto Nuget  Requisiti  Pacchetto nuget Zxing.Net.Mobile e Zxing.Net.Mobile.Forms  Permessi Android  <uses-permission android:name="android.permission.CAMERA" />  <uses-permission android:name="android.permission.FLASHLIGHT" />
  • 22.
    Es. Lettore barcode(2)  Nel progetto Android inserire nel metodo onCreate della MainActivity  Zxing.Net.Mobile.Forms.Android.Platform.Init(); protected override void OnCreate(Bundle savedInstanceState) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); ZXing.Net.Mobile.Forms.Android.Platform.Init(); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); }
  • 23.
    Es. Lettore barcode(3)  Aggiunta della richiesta di permessi nel progetto Android protected override void OnResume() { base.OnResume(); if (ZXing.Net.Mobile.Android.PermissionsHandler.NeedsPermissionRequest(this)) ZXing.Net.Mobile.Android.PermissionsHandler.RequestPermissionsAsync(this); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); global::ZXing.Net.Mobile.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
  • 24.
    Es. Lettore barcode(4)  Nel progetto PCL MainPage.xaml imposto la pagina a full screen per la scansione barcode e imposto come metodo che intercetta il risultato Handle_OnScanResult <?xml version="1.0" encoding="utf-8" ?> <zxing:ZXingScannerPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:AppBarcode" xmlns:zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms" x:Class="AppBarcode.MainPage" Title="Full screen" OnScanResult="Handle_OnScanResult" IsScanning="true"> </zxing:ZXingScannerPage>
  • 25.
    Es. Lettore barcode(5)  Nel progetto PCL MainPage.xaml.cs intecetto il codice risultante e lo mostro a schermo public partial class MainPage : ZXingScannerPage { public MainPage() { InitializeComponent(); } public void Handle_OnScanResult(Result result) { Device.BeginInvokeOnMainThread(async () => { await DisplayAlert("Scanned result", result.Text, "OK"); }); } }
  • 26.