Xamarine ile C# Kullanarak Android Uygulamaları Geliştirmek

Giriş

Aşağıdaki yazı kitabın 2. baskısında eklenmiş olan Xamarine ve Monodroid konusundan bir alıntıdır. İzinsiz kopyalanıp kullanılamaz.

Pek çok C# programcısının hayali farklı bir dil (Swift, Objective-C, Java) öğrenmeden hali hazırda kullandıkları C# dilini ve geliştirme aracını yani Visual Studio’yu kullanarak Android ve iOS platformlarında uygulama geliştirmek. Aslında uzunca bir süredir Xamarine isimli firmanın geliştirdiği Monodroid (Mono for Android) ve Monotouch isimli cross platform araçlar ile bunu gerçekleştirmek zaten mümkündü. Diğer taraftan 2015 sürümüyle birlikte Microsoft, Xamarine isimli firma ile farklı bir ortaklık yaparak Visual Studio IDE’sine söz konusu cross platform araçları entegre etti. Böylece Xamarine Studio dışında Visual Studio ile de cross uygulamaların geliştirilmesi mümkün hale getirildi. Bu başlık altında fazla detaya girmeden Xamarine seçeneğini merak eden ve kullanmayı düşünen okuyuculara gerekli ön bilgiler verilmeye çalışılacaktır.

Mono; Windows dışındaki farklı işletim sistemlerinde .NET uygulamaları yazmak ve çalıştırmak için geliştirilmiş bir C# derleyicisi ve CLR altyapısı sağlayan açık kaynak kodlu bir .NET framework projesi idi. 2004 yılında ilk versiyonu çıkan bu framework Linux ve BSD gibi sistemler tarafından desteklenmişti. 2011 ilkbaharında ise Mono for Android’in ilk versiyonu dağıtıldı.

Benzerlik ve Farklılıkların Değerlendirilmesi

Xamarine ile Android uygulaması geliştirmek isteyen bir programcının, bu süreçte Java + Android Studio ile uygulama geliştirmeye göre bazı farklılıklar ile karşılaşması kaçınılmazdır.

  1. Monodroid framework’ü, C# diline ait property, attribute kullanımı, partial anahtar sözcüğü, delegate ve event kullanımı gibi bazı faydalı özelliklerden yararlanmaktadır.
  2. Kaynakların programatik olarak kullanılmasını sağlayan R sınıfı, Monodroid’te yerini Resource isimli bir sınıfa bırakmaktadır. Bu sınıf da (R ile benzer şekilde) IDE tarafından üretilmektedir. Kodu Resource.Designer.cs dosyası içerisinde yer almaktadır.
  3. Activity’lerin deklaratif tasarımı için kullanılan XML kodları “.axml” uzantılı dosyalarda bulunmaktadır.
  4. Android’in Activity, Fragment, View, XxxLayout gibi sınıfları yani kısaca Android kütüphaneleri Monodroid’te de aynı şekilde kullanılmaktadır. Bu nedenle Monodroid seçeneğine yönelmek isteyen bir okuyucunun .NET platformuna ait WPF, Windows Form, ADO.NET, Entity Framework gibi teknolojilerden faydalanamayacağını ve yine Android’in kendi kütüphanelerini öğrenmesi gerekeceğini hatırında tutmalıdır. Buna karşın DateTime bazı temel .NET sınıf ve yapıları Monodroid’te de kullanılabilmektedir.

Demo

Aşağıdaki örnek uygulamada Monodroid kullanılarak basit bir Android uygulaması geliştirilmiş ve emülatör üzerinde çalıştırılmıştır.

///// Strings.xml //////

<?xml version=”1.0″ encoding=”utf-8″?>

<resources>

<string name=”btn_text”>Deneme</string>

<string name=”ApplicationName”>MonoSample</string>

<string name=”dlg”>OKAY</string>

<string name=”dlg_res”>Diyalog kapatıldı</string>

</resources>

///// Main.axml //////

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

android:orientation=”vertical”

android:layout_width=”fill_parent”

android:layout_height=”fill_parent”

>

<Button

android:id=”@+id/btn”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:text=”@string/btn_text”

/>

<TextView

android:id=”@+id/txt”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”…”

/>

</LinearLayout>

/////// MainActivity.cs //////////

using System;

using Android.App;

using Android.Content;

using Android.Runtime;

using Android.Views;

using Android.Widget;

using Android.OS;

namespace MonoSample

{

[Activity(Label = “MonoSample”, MainLauncher = true,
Icon = “@drawable/icon”)]

public class MainActivity : Activity

{

private Button btn;

private TextView txt;

private void init()

{

btn = this.FindViewById<Button>(Resource.Id.btn);

txt = (TextView) this.FindViewById(Resource.Id.txt);

}

private void registerHandlers()

{

btn.Click += btn_Click;

}

protected override void OnCreate(Bundle bundle)

{

base.OnCreate(bundle);

SetContentView(Resource.Layout.Main);

init();

registerHandlers();

}

protected void btn_Click(object sender, EventArgs ea)

{

this.Title = DateTime.Now.ToString();

txt.Text = “Deneme!!!”;

Toast.MakeText(this, “Android Derneği”,
ToastLength.Long).Show();

AlertDialog.Builder msg =
new AlertDialog.Builder(this);

msg.SetMessage(“Aykut Taşdelen”);

msg.SetTitle(“BAU”);

msg.SetPositiveButton(Resource.String.dlg,
onOKAY);

msg.Show();

}

private void onOKAY(object sender,DialogClickEventArgs e)

{

txt.SetText(Resource.String.dlg_res);

}

}

}

Önemli Noktalar:

Görüldüğü gibi Strings.xml yine uygulamadaki metinlerin kaynak haline getirildiği dosyadır. Bu dosya ile ilgili herhangi bir değişiklik göze çarpmamaktadır. Öte yandan aktivite için deklaratif tasarımın yapıldığı dosyada içerik anlamında farklı bir durum gözlenmezken uzantısının “.axml” olması dikkati çekmelidir.

C# kodundaki init() fonksiyonu GUI nesnelerinin yaratılması amacıyla yazılmıştır. Burada kullanılmış olan FindViewById() fonksiyonunun Java’dan farklı olarak generic bir wrapper’ı bulunmaktadır. Bu sayede tür dönüştürmesine gerek kalmadan Button nesnesi yaratılmıştır. TextView için ise okuyucunun karşılaştırma yapabilmesi için konvansiyonel şekli kullanılmıştır.

Butona ait click event’inin handle edilmesi amacıyla “implicit delegate” kullanılmış olması dikkat çekicidir. Zira bu mekanizma Java’da bulunmamaktadır.

Aktivite başlığına tarih/zaman bilgisinin yazdırılması noktasında gerek Title property’sinin kullanımı gerekse de DateTime structure’ının kullanılmış olması C# dil özelliklerinin Android geliştirmeye katkısı olarak değerlendirilebilir.

Toast kullanımında ciddi bir farklılık göze çarpmazken, AlertDialog için aynı yorumu yapmak güçtür. Zira özellikle alert diyalog üzerindeki butonun event’inin yakalanış biçimi Java’daki şeklinden oldukça farklıdır.

Sonuç

Monodroid kullanılarak yazılan Android uygulamaları için her ne kadar C# ve Visual Studio kullanılıyor olsa da sonuçta uygulamalar CLR üzerinde değil Dalvik sanal makinesi üzerinde çalışmaktadırlar. Bu nedenle aradaki bir dönüştürücü mekanizma yazılan kodları Java byte koduna dönüştürmek zorundadır. Bu mekanizmanın bir performans maliyetine neden olacağı aşikardır.

Öte yandan Monodroid tercihi bellek kullanımını da olumsuz etkilemektedir çünkü kullanılan her nesne aslında Java heap tarafındaki orijinali ve Monodroid heap tarafındaki proxy nesnesi ile birlikte yaratılmaktadır. Buna bağlı olarak garbage collection (çöp toplama) işlemi de kaçınılmaz şekilde daha yavaş gerçekleşmektedir.

Reklamlar