-- Android, Programlama

Android’de ekranlar (activity) arası iletişim yöntemleri

Merhabalar, bu yazımda android uygulamalarında ekranlar arası iletişim yapısından bahsedeceğim. Ekranlar arası iletişim android uygulamalarının akışında sıklıkla ihtiyaç duyulan bir işleyiştir. Bir activity’de yapılan işin sonucunun sonraki activity’e aktarılması veya bir spesifik amaçla açılmış bir activity’nin ürettiği sonucu onu çağıran activity’e geri döndürmesi için özelleşmiş olan bir yapıdan bahsedeceğim.

Intent : Intent android geliştiriciliğinde önemli bir kavramdır. Türkçe’de niyet, amaç anlamına gelen intent, adına yakışır biçimde bir amacı belirtmesi için kullanılan sınıftır. Intent kullanılarak aynı uygulamadaki iki ekran arasında, farklı uygulamalar arasında, sistem ve uygulamalar arası gibi iletişim ve veri alışverişi yöntemlerini gerçekleştirebilirsiniz.

Intentler iki çeşide ayrılır. Örtük (implicit)  ve açık (explicit) intent. Örtük intent’lerde bir amaç vardır fakat bu amacı gerçekleştirilecek uygulama kesin olarak belirtilmez. Örneğin uygulamanızın bir noktasında kullanıcıdan fotoğraf çekmesini istediğinizi varsayın. Bu isteğinizi örtük (implicit) intent oluşturarak belirtebilirsiniz. Android bu isteğinizi işler ve bu isteğinize hizmet veren uygulamaların listesini kullanıcıya sunar. Eğer tek bir uygulama bu hizmeti veriyorsa seçenek sunmadan o uygulamayı başlatır. Fotoğraf çekme isteğinizi işleyen Kamera uygulaması, işlem tamamlandığında uygulamanıza bilgi ve varsa veriyi gönderir. Bir yazıyı paylaşmak istediğinizde karşınıza çıkan menüyü hatırlayın, bu işlem de bir örtük intent ile başlatılmaktadır.

Açık intent, örtük intent aksine hedef sınıfı (ekranı,servisi) belli olan intent biçimidir. Parametre olarak başlatacağı sınıfın ismini alır.

Aşağıda aşama aşama anlatmış olduğum örnekte, açık intent uygulaması gerçekleştireceğiz. Birinci ekranda kullanıcıdan iki sayı alacağız, aldığımız bu iki sayıyı ikinci ekrana göndereceğiz. İkinci ekranda bu iki sayı ile yapılacak işlemi kullanıcıya seçtireceğiz (toplama,çıkarma,çarpma,bölme). Sonra bu işlemi gerçekleştirip üretilen sonucu ilk ekrana geri gönderip ekranda görüntüleyeceğiz. Yazının sonunda örnek proje kodlarını da bulabilirsiniz.

Aşamalar : 

1 . Yeni bir proje oluşturun.

2 . Proje oluştururken ilk activity isminizi “FirstActivity” olarak seçebilirsiniz.

3. “SecondActivity” isimli ikinci bir activity oluşturun.

4 . FirstActivity için tasarım ekranına geçerek, iki tane EditText ve bir tane buton, ve ikinci ekrandan dönecek işlem sonucunu göstermek için bir tane de TextView ekliyoruz. Sonra bunları Java kodunda kullanabilmek üzere tanımlıyoruz.Tanımlama sonrası ekran görünümü, ekran xml kodları aşağıdadır.

FirstActivity Design View

FirstActivity Design View

Bu ekrana ait tasarım kodları :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ersinyildiz.app.activityinteractions.FirstActivity" android:background="#FFD740">

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Number that returns second activity" android:typeface="sans" android:textColor="#1E88E5" android:textStyle="bold" android:textSize="21dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="81dp" />

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="NaN" android:id="@+id/txtActivityResultData" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="39dp" android:textColor="#FFFFFF" android:textStyle="bold" android:textIsSelectable="false" android:textSize="28dp" />

    <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number" android:ems="10" android:id="@+id/etSecondNumber" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="39dp" android:hint="First Number" />

    <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number" android:ems="10" android:id="@+id/etFirstNumber" android:layout_below="@+id/etSecondNumber" android:layout_centerHorizontal="true" android:hint="Second Number" />

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Get Result" android:id="@+id/btnGetResult" android:layout_centerVertical="true" android:layout_centerHorizontal="true" />
</RelativeLayout>

Tasarım tamamlandıktan sonra Java kodlarına geçip tasarımdaki bileşenleri tanımlıyoruz. Bileşenlerin tanımlanmasından sonra butona tıklandığında çağırılacak olan OnButtonClick methodunu yazıyoruz. Method içinde değerler alınıyor, Intent objesi oluşturulup değerler intent içine  key-value çiftleri şeklinde ekleniyor. Diğer activity başlatılırken normalden farklı olarak startActivityForResult methodunun kullanıldığına dikkat ediniz. Diğer ekrandan bir veri alma amacıyla başlatma işlemleri bu şekilde yapılmaktadır. Ayrıca başlatım yapılırken, kendi belirlediğiniz bir sayısal değeri request code olarak göndermeniz gerekmektedir. Bu değer sonuç döndüğünde dönen sonucun hangi isteğin sonucu olduğuna karar vermede kullanılmaktadır. Aşağıda OnButtonClick methodunun kodlarını bulabilirsiniz. Bu methodu yazdıktan sonra tasarım ekranında butonunun onClick özelliğini değiştirmeyi unutmayın.


    public void OnButtonClick(View v){
        int num1 = Integer.valueOf(numberFirst.getText().toString());
        int num2 = Integer.valueOf(numberSecond.getText().toString());

        // Explicit (Açık) Intent
        Intent explicitIntent = new Intent(FirstActivity.this, SecondActivity.class);

        // Push data (Optional)
        explicitIntent.putExtra("Value1",num1);
        explicitIntent.putExtra("Value2",num2);

        startActivityForResult(explicitIntent,REQUEST_ARITHMETIC_OPERATION);
    }

Bu işlemden sonra ilk ekranda yapılacak son bir şey kalıyor. O da, diğer ekrandan dönen sonucu yakalayacağımız OnActivityResult methodunu override etmek. Diğer ekranda işlem tamamlanıp, ekran kapandığında çağıran ekranın OnActivityResult methodu çalıştırılır. Bu methodda requestCode, resultCode ve resultIntent değerlerini parametre olarak göreceksiniz. requestCode hangi isteğe yanıt verildiğini belirtir. resultCode Result_OK ve RESULT_CANCELED değerlerini alır, işlemle ilgili bilgi verir. resultIntent ise diğer ekrandan dönen veriyi barındırır. Değerlerin alınması ve işlenmesini aşağıdaki koddan inceleyebilirsiniz.

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        if(requestCode == REQUEST_ARITHMETIC_OPERATION){
            if(resultCode == RESULT_OK){
                int result = data.getIntExtra("result",0);
                resultText.setText(String.valueOf(result));
            }
        }
    }

Birinci ekranda yapmamız gereken işleri tamamladık. Şimdi ikinci ekranımızı “SecondActivity.java” üretip tasarımını yapalım. Örnek tasarım, tasarım kodları ve SecondActivity java kodları aşağıdadır. SecondActivity içinde, onCreate methodunda diğer activity’den gelen değerleri okuyoruz. Her buton için birer method tanımladıktan sonra bunları butonlara bağlıyoruz. SetResultAndFinish methodu ise sonucu üretip intent içine ekleyerek bu ekranı sonlandırıyor ve FirstActivity geri çağırılıyor.

Screen Shot 2016-03-22 at 00.02.56

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ersinyildiz.app.activityinteractions.SecondActivity" android:background="#d32f2f">

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Received numbers : " android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" />

    <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:layout_marginTop="43dp">

        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" android:id="@+id/button" />

        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-" android:id="@+id/button2" />

        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="x" android:id="@+id/button3" />

        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="/" android:id="@+id/button4" />
    </LinearLayout>
</RelativeLayout>

public class SecondActivity extends AppCompatActivity {

    private int number1,number2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        number1 = getIntent().getIntExtra("Value1",0);
        number2 = getIntent().getIntExtra("Value2",0);

    }

    public void OnPlusClicked(View v){
        SetResultAndFinish(number1 + number2);
    }
    public void OnMinusClicked(View v){
        SetResultAndFinish(number1 - number2);
    }
    public void OnCrossClicked(View v){
        SetResultAndFinish(number1 * number2);
    }
    public void OnDivideClicked(View v){
        SetResultAndFinish(number1 / number2);
    }
    public void SetResultAndFinish(int result){
        Intent resultIntent = new Intent();
        resultIntent.putExtra("result",result);
        setResult(RESULT_OK,resultIntent);
        finish();
    }
}

Proje dosyasını indirmek için aşağıdaki bağlantıyı kullanabilirsiniz. Veya projenin github sayfasına göz atabilirsiniz.

https://github.com/eyildiz/AndroidActivityInteractions
ActivityInteractions.zip

Yorumla

Yorum

    • Aslında belirtsem yerinde olurmuş, sorunuzu gördükten sonra uzunca açıklayacaktım, onun yerine yazı haline getirip daha fazla yere ulaştırayım istedim. Bir yazı yazmak aklımdaydı, sorunuz sebep oldu. Aslında bu kadar uzun planlamıyordum, video ile 5dk sürecek konu yazınca epey uzuyor. İşinize yaramıştır umarım, iyi çalışmalar.

  1. Bugune kadar “StartActivity” kullaniyordum, simdi “startActivityForResult” ile aradaki farkida ögrenmis oldum.