Faaliyet ve hizmet arasında veri geçişi. Faaliyet ve Hizmet Arasındaki İletişim

Uygulama her zaman tek bir ekrandan oluşmuyor. Örneğin, biz çok yarattık faydalı program ve kullanıcı yazarın kim olduğunu bilmek ister. “Hakkında” düğmesine tıklar ve programın sürümü, yazar, site adresi, yazarın kaç kedisi olduğu vb. hakkında faydalı bilgilerin bulunduğu yeni bir ekrana gelir. Bir aktivite ekranını, başka bir sayfaya bağlantı içeren bir web sayfası olarak düşünün. Dosyadaki koda bakarsanız MainActivity.javaönceki derslerden, bizim sınıfımızın Ana aktivite için de geçerlidir Aktivite(veya mirasçıları) veya daha doğrusu ondan miras alınır.

Genel sınıf MainActivity, AppCompatActivity'yi genişletir

Tahmin edebileceğiniz gibi, şuna benzeyebilecek yeni bir sınıf oluşturmalıyız. Ana aktivite ve sonra bir şekilde düğmeye tıklayarak ona geçin.

Deney için ilk dersten programı alıp deneyler için (veya oluştur) butonunu kullanacağız. yeni proje ekrandaki bir düğme ile). Ardından, oluşturalım yeni form göstermek kullanışlı bilgi. Örneğin kullanıcıya kedinin sağa sola gittiğinde ne yaptığını gösterelim. Katılıyorum, çok önemli bilgi, bu da evreni çözmenin anahtarını verir.

Stüdyonun hazır şablonları olmasına rağmen manuel olarak yeni bir aktivite oluşturacağız. Ancak karmaşık bir şey yok ve daha iyi anlamak için her şeyi elle yapmakta fayda var.

Yeni bir XML biçimlendirme dosyası oluşturalım aktivite_about.xml klasörde res/düzen. Klasöre sağ tıklayın Yerleşim ve arasından seçim yap bağlam menüsü Yeni | Düzen kaynak dosyası. Bir iletişim kutusu belirecektir. İlk alana dosya adını girin aktivite_about. İkincisinde, kök öğeyi girmeniz gerekir. Varsayılan olarak orada Kısıtlama Düzeni. Metni silin ve girin kaydırma görünümü. Stüdyonun hazır seçenekler önermesi için birkaç karakter girmek yeterlidir, kelimenin tam girişini beklemeden hemen Enter tuşuna basabilirsiniz:

Elemanı yerleştirdiğimiz ilgili boşluğu alıyoruz Metin görünümü.

Bilgiler kaynaklardan, yani bir dizi kaynağından alınacaktır. about_text. Şimdi bilgi yokluğunu gösteren kırmızıyla vurgulanır. basılabilir Alt+Enter ve diyalog kutusuna metin girin. Ancak örneğimiz için, metnimiz kontrol karakterlerini kullanarak çok satırlı olacağından bu yöntem çalışmayacaktır. Öyleyse farklı yapalım. dosyayı açalım res/values/strings.xml ve aşağıdaki metni manuel olarak girin:

Deniz kıyısında yeşil bir meşe;\n O meşede altın bir zincir:\n Gece gündüz bilim adamı kedi\n Her şey zincirin etrafında döner;\n Her şey yolunda gider Sağ- şarkı açılır,\n Ayrıldı- bir peri masalı anlatır.

Gibi en basit HTML metin biçimlendirme etiketlerini kullandık , , . Örneğimiz için kediye ve hareket yönüne atıfta bulunan kelimeleri kalın yazmak yeterlidir. Metni şu dile çevirmek için Yeni hat sembolleri kullan \n. Yeni ekranın başlığı için başka bir string kaynağı ekleyelim:

Program hakkında

İşaretleme ile anlaşıldı. Ardından, pencere için bir sınıf oluşturmanız gerekir. AboutActivity.java. Menüden seçin dosya | Yeni | Java sınıfı ve gerekli alanları doldurun. İlk başta sadece isim belirtmek yeterlidir. Sonra diğer alanlarla ilgilenin.

Gelelim hazırlığa.

Şimdi sınıf neredeyse boş. Kodu manuel olarak ekleyelim. Sınıf, soyut sınıftan miras almalıdır Aktivite veya akrabaları FragmentAktivite, AppCompatActivity vb. Ekleme aktiviteyi genişletir. Activity sınıfının bir metodu olmalıdır. onCreate(). Fare imlecini sınıfın içine getirin ve menüden seçin kod | Geçersiz Kılma Yöntemleri(Ctrl+O). İletişim kutusunda, istenen sınıfı arıyoruz, klavyede ilk karakterleri yazabilirsiniz. hızlı arama. Oluşturulan yöntemde, yöntemi çağırmanız gerekir. setContentView(), hazırlanan işaretlemeyi ekrana yükleyecektir. Böyle bir seçeneğimiz olacak.

Paket en.alexanderklimov.helloworld; android.app.Activity'yi içe aktar; android.os.Bundle'ı içe aktar; /** * Alexander Klimov tarafından 12/01/2014 tarihinde oluşturuldu. */ public class AboutActivity, Activity'yi genişletir ( @Override protected void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )

Şimdi en önemli şey başlıyor. Görevimiz ilk ekranda bir buton tıklandığında yeni bir ekrana geçmektir. hadi sınıfa geri dönelim Ana aktivite. Düğme tıklama işleyicisini yazalım:

Public void onClick(Görünüm görünümü) ( Amaç amacı = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )

Burada derste açıklanan düğme tıklama işleme yöntemini kullandım.

Yeni bir ekran başlatmak için sınıfın bir örneğini oluşturmanız gerekir. niyet ve ilk parametrede mevcut sınıfı ve ikinci parametrede geçiş sınıfını belirtin, buna sahibiz HakkındaEtkinlik. Bundan sonra, yöntem denir startActivity(), bu da yeni bir ekran başlatır.

Şimdi uygulamayı öykünücüde test etmeye çalışırsanız, bir hata mesajı alırsınız. Neyi yanlış yaptık? Önemli bir adımı atladık. Yeni kayıt olmanız gerekiyor Aktivite manifestoda AndroidManifest.xml. Projenizde bu dosyayı bulun ve üzerine çift tıklayın. Dosya düzenleme penceresi açılacaktır. Yeni bir etiket ekle kapanış etiketinden sonra ilk aktivite için. Kendi başınıza yazın ve ipuçlarını aktif olarak kullanın. Aşağıdakileri alacaksınız:

Dize kaynağının kullanışlı olduğu yer burasıdır. about_title. Uygulamayı çalıştırın, düğmeye tıklayın ve pencereyi alın Program hakkında. Böylece yeni bir pencerenin nasıl oluşturulacağını ve bir buton tıklamasıyla nasıl çağırılacağını öğrendik. Ve elimizde çok uygun bir program ortaya çıktı - şimdi kedinin sola gittiğinde ne yaptığına dair her zaman bir ipucu olacak.

Bir kez daha, oluşturulan ikinci aktivite sınıfının sınıftan miras alınması gerektiğine dikkatinizi çekiyorum. Aktivite veya benzeri ( ListActivity vb.), bir XML biçimlendirme dosyasına sahip (gerekirse) ve bildirimde yazılı olmalıdır.

Yöntemi çağırdıktan sonra startActivity() yeni bir aktivite başlayacak (bu durumda HakkındaEtkinlik), görünür hale gelecek ve çalışan bileşenleri içeren yığının en üstüne taşınacaktır. Bir yöntemi çağırırken bitiş() yeni aktiviteden (veya donanım geri al tuşuna basıldığında) kapatılacak ve yığından kaldırılacaktır. Geliştirici, aynı yöntemi kullanarak önceki (veya başka herhangi bir) etkinliğe de gidebilir. startActivity().

Üçüncü bir ekran oluşturmak - tembeller için bir yol

Programcılar, kediler gibi tembel yaratıklardır. Her zaman, aktivite için işaretleme ve miras alan bir sınıf oluşturmanız gerektiğini unutmayın. Aktivite, ve sonra sınıfı manifestoya kaydetmeyi unutmayın - oh iyi, ne olur.

Bu durumda, menüden seçin dosya | Yeni | aktivite | temel aktivite(veya başka bir desen). Ardından, yeni bir aktivite oluşturmak için tanıdık pencere görünecektir. Gerekli alanları doldurun.

düğmesine tıklayın Bitiş ve aktivite hazır olacaktır. Bunu doğrulamak için bildirim dosyasını açın ve yeni girişi kontrol edin. Sınıf dosyalarından ve işaretlemeden bahsetmiyorum, önünüzde görünecekler.

Ana aktivitenin ekranına kendiniz yeni bir buton ekleyin ve oluşturulan aktiviteye gitmek için kodu yazın.

İlk başta, sınıf, işaretleme ve manifest arasındaki ilişkiyi anlamak için yeni bir aktivite için gerekli tüm bileşenleri manuel olarak oluşturmanızı tavsiye ederim. Ve elinize aldığınızda, işleri hızlandırmak için etkinlik oluşturma sihirbazını kullanabilirsiniz.

Aktiviteler arasında veri aktarımı

En basit örneği başka bir etkinlik ekranını çağırmak için kullandık. Bazen sadece yeni bir ekranı çağırmak değil, aynı zamanda ona veri aktarmak da gerekir. Örneğin, kullanıcı adı. Bu durumda, özel bir alan kullanmanız gerekir. extraData, sınıfın sahip olduğu niyet.

Bölge extraData bir çift listesidir anahtar/değer, niyetle birlikte iletilir. Dizeler anahtar olarak kullanılır ve değerler için herhangi bir ilkel veri türünü, ilkel dizileri, sınıf nesnelerini kullanabilirsiniz. demet ve benzeri.

Verileri başka bir etkinliğe iletmek için yöntemi kullanın putExtra():

Intent.putExtra("Anahtar", "Değer");

Alma etkinliği bazı uygun yöntemleri çağırmalıdır: getIntExtra(), getStringExtra() vb.:

Int sayı = getIntent().getIntExtra("ad", 0);

Önceki örneği yeniden yapalım. Halihazırda üç etkinliğimiz var. İlk aktivitede iki metin alanı ve bir düğme olacaktır. Görünüm aşağıdaki gibi olabilir:

İkinci aktivitede İkinci Etkinlik elemanı ayarla Metin görünümü, burada ilk aktiviteden alınan metni görüntüleyeceğiz. Yöntem için aşağıdaki kodu yazalım onCreate() ikinci aktivitede.

@Override protected void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String Gift = "donuthole"; TextView infoTextView = (TextView)findViewById( R .id.textViewInfo); infoTextView.setText(kullanıcı + " , size verildi " + hediye); )

Şimdi programı çalıştırırsak ve makalenin ilk bölümünde açıklandığı gibi ikinci pencereyi çağırırsak, varsayılan yazıtı göreceğiz. ZhYvotnoe, sana bir çörek deliği verildi. Katılıyorum, bu tür mesajları almak oldukça utanç verici.

Durumu düzeltiyoruz. İlk aktiviteye kod ekleyin:

Public void onClick(Görünüm görünümü) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText GiftEditText = (EditText) findViewById(R.id.editTextGift); Amaç niyet = yeni Amaç(MainActivity.this, SecondActivity. class); // ilk metin alanındaki metni kullanıcı adı anahtarına itinint.putExtra("username", userEditText.getText().toString()); // ikinci metin alanındaki metni hediye anahtarına itin Intent.putExtra("gift ", GiftEditText.getText().toString()); startActivity(intent); )

Özel bir nesne kabına yerleştirdik niyet metin alanlarından alınan değerlere sahip iki anahtar. Kullanıcı metin alanlarına veri girdiğinde bu kapsayıcıya düşecek ve ikinci aktiviteye geçilecektir.

İkinci aktivite, aşağıdaki gibi (kalın harflerle vurgulanmıştır) mesajları sıcak bir şekilde almaya hazır olmalıdır.

// Varsayılan değerler String user = "LIFE"; Dize hediyesi = "çörek deliği"; kullanıcı = getIntent().getExtras().getString("kullanıcı adı"); hediye = getIntent().getExtras().getString("hediye"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(kullanıcı + " , size verildi " + hediye);

Şimdi mesaj o kadar rahatsız edici görünmüyor, hatta bazıları için hoş görünüyor. Karmaşık örneklerde, veri işleme sırasında doğrulama eklenmesi istenir. Gibi boş verilerle ikinci bir aktivite başlattığınız durumlar vardır. hükümsüz, bu uygulamayı çökertebilir.

Bizim durumumuzda, bir dize değeri beklediğimizi biliyoruz, bu nedenle kod şu şekilde yeniden yazılabilir:

niyet niyet = getIntent(); kullanıcı=intent.getStringExtra("kullanıcı adı");

Kullanıcı = getIntent().getStringExtra("kullanıcı adı");

Programın bir dezavantajı var - kimden selam aldığımız belli değil. İyi huylu hiçbir maymun, anonim bir kaynaktan gelen hediyeyi kabul etmeyecektir. Bu nedenle ödev için, mesajı gönderen kullanıcının adını girmek için başka bir metin alanı ekleyin.

Google, anahtarlar için şu biçimi kullanmanızı önerir: önek olarak paket adınız, ardından anahtarın kendisi. Bu durumda, diğer uygulamalarla etkileşim kurarken anahtarın benzersiz olduğundan emin olabilirsiniz. Yaklaşık olarak şöyle:

Genel son statik String USER = "ru.alexanderklimov.myapp.USER";

Kedi Vaska'yı kim çerçeveledi - sonucu geri alıyoruz

Verileri başka bir etkinliğe iletmek her zaman yeterli değildir. Bazen başka bir aktivite kapatıldığında ondan bilgi almanız gerekir. Eğer yöntemi daha önce kullandıysak startActivity(Niyet amacı), o zaman ilgili bir yöntem var startActivityForResult(Niyet amacı, int RequestCode). Yöntemler arasındaki fark, ekstra parametrede yatmaktadır. istek kodu. Temelde sadece kendin hakkında düşünebileceğin bir tam sayı. Sonucun kimden geldiğini ayırt etmek için gereklidir. Diyelim ki beş ek ekranınız var ve bunlara 1'den 5'e kadar değerler atadınız ve bu koddan kimin sonucunu işlemeniz gerektiğini belirleyebilirsiniz. -1 değerini kullanabilirsiniz, o zaman yöntemi çağırmaya eşdeğer olacaktır. startActivity(), yani sonuç alamayacağız.

Eğer yöntemi kullanıyorsanız startActivityForResult(), ardından sonucu almak için koddaki yöntemi geçersiz kılmanız gerekir. onActivityResult() ve sonucu işleyin. Kafası karışmış? Bir örneğe bakalım.

Diyelim ki bir dedektifsiniz. Restorandaki nüfuzlu bir kişinin masasından iki parça sosis ve diğer ürünlerin çalındığı bilgisi alındı. Şüphe üç şüpheliye düştü - bir karga, lanet bir köpek ve kedi Vaska.

Ziyaretçilerden biri duba iPhone'undan bir dizi fotoğraf verdi:


Başka bir tanığın ifadesi de var: Ve Vaska dinler ve yer.

Yeni bir proje oluşturuyoruz Sherlock iki aktivite ile. İlk ekranda ikinci ekrana geçmek için bir buton ve hırsızın adını gösterecek bir metin etiketi olacaktır.