Activitylar o'rtasidagi o'zaro ta'sir
Oldingi mavzularda biz Intent obyekti yordamida faoliyatning hayot aylanishi va yangi faoliyatni ishga tushirishni yoritgan edik. Endi bitta ilovadagi faoliyatlar o'rtasidagi o'zaro ta'sirning ba'zi xususiyatlarini ko'rib chiqamiz. Aytaylik, bizda uchta faoliyat mavjud: MainActivity, SecondActivity va ThirdActivity.
Intent bilan, masalan, tugma bosilganda, MainActivity SecondActivity-ni ishga tushiradi:
1
2
|
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
|
SecondActivity-da ThirdActivity-ni ishga tushiradigan tugma ham mavjud:
1
2
|
Intent intent = new Intent(this, ThirdActivity.class);
startActivity(intent);
|
ThirdActivity-da birinchi faoliyatga qaytadigan tugma ham mavjud - MainActivity:
1
2
|
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
|
Agar biz barcha harakatlarni ketma-ket ishga tushiradigan bo'lsak: asosiy MainActivity-dan biz SecondActivity-ni, SecondActivity-dan - ThirdActivity-ni ishga tushirsak, oxirida biz quyidagi faoliyat stekiga ega bo'lamiz:
Uchinchi faoliyat
Ikkinchi faoliyat
Asosiy faoliyat
Agar bundan keyin biz ThirdActivity-dan MainActivity-ga murojaat qilmoqchi bo'lsak, startActivity() usuli yangi MainActivity ob'ektini ishga tushiradi (mavjud ob'ektga qaytmaydi) va stek allaqachon shunday ko'rinadi:
Asosiy faoliyat
Uchinchi faoliyat
Ikkinchi faoliyat
Asosiy faoliyat
Ya'ni, bizda MainActivity-ning ikkita mustaqil nusxasi bo'ladi. Agar biz mavjud bo'lgan joyga o'tmoqchi bo'lsak, bu pozitsiya istalmagan. Va bu nuqta e'tiborga olinishi kerak.
Agar Orqaga tugmasini bossak, u holda stekning yuqori qismida joylashgan joriy faoliyat stekdan o'chiriladi va oldingi faoliyat stekning yuqori qismida bo'lib, o'z ishini davom ettiradi. Shunday qilib, Orqaga tugmasidan foydalanib, biz stekdagi oldingi faoliyatga o'tishimiz mumkin. Masalan, yuqoridagi holatda Orqaga tugmasini bossak, u holda stekning yuqori qismidagi MainActivity o'z ishini tugatadi va ekranda ThirdActivity ko'rsatila boshlaydi.
Uchinchi faoliyat
Ikkinchi faoliyat
Asosiy faoliyat
Biroq, ba'zida faoliyatlar orasidagi o'tishni boshqarish kerak bo'ladi. Misol uchun, bu holda, biz ThirdActivity-dagi tugmani bosganimizda MainActivity-ning yangi nusxasini ishga tushirishni xohlamaymiz, shunchaki birinchi bo'lib ishga tushirilgan va stekning eng quyi qismida joylashgan MainActivity-ga o'tish o'rniga. Keling, Android bizga taqdim etadigan imkoniyatlarni ko'rib chiqaylik.
Faoliyat stekini boshqarish
Faoliyatdan stekni boshqarish uchun Android bayroqlardan foydalanishni taklif qiladi - Intent sinfida belgilangan konstantalar. Muayyan bayroqni qo'llash bizga ma'lum harakatlar uchun ma'lum bir tarzda stekdagi pozitsiyani o'zgartirishga imkon beradi.
Masalan, oldingi vazifani olaylik, ThirdActivity-dagi tugmani bosgandan so'ng, MainActivity-ning yangi nusxasi ishga tushiriladi. Ammo biz yangisini ishga tushirmoqchi emasmiz, balki mavjudiga o'tamiz.
Asosiy faoliyat
Uchinchi faoliyat
Ikkinchi faoliyat
Asosiy faoliyat
Ushbu vaziyatdan chiqish uchun Intent.FLAG_ACTIVITY_REORDER_TO_FRONT bayrog'idan foydalanishimiz mumkin:
1
2
3
|
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
|
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT bayrog'i, agar u stekda bo'lsa, o'tkazilayotgan faoliyatni stekning yuqori qismiga ko'chiradi. Va bu holda, ThirdActivity-dan MainActivity-ga o'tgandan so'ng, stek quyidagicha ko'rinadi:
Asosiy faoliyat
Uchinchi faoliyat
Ikkinchi faoliyat
Agar biz ThirdActivity-dan MainActivity-ga o'tishimiz kerak bo'lsa, xuddi Orqaga tugmasi yordamida orqaga qaytgandek, biz Intent.FLAG_ACTIVITY_CLEAR_TOP va Intent.FLAG_ACTIVITY_SINGLE_TOP bayroqlaridan foydalanishimiz mumkin:
1
2
3
|
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
|
Intent.FLAG_ACTIVITY_CLEAR_TOP bayrog'i ishga tushirilayotganidan tashqari (agar u stekda bo'lsa) barcha harakatlarni o'chiradi. Va Intent.FLAG_ACTIVITY_SINGLE_TOP bayrog'i agar stekning yuqori qismida ishga tushirilishi kerak bo'lgan faollik mavjud bo'lsa, u BO'LIB BO'LMAYDI (keyin u stekda faqat bitta shaklda mavjud bo'lishi mumkin) ekanligini bildiradi.
Bu holda, ThirdActivity-dan MainActivity-ga o'tgandan so'ng, stek to'liq tozalanadi va u erda faqat MainActivity qoladi.
Boshqa belgi - Intent.FLAG_ACTIVITY_NO_HISTORY ishga tushirilgan faoliyatni stekda saqlamaslikka imkon beradi. Misol uchun, SecondActivity-ni ishga tushirganda, biz uni stekda saqlashni xohlamaymiz:
1
2
3
|
Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
|
Bunday holda, MainActivity -> SecondActivity -> ThirdActivity zanjiri orqali o'tayotganda stek quyidagicha ko'rinadi:
MainActivity
|
ThirdActivity
|
Do'stlaringiz bilan baham: |