Melewati data antara aktivitas dan layanan. Komunikasi antara Aktivitas dan Layanan

Aplikasi tidak selalu terdiri dari satu layar. Misalnya, kami telah membuat sangat program yang bermanfaat dan pengguna ingin tahu siapa penulisnya. Dia mengklik tombol "Tentang" dan membuka layar baru di mana ada informasi berguna tentang versi program, penulis, alamat situs, berapa banyak kucing yang dimiliki penulis, dll. Pikirkan layar aktivitas sebagai halaman web dengan tautan ke halaman lain. Jika Anda melihat kode dalam file MainActivity.java dari pelajaran sebelumnya, Anda akan melihat bahwa kelas kami Aktifitas utama juga berlaku untuk Aktivitas(atau ahli warisnya) atau, lebih tepatnya, diwarisi darinya.

MainActivity kelas publik memperluas AppCompatActivity

Seperti yang Anda duga, kita harus membuat kelas baru yang mungkin terlihat seperti Aktifitas utama dan kemudian entah bagaimana beralih ke klik tombol.

Untuk percobaan, kami akan mengambil program dari pelajaran pertama dan menggunakan tombol untuk percobaan (atau buat proyek baru dengan satu tombol di layar). Selanjutnya, mari kita buat bentuk baru menampilkan informasi berguna. Sebagai contoh, mari kita tunjukkan kepada pengguna apa yang dilakukan kucing saat ia bergerak ke kiri dan ke kanan. Setuju, itu sangat informasi penting, yang memberikan kunci untuk mengungkap alam semesta.

Kami akan membuat aktivitas baru secara manual, meskipun studio memiliki template yang sudah jadi. Tetapi tidak ada yang rumit dan untuk pemahaman yang lebih baik akan berguna untuk melakukan semuanya dengan tangan.

Mari buat file markup XML baru activity_about.xml dalam folder res/tata letak. Klik kanan pada folder tata letak dan pilih dari menu konteks Baru | Tata letak file sumber daya. Sebuah kotak dialog akan muncul. Masukkan nama file di kolom pertama aktivitas_tentang. Yang kedua, Anda harus memasukkan elemen root. Secara default ada di sana Tata Letak Batasan. Hapus teks dan masukkan tampilan gulir. Memasukkan beberapa karakter sudah cukup bagi studio untuk menyarankan opsi yang sudah jadi, Anda dapat langsung menekan Enter tanpa menunggu input penuh kata:

Kami mendapatkan kosong yang sesuai, di mana kami memasukkan elemen tampilan teks.

Informasi akan diambil dari sumber daya, yaitu dari sumber daya string about_text. Sekarang disorot dengan warna merah, menandakan tidak adanya informasi. bisa ditekan Alt+Enter dan masukkan teks di kotak dialog. Tetapi untuk contoh kita, metode ini tidak akan berfungsi, karena teks kita akan menjadi multi-baris, menggunakan karakter kontrol. Jadi mari kita lakukan secara berbeda. Ayo buka filenya res/values/strings.xml dan masukkan teks berikut secara manual:

Pohon ek hijau di dekat pantai;\n Rantai emas di pohon ek itu:\n Siang dan malam kucing ilmuwan\n Semuanya berjalan di sekitar rantai;\n Itu berjalan Baik- lagunya menyala,\n Kiri- menceritakan dongeng.

Kami menggunakan tag pemformatan teks HTML paling sederhana seperti , , . Untuk contoh kita, cukup dengan menebalkan kata-kata yang mengacu pada kucing dan arah gerakan. Untuk menerjemahkan teks menjadi garis baru menggunakan simbol \n. Mari tambahkan sumber string lain untuk judul layar baru:

Tentang program

Dipahami dengan markup. Selanjutnya, Anda perlu membuat kelas untuk jendela TentangAktivitas.java. Pilih dari menu berkas | Baru | kelas jawa dan isi kolom yang diperlukan. Pada awalnya, cukup untuk menentukan nama saja. Kemudian berurusan dengan bidang lain.

Ayo siapkan persiapannya.

Sekarang kelas hampir kosong. Mari tambahkan kode secara manual. Kelas harus mewarisi dari kelas abstrak Aktivitas atau kerabatnya Aktivitas Fragmen, AppCompatActivity dll. menambahkan memperluas Aktivitas. Kelas aktivitas harus memiliki metode diBuat(). Letakkan kursor mouse di dalam kelas dan pilih dari menu kode | Ganti Metode(Ctrl+O). Di kotak dialog, kami mencari kelas yang diinginkan, Anda dapat mengetikkan karakter pertama pada keyboard untuk pencarian Cepat. Dalam metode yang dibuat, Anda perlu memanggil metode setContentView(), yang akan memuat markup yang telah disiapkan di layar. Kami akan memiliki opsi seperti itu.

Paket en.alexanderklimov.helloworld; impor android.app.Activity; impor android.os.Bundle; /** * Dibuat oleh Alexander Klimov pada 12/01/2014. */ public class AboutActivity memperluas Aktivitas ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )

Sekarang hal yang paling penting dimulai. Tugas kita adalah pindah ke layar baru saat tombol diklik di layar pertama. Ayo kembali ke kelas Aktifitas utama. Mari kita tulis handler klik tombol:

Public void onClick(View view) ( Intent intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )

Di sini saya menggunakan metode penanganan klik tombol yang dijelaskan dalam pelajaran.

Untuk memulai layar baru, Anda perlu membuat instance kelas Maksud dan tentukan kelas saat ini di parameter pertama, dan kelas untuk transisi di parameter kedua, kami memiliki ini TentangAktivitas. Setelah itu, metode ini disebut mulaiAktivitas(), yang meluncurkan layar baru.

Jika sekarang Anda mencoba menguji aplikasi di emulator, Anda akan menerima pesan kesalahan. Apa yang kita lakukan salah? Kami melewatkan satu langkah penting. Anda harus mendaftar yang baru Aktivitas dalam manifes AndroidManifest.xml. Temukan file ini di proyek Anda dan klik dua kali di atasnya. Jendela pengeditan file akan terbuka. Tambahkan tag baru setelah tag penutup untuk kegiatan pertama. Ketik sendiri dan gunakan petunjuk secara aktif. Anda akan mendapatkan yang berikut ini:

Di sinilah sumber daya string berguna about_title. Jalankan aplikasi, klik tombol dan dapatkan jendelanya Tentang program. Jadi, kami belajar cara membuat jendela baru dan memanggilnya dengan mengklik tombol. Dan program mega-nyaman telah muncul untuk kami - sekarang akan selalu ada petunjuk di tangan apa yang dilakukan kucing ketika ia pergi ke kiri.

Sekali lagi, saya menarik perhatian Anda pada fakta bahwa kelas aktivitas yang dibuat kedua harus diwarisi dari kelas Aktivitas atau serupa ( DaftarAktivitas dll.), memiliki file markup XML (jika diperlukan) dan ditulis dalam manifes.

Setelah memanggil metode mulaiAktivitas() aktivitas baru akan dimulai (dalam hal ini TentangAktivitas), itu akan menjadi terlihat dan pindah ke bagian atas tumpukan yang berisi komponen yang sedang berjalan. Saat memanggil metode menyelesaikan() dari aktivitas baru (atau ketika tombol spasi mundur perangkat keras ditekan) aktivitas tersebut akan ditutup dan dihapus dari tumpukan. Pengembang juga dapat menavigasi ke aktivitas sebelumnya (atau lainnya) menggunakan metode yang sama mulaiAktivitas().

Membuat layar ketiga - cara untuk malas

Programmer, seperti kucing, adalah makhluk yang malas. Selalu ingat bahwa untuk aktivitas Anda perlu membuat markup dan kelas yang diwarisi dari Aktivitas, dan kemudian jangan lupa untuk mendaftarkan kelas di manifes - oh well, apa-apaan ini.

Dalam hal ini, pilih dari menu berkas | Baru | aktivitas | aktivitas dasar(atau pola lainnya). Selanjutnya, jendela yang sudah dikenal untuk membuat aktivitas baru akan muncul. Isi bidang yang diperlukan.

Klik pada tombol Menyelesaikan dan aktivitas akan siap. Untuk memverifikasi ini, buka file manifes dan periksa entri baru. Saya tidak berbicara tentang file kelas dan markup, mereka akan muncul di depan Anda.

Tambahkan sendiri tombol baru di layar aktivitas utama dan tulis kode untuk menavigasi ke aktivitas yang dibuat.

Pada awalnya, saya menyarankan Anda untuk secara manual membuat semua komponen yang diperlukan untuk aktivitas baru untuk memahami hubungan antara kelas, markup, dan manifes. Dan ketika Anda mendapatkannya, Anda dapat menggunakan wizard pembuatan aktivitas untuk mempercepatnya.

Melewati data antar aktivitas

Kami menggunakan contoh paling sederhana untuk memanggil layar aktivitas lain. Terkadang diperlukan tidak hanya untuk memanggil layar baru, tetapi juga untuk mentransfer data ke sana. Misalnya, nama pengguna. Dalam hal ini, Anda perlu menggunakan area khusus data tambahan, yang dimiliki kelas Maksud.

Wilayah data tambahan adalah daftar pasangan kunci/nilai, yang diteruskan bersama dengan maksud. String digunakan sebagai kunci, dan untuk nilai Anda dapat menggunakan tipe data primitif, array primitif, objek kelas bundel dan sebagainya.

Untuk meneruskan data ke aktivitas lain, gunakan metode menempatkan Ekstra():

Intent.putExtra("Kunci", "Nilai");

Aktivitas penerima harus memanggil beberapa metode yang sesuai: dapatkanIntEkstra(), dapatkanStringEkstra() dll.:

Int hitung = getIntent().getIntExtra("nama", 0);

Mari kita buat ulang contoh sebelumnya. Kami sudah memiliki tiga kegiatan. Aktivitas pertama akan memiliki dua bidang teks dan sebuah tombol. Penampilan mungkin sebagai berikut:

Pada kegiatan kedua Aktivitas Kedua mengatur elemen tampilan teks, di mana kami akan menampilkan teks yang diterima dari aktivitas pertama. Mari kita tulis kode berikut untuk metodenya diBuat() pada kegiatan kedua.

@Override protected void onCreate(Bundle storedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String gift = "donut hole"; TextView infoTextView = (TextView)findViewById( R .id.textViewInfo); infoTextView.setText(user + " , Anda diberi " + hadiah); )

Jika sekarang kita menjalankan program dan cukup memanggil jendela kedua, seperti yang dijelaskan di bagian pertama artikel, kita akan melihat prasasti default ZhYvotnoe, kamu diberi lubang donat. Setuju, sangat disayangkan menerima pesan seperti itu.

Kami memperbaiki situasi. Tambahkan kode ke aktivitas pertama:

Public void onClick(View view) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (EditText) findViewById(R.id.editTextGift); Intent intent = new Intent(MainActivity.this, SecondActivity. class); // mendorong teks dari bidang teks pertama ke dalam maksud kunci nama pengguna.putExtra("nama pengguna", userEditText.getText().toString()); // mendorong teks dari bidang teks kedua ke dalam kunci hadiah maksud.putExtra("hadiah", giftEditText.getText().toString()); startActivity(maksud); )

Kami ditempatkan di wadah objek khusus Maksud dua kunci dengan nilai yang diambil dari bidang teks. Ketika pengguna memasukkan data ke dalam bidang teks, mereka akan jatuh ke dalam wadah ini dan akan diteruskan ke aktivitas kedua.

Aktivitas kedua harus siap menerima pesan dengan hangat sebagai berikut (disorot dengan huruf tebal).

// Nilai default String user = "LIFE"; String hadiah = "lubang donat"; pengguna = getIntent().getExtras().getString("nama pengguna"); hadiah = getIntent().getExtras().getString("hadiah"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(pengguna + " , Anda diberi " + hadiah);

Sekarang pesan itu tidak terlihat begitu menyinggung, tetapi bahkan menyenangkan bagi sebagian orang. Dalam contoh kompleks, diinginkan untuk menambahkan validasi selama pemrosesan data. Ada situasi ketika Anda memulai aktivitas kedua dengan data kosong seperti batal, yang dapat merusak aplikasi.

Dalam kasus kami, kami tahu bahwa kami sedang menunggu nilai string, sehingga kode dapat ditulis ulang seperti ini:

maksud maksud = getIntent(); pengguna = maksud.getStringExtra("nama pengguna");

Pengguna = getIntent().getStringExtra("nama pengguna");

Program ini memiliki kelemahan - tidak jelas dari siapa kami menerima salam. Monyet yang sopan tidak akan menerima hadiah dari sumber anonim. Jadi untuk pekerjaan rumah, tambahkan bidang teks lain untuk memasukkan nama pengguna yang mengirim pesan.

Google menyarankan untuk menggunakan format kunci berikut: nama paket Anda sebagai awalan, diikuti dengan kunci itu sendiri. Dalam hal ini, Anda dapat yakin bahwa kuncinya unik saat berinteraksi dengan aplikasi lain. Kira-kira seperti ini:

String statis publik terakhir USER = "ru.alexanderklimov.myapp.USER";

Siapa yang membingkai kucing Vaska - kami mendapatkan hasilnya kembali

Tidak selalu cukup hanya dengan melewatkan data ke aktivitas lain. Terkadang Anda perlu mendapatkan informasi kembali dari aktivitas lain saat aktivitas tersebut ditutup. Jika sebelumnya kita menggunakan metode startActivity(Niat niat), maka ada metode terkait startActivityForResult(Intent intent, int RequestCode). Perbedaan antara metode terletak pada parameter tambahan Kode permintaan. Ini pada dasarnya hanya bilangan bulat yang dapat Anda pikirkan tentang diri Anda sendiri. Penting untuk membedakan dari siapa hasilnya datang. Katakanlah Anda memiliki lima layar tambahan dan Anda menetapkan nilai dari 1 hingga 5 untuk mereka, dan dari kode ini Anda dapat menentukan hasil siapa yang perlu Anda proses. Anda dapat menggunakan nilai -1, maka itu akan setara dengan memanggil metode mulaiAktivitas(), yaitu kita tidak akan mendapatkan hasil apapun.

Jika Anda menggunakan metode startActivityForResult(), maka Anda perlu mengganti metode dalam kode untuk menerima hasilnya padaActivityResult() dan memproses hasilnya. Bingung? Mari kita lihat sebuah contoh.

Katakanlah Anda seorang detektif. Informasi diterima bahwa dua potong sosis dan produk lainnya dicuri dari meja orang berpengaruh di restoran. Kecurigaan jatuh pada tiga tersangka - seekor gagak, seekor anjing dan kucing Vaska.

Salah satu pengunjung memberikan serangkaian foto dari iPhone pontonnya:


Ada juga keterangan dari saksi lain: Dan Vaska mendengarkan dan makan.

Kami membuat proyek baru Sherlock dengan dua kegiatan. Pada layar pertama akan ada tombol untuk beralih ke layar kedua dan label teks yang akan menampilkan nama pencuri.