2. 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.
3. 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
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
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();
}
}
13. 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
14. 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
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");
}
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");
});
}
}