Aktiviti masuk


1 Hubungan antara Aktiviti, Tetingkap dan Paparan

Baiklah, saya pada asalnya ingin memahami hubungan antara mereka, dan kemudian saya mendapat banyak tangan, dan kemudian mula untuk lihat panggilan mereka Inilah prosesnya... Akhirnya, saya menghabiskan masa dua jam dan hanya memahami sebahagian kecil sahaja. Sudah tentu, mereka yang pergi ke bawah untuk mempelajari kod sumber semuanya adalah pakar yang hebat, seperti Lao Luo , yang belum mencapai tahap itu Berikut adalah maklumat yang anda boleh semak sendiri Selepas membaca ringkasan kod sumber seterusnya, sila nyatakan jika terdapat apa-apa yang salah. Gambarajah ringkasan dipaparkan di bawah:

1.jpg

Analisis proses: Selepas Aktiviti memanggil startActivity, ia akhirnya akan memanggil lampirkan kaedah, dan kemudian Laksanakan antara muka Ipolicy dalam PolicyManager, kemudian laksanakan objek Dasar, dan kemudian panggil kaedah makenewwindow(Konteks), yang akan mengembalikan objek PhoneWindow dan PhoneWindow Ia adalah subkelas Window Dalam PhoneWindow ini, terdapat kelas dalaman DecorView, yang merupakan Pandangan akar semua tetingkap aplikasi, iaitu bos View. Kawal secara langsung sama ada Aktiviti dipaparkan (petik perkataan asal pemacu lama...), okey, kemudian terdapat LinearLayout di dalam, dan terdapat dua FrameLayouts di dalamnya Ia digunakan untuk memasang ActionBar dan CustomView masing-masing, dan susun atur dimuatkan oleh setContentView() kami diletakkan dalam CustomView ini!

Ringkaskan hubungan antara ketiga-tiga: Mari kita gunakan metafora yang dibuat-buat: Kita boleh memanggil tiga kategori ini masing-masing: pelukis, kanvas, dan benda yang dilukis dengan berus; Pelukis melukis corak dengan berus (LayoutInflater.infalte), dan kemudian melukisnya pada kanvas (addView)! Akhirnya dipaparkan (setContentView)


2 Beberapa konsep Activity, Task dan Back Stack

Kemudian mari kita fahami mekanisme pengurusan Activity dalam Android This It melibatkan dua kata nama: Tugas dan Timbunan Belakang!

Analisis konsep:

APP kami secara amnya terdiri daripada berbilang aktiviti dan Android menyediakan kami Tugas (tugas) Konsep , Iaitu untuk mengumpul pelbagai aktiviti yang berkaitan, dan kemudian melompat dan mengembalikan aktiviti! Sudah tentu, Tugasan ini hanyalah a Konsep lapisan kerangka kerja dan struktur data yang melaksanakan Tugas dalam Android ialah Timbunan Belakang ! Saya percaya semua orang sudah biasa dengan struktur data tindanan Terdapat juga kelas pengumpulan Stack dalam Java! Tindanan mempunyai ciri-ciri berikut:

Masuk dahulu, keluar dahulu (LIFO), operasi yang biasa digunakan ialah tolak dan pop Bahagian atas dipanggil bahagian atas tindanan, dan bahagian bawah ialah dipanggil tindanan. , maka Aktiviti akan ditolak ke tindanan dan menjadi bahagian atas tindanan! Apabila pengguna mengklik butang Kembali, Aktiviti di bahagian atas timbunan akan muncul dan Aktiviti yang mengikutinya datang ke bahagian atas timbunan!

Mari kita lihat carta alir yang diberikan dalam dokumen rasmi:

2.png

Analisis proses:

Terdapat tiga aktiviti A1, A2 dan A3 dalam aplikasi Apabila pengguna mengklik aplikasi pada Pelancar atau ikon Skrin Utama, Mulakan A1 utama, kemudian A1 mulakan A2, dan A2 mulakan A3 Pada masa ini, terdapat tiga aktiviti dalam timbunan, dan ketiga-tiga aktiviti ini Dalam tugasan yang sama (Tugas), apabila pengguna menekan kekunci kembali, A3 muncul, dan hanya A1 dan A2 yang tinggal dalam tindanan Jika pengguna menekan kekunci kembali semula. Tetingkap A2, dan hanya A1 yang tinggal dalam timbunan Teruskan tekan kekunci kembali, tetingkap A1, tugas itu dialih keluar, iaitu program keluar!

Kemudian saya melihat dua gambar lain dalam dokumen rasmi, saya membaca penjelasan itu semula dan membincangkannya dengan orang dalam kumpulan:

3.png

Kemudian terdapat penjelasan ini:

4.png

Kemudian kesimpulan dibuat:

Task is Activity Koleksi adalah konsep . Timbunan Belakang sebenarnya digunakan untuk menyimpan Aktiviti Terdapat berbilang Tugas, tetapi Hanya satu timbunan berada di hadapan pada masa yang sama, dan yang lain berada di latar belakang! Bagaimanakah timbunan itu terhasil?

Jawapan: Apabila kami mengklik ikon untuk membuka Apl baharu melalui skrin utama, Tugas baharu akan dibuat! Contohnya:
Kami membuka APP dengan mengklik ikon APP Buku Alamat Pada masa ini, tindanan 1 baharu akan dibuat, dan kemudian Aktiviti yang baru dijana akan ditambahkan dalam APP Buku Alamat , tetapi tindanan baharu tidak akan dibuat pada masa ini, tetapi akan terus ditambahkan pada tindanan 1. Android menggalakkan pendekatan pengalaman pengguna, iaitu bertukar antara aplikasi yang berbeza boleh membuatkan pengguna berasa seperti mereka adalah aplikasi yang sama. Pengalaman pengguna yang sangat koheren, secara rasmi dipanggil lancar! ——————Jika kita mengklik butang Laman Utama pada masa ini untuk kembali ke skrin utama, dan tindanan 1 memasuki latar belakang, kita mungkin mempunyai dua operasi berikut:
1) Klik butang menu (butang segi empat sama ), klik Buka program tadi, dan kemudian tindanan 1 kembali ke latar depan! Atau kita klik pada ikon buku alamat pada skrin utama untuk membuka APP Pada masa ini, tindanan baharu tidak akan dibuat dan tindanan 1 akan kembali ke latar depan.
2) Jika kita mengklik pada ikon lain untuk membuka APP baharu pada masa ini, maka tindanan 2 baharu akan dibuat dan tindanan 2 akan muncul di latar depan. Dan tindanan 1 terus kekal di latar belakang;
3) Perkara yang sama berlaku kemudian...dan seterusnya!


3. Pengurusan tugasan

1) Terjemahan dokumen:

Baiklah, mari kita teruskan dengan dokumen, bermula dari ManagingTasks dalam dokumen, kira-kira The terjemahan adalah seperti berikut:


1) Terjemahan dokumen

Teruskan berjalan melalui dokumen, bermula dari ManagingTasks dalam dokumen, terjemahannya adalah seperti berikut:

Seperti yang dinyatakan di atas, Android akan menambahkan Aktiviti yang baru berjaya dilancarkan pada Tugasan yang sama dan mengurus berbilang Tugasan dengan cara "masuk dahulu, keluar dahulu". Dengan Back Stack, pengguna tidak perlu risau tentang cara Activites berinteraksi dengan Tasks atau cara mereka wujud dalam Back Stack! Mungkin anda ingin menukar gaya pengurusan biasa ini. Sebagai contoh, anda mahu salah satu aktiviti anda diuruskan dalam Tugasan baharu; Atau anda hanya mahu membuat seketika Aktiviti tertentu, atau anda mahu membersihkan semua Aktiviti dalam Tugasan kecuali Aktiviti akar apabila pengguna meninggalkan tugas itu. Anda boleh melakukan perkara ini dan banyak lagi hanya dengan mengubah suai AndroidManifest.xml < aktiviti > boleh dilaksanakan dengan mudah dengan menghantar Niat yang dikenal pasti khas untuk memulakanActivity() dalam kod. Pengurusan Aktiviti. Atribut yang boleh kami gunakan dalam

< aktiviti > . >

finishOnTaskLaunch
  • Bendera Niat utama yang boleh anda gunakan ialah:
  • FLAG_ACTIVITY_NEW_TUGAS
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • Okey> Seterusnya, kami akan memperkenalkan cara menggunakan ini satu persatu:
2) taskAffinity dan allowTaskReparenting

Secara lalai, semua aktiviti dalam aplikasi mempunyai Perkaitan

, Ini menjadikan mereka tergolong dalam Tugas yang sama. Anda boleh memahaminya sebagai tanda sama ada ia berada dalam Tugasan yang sama Walau bagaimanapun, setiap Aktiviti boleh lulus Sifat taskAffinity dalam <aktiviti> Aktiviti dalam aplikasi berbeza boleh berkongsi Perkaitan yang sama, dan Aktiviti berbeza dalam aplikasi yang sama Ia juga boleh ditetapkan kepada Perkaitan yang berbeza. Atribut Perkaitan berfungsi dalam 2 situasi:
  • 1) Apabila objek Niat yang memulakan aktiviti mengandungi teg FLAG_ACTIVITY_NEW_TASK: Apabila objek Niat dihantar ke startActivity() mengandungi teg FLAG_ACTIVITY_NEW_TASK, sistem akan mencari Tugasan yang berbeza daripada Aktiviti semasa untuk Aktiviti yang perlu dimulakan. Jika atribut Perkaitan Aktiviti yang akan dimulakan berbeza daripada atribut Perkaitan semua Tugasan semasa, sistem akan mencipta Tugasan baharu dengan atribut Perkaitan itu dan menolak Aktiviti untuk dimulakan ke dalam tindanan Tugas yang baru dibuat, sebaliknya, Aktiviti akan ditolak ke dalam sifat Affinity tersebut dalam tindanan yang sama.
  • 2) Atribut allowTaskReparenting ditetapkan kepada benar Jika sifat allowTaskReparenting sesuatu aktiviti adalah benar, maka ia boleh dialihkan daripada satu Tugas (Task1) ke Tugasan lain (Task2) dengan Perkaitan yang sama (apabila Task2 dibawa ke latar depan). Jika fail .apk mengandungi berbilang "aplikasi" daripada perspektif pengguna, anda mungkin perlu menetapkan nilai Perkaitan yang berbeza kepada aktiviti tersebut.

3) Mod pelancaran:

Empat nilai pilihan, teras penyelidikan kami tentang mod pelancaran, kami akan membincangkannya secara terperinci di bawah! Ia adalah: standard (lalai), singleTop, singleTask, singleInstance


4) Clear Stack

Apabila pengguna meninggalkan Tugasan untuk masa yang lama (tugas semasa dipindahkan ke latar belakang), sistem akan mengosongkan semua aktiviti dalam tugasan kecuali aktiviti di bahagian bawah tindanan. . Dengan cara ini, apabila pengguna kembali ke Tugasan, hanya Aktiviti asal tugasan itu yang tinggal. Kita boleh mengubah suai sifat berikut kepada Ubah perangai ini!

sentiasaKekalkanTaskState: Jika sifat aktiviti di bahagian bawah tindanan ini ditetapkan kepada benar, situasi di atas tidak akan berlaku. Semua aktiviti dalam Tugasan akan disimpan untuk masa yang lama.

clearTaskOnLaunchJika sifat aktiviti di bahagian bawah tindanan ini ditetapkan kepada benar, sebaik sahaja pengguna meninggalkan Tugas, Kemudian aktiviti dalam timbunan Tugas akan dikosongkan sehingga hanya aktiviti di bahagian bawah timbunan kekal. Keadaan ini bertepatan dengan Bertentangan dengan alwaysRetainTaskState. Walaupun pengguna meninggalkan hanya sebentar, tugas akan kembali ke keadaan asalnya (Hanya aktiviti di bahagian bawah tindanan yang kekal).

finishOnTaskLaunch adalah serupa dengan clearTaskOnLaunch, tetapi ia hanya beroperasi pada satu aktiviti operasi, bukannya keseluruhan Tugas. Ia boleh menamatkan sebarang Aktiviti, termasuk Aktiviti di bahagian bawah tindanan. Apabila ia ditetapkan kepada benar, Aktiviti semasa hanya wujud sebagai sebahagian daripada Tugasan semasa sesi semasa. Apabila pengguna keluar dari Aktiviti dan kembali, ia tidak akan wujud.


4 Penjelasan terperinci tentang empat mod pemuatan Aktiviti:

Seterusnya, mari jelaskan empat mod pemuatan secara terperinci: Ia adalah: standard (lalai), singleTop, singleTask, singleInstance Saya melihat artikel dengan gambar dan teks semasa saya meluangkan masa dalam talian. Penjelasan tentang mod permulaan adalah sangat baik, mungkin lebih mudah untuk memahaminya. Mari belajar daripadanya di sini:

Pautan asal: Penjelasan grafik dan teks terperinci bagi mod permulaan Aktiviti: standard, singleTop, singleTask dan singleInstance

Teks asal Bahasa Inggeris: Fahami Mod pelancaran Aktiviti Android: standard, singleTop, singleTask dan singleInstanceTerdapat juga penjelasan terperinci tentang mod pemuatan: Penjelasan terperinci daripada empat mod pelancaran dan atribut taskAffinity bagi Aktiviti dalam Android

Mari kita lihat gambar ringkasan dahulu:

5.png

Butiran mod:


mod standard:

Mod permulaan standard, yang juga merupakan mod permulaan lalai aktiviti. Aktiviti yang dimulakan dalam mod ini boleh dibuat seketika beberapa kali, iaitu, beberapa tika aktiviti boleh wujud dalam tugas yang sama dan setiap tika akan mengendalikan objek Niat. Jika mod permulaan Aktiviti A adalah standard dan A telah pun dimulakan, memulakan Aktiviti A sekali lagi dalam A, iaitu, memanggil startActivity(Niat baharu(ini, A.class)), akan memulakan kejadian A sekali lagi di atas A, iaitu, Status semasa tindanan ialah A-->A.

6.jpg

7.jpg


mod singleTop:

Jika tika Aktiviti yang dimulakan dalam mod singleTop sudah wujud dalam tugaskan bahagian atas timbunan, Kemudian apabila Aktiviti ini dimulakan semula, tika baharu tidak akan dibuat, tetapi tika di bahagian atas timbunan akan digunakan semula. Dan kaedah onNewIntent() bagi contoh itu akan dipanggil untuk menghantar objek Niat kepada tika ini. Contohnya, jika mod permulaan A ialah singleTop, dan tika A sudah wujud di bahagian atas timbunan, Kemudian apabila memanggil startActivity(Niat baharu(ini, A.class)) untuk memulakan A, Contoh A tidak akan dibuat lagi, tetapi tika asal akan digunakan semula dan kaedah onNewIntent() bagi tika asal akan dipanggil. Pada masa ini, masih terdapat contoh A dalam timbunan tugas. Jika contoh aktiviti bermula dalam mod singleTop Jika ia sudah wujud dalam tindanan tugas tetapi tidak berada di bahagian atas tindanan, tingkah lakunya adalah sama seperti dalam mod standard dan berbilang kejadian akan dibuat.

8.jpg


mod singleTask:

Hanya satu contoh Aktiviti dibenarkan dalam sistem. Jika sudah ada contoh dalam sistem, Tugasan yang memegang contoh ini akan dialihkan ke atas dan niat akan dihantar melalui onNewIntent(). Jika tidak, Aktiviti baharu akan dibuat dan diletakkan dalam tugas yang sesuai

9.jpg

Isu yang disebut dalam dokumentasi rasmi:

Sistem akan buat tugasan baharu dan nyatakan Aktiviti ini sebagai punca tugasan baharu Ini memerlukan kami untuk menetapkan taskAffinity selepas menggunakan taskAffinity:

10.jpg

11.jpg



mod singleInstance

memastikan bahawa tidak kira Tugas mana sistem memulakan Aktiviti, ia hanya akan mencipta satu tika Aktiviti dan menambahkannya ke bahagian atas timbunan Tugas baharu Maksudnya, aktiviti lain yang dimulakan oleh contoh ini akan dijalankan secara automatik dalam Tugasan lain. Apabila tika aktiviti dimulakan semula, tugasan dan kejadian sedia ada akan digunakan semula. dan contoh ini akan dipanggil Kaedah onNewIntent() menghantar contoh Intent kepada contoh. Sama seperti singleTask, Hanya akan ada satu contoh Aktiviti sedemikian dalam sistem pada masa yang sama.

12.jpg


5. Suplemen Aktiviti

Mungkin ada beberapa perkara yang belum disebutkan tentang Aktiviti, jadi saya akan menempah tempat di sini Saya terlepas akan berada di sini. Pertama sekali, adalah cadangan rakan kumpulan Zhuhai Kun untuk menyiarkan kelas pengurusan Aktiviti sumber terbuka China Nah, ini dia, semua orang boleh menggunakannya secara langsung. Di bawah projek~

1)开源中国客户端Aktiviti管理类:

pakej net.oschina.app;

import java.util.Stack;

import android .app.Activity;
import android.app.ActivityManager;
import android.content.Context;


public class AppManager {

private stack<Activity> activityStack;
contoh AppManager pribadi statik;

 AppManager(){}
/**
* Contoh tunggal
*/
AppManager statik awam getAppManager(){
if(instance= =null){
instance=new AppManager();
}
return instance;
}
/**
* Tambahkan Aktiviti pada tindanan
*/
public void addActivity(Aktiviti aktiviti){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* Dapatkan Aktiviti semasa (yang terakhir ditolak pada tindanan)
*/
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
/**
* Tamatkan Aktiviti semasa (yang terakhir ditolak pada tindanan)
*/
public void finishActivity(){
Activity activity=activityStack.lastElement();
finishActivity(activity);
}
/**
* Tamatkan Aktiviti yang ditentukan
*/
public void finishActivity(Aktiviti aktiviti){
if(aktiviti!=null){
activityStack.remove(aktiviti);
activity.finish();
activity=null;
}
}
/* *
* Tamatkan Aktiviti dengan nama kelas yang ditentukan
*/
public void finishActivity(Class<?> cls){
for (Aktiviti activity : activityStack) {
if(activity.getClass().equals(cls) ){
finishActivity(aktiviti);
}
}
}
/**
* Tamatkan semua aktiviti
*/
public void finishAllActivity(){
for (int i = 0, saiz = activityStack.size(); i < saiz; i ++) { if (null! = ActivityStack.get (i)) {
ActivityStack.get (i) .finish ();
}
}
aktivitiStack.clear ();
}
/**
* Keluar dari aplikasi
*/
public void AppExit(Context context) {
cuba {
finishAllActivity();
ActivityManager activityMgr= (ActivityManager) context.get (Konteks.PERKHIDMATAN_AKTIVITI);
activityMgr.restartPackage(context.getPackageName());
System.exit(0);
} catch (Exception e) { }
}
}

Ringkasan bahagian ini:

Baiklah, itu sahaja untuk bahagian ini yang agak pahit dan sukar untuk difahami. Operasi berkaitan:

  • Tekan butang Utama untuk menukar Tugas sebelumnya ke latar belakang
  • Tekan lama butang Utama untuk memaparkan senarai Tugasan yang dilaksanakan baru-baru ini
  • Klik ikon apl dalam Pelancar atau Skrin Utama untuk memulakan Tugas baharu atau jadualkan Tugasan sedia ada ke latar depan
  • Apabila memulakan Aktiviti dalam mod singleTask, ia akan mencari sistem untuk melihat sama ada tugasan yang sesuai sudah wujud Tugas, jika wujud, akan menjadualkan Tugasan ini ke latar depan untuk menggunakan semula Tugasan ini. Jika sudah ada kejadian Aktiviti yang akan dimulakan dalam Tugasan ini, kosongkan semua Aktiviti di atas tika ini dan paparkan tika ini kepada pengguna. Jika tiada contoh Aktiviti yang akan dimulakan dalam Tugasan sedia ada ini, tika itu dimulakan di bahagian atas Tugasan ini. Jika Tugasan ini tidak wujud, Tugas baharu akan dimulakan dan contoh Aktiviti mod SingleTask ini akan dimulakan dalam Tugasan baharu ini.
  • Apabila memulakan aktiviti singleInstance, ia akan mencari dalam sistem untuk melihat sama ada sudah ada kejadian Aktiviti ini Jika ia wujud, Tugas di mana kejadian ini terletak akan dijadualkan ke latar depan dan contoh Aktiviti ini akan digunakan semula (hanya terdapat Aktiviti Ini), jika ia tidak wujud, akan memulakan tugas baharu dan memulakan kejadian mod SingleInstance Aktiviti dalam Tugasan baharu ini.

Baiklah, itu sahaja untuk bahagian ini Perkara tentang mod pemuatan Tugas dan Aktiviti masih agak rumit. Anda boleh melihat beberapa rujukan pada masa itu~


Rujukan: