Aktivitas, AppCompatActivity, FragmentActivity, dan ActionBarActivity: Kapan Menggunakan Yang Mana?

266

Saya datang dari iOS di tempat yang mudah dan Anda cukup menggunakan UIViewController. Namun, di Android hal-hal tampak jauh lebih rumit, dengan komponen UIC tertentu untuk Level API tertentu. Saya membaca BigNerdRanch untuk Android (buku ini kira-kira berumur 2 tahun) dan mereka menyarankan saya gunakan Activityuntuk meng-host saya FragmentActivities. Namun, saya pikir Activitysudah usang.

Jadi untuk API Level 22 (dengan dukungan minimum untuk API Level 15 atau 16), apa sebenarnya yang harus saya gunakan untuk meng-host komponen, dan untuk komponen itu sendiri? Apakah ada kegunaan untuk semua ini, atau haruskah saya menggunakan satu atau dua hampir secara eksklusif?

Jameson
sumber
1
Anda tidak akan meng-hosting FragmentActivityies. Anda hanya meng-host Fragment. Pada versi Android yang lebih baru, Activitykelas itu sendiri telah diperbarui untuk menampung mereka secara langsung. Untuk mendukung versi yang lebih lama FragmentActivitydiperkenalkan.
Ravi Thapliyal
5
Demikian pula, dengan API 11+, Activitydukungan untuk ActionBar. Ini didukung pada versi lama melalui ActionBarActivitydulu yang sekarang sudah usang dan diganti dengan AppCompatActivity. Karena, kedua kelas ini memperpanjang FragmentActivitymereka mendukung hosting Fragmentjuga.
Ravi Thapliyal

Jawaban:

327

Saya pikir Activity sudah usang

Tidak.

Jadi untuk API Level 22 (dengan dukungan minimum untuk API Level 15 atau 16), apa sebenarnya yang harus saya gunakan untuk meng-host komponen, dan untuk komponen itu sendiri? Apakah ada kegunaan untuk semua ini, atau haruskah saya menggunakan satu atau dua hampir secara eksklusif?

Activityadalah garis dasar. Setiap aktivitas mewarisi dari Activity, langsung atau tidak langsung.

FragmentActivityuntuk digunakan dengan backport fragmen yang ditemukan di support-v4dan support-v13perpustakaan. Implementasi fragmen asli ditambahkan di API Level 11, yang lebih rendah dari minSdkVersionnilai yang Anda usulkan . Satu-satunya alasan mengapa Anda perlu mempertimbangkan FragmentActivitysecara khusus adalah jika Anda ingin menggunakan fragmen bersarang (fragmen memegang fragmen lain), karena itu tidak didukung dalam fragmen asli hingga API Level 17.

AppCompatActivityberasal dari appcompat-v7perpustakaan. Pada prinsipnya, ini menawarkan backport dari action bar. Karena bilah tindakan asli ditambahkan di API Level 11, Anda tidak perlu melakukannya AppCompatActivity. Namun, versi saat ini appcompat-v7juga menambahkan backport terbatas dari estetika Desain Material, dalam hal panel aksi dan berbagai widget. Ada pro dan kontra penggunaan appcompat-v7, jauh di luar cakupan jawaban Stack Overflow khusus ini.

ActionBarActivityadalah nama lama dari aktivitas dasar dari appcompat-v7. Karena berbagai alasan, mereka ingin mengganti namanya. Kecuali beberapa perpustakaan pihak ketiga yang Anda gunakan bersikeras ActionBarActivity, Anda harus memilih AppCompatActivitylebih dari itu ActionBarActivity.

Jadi, mengingat Anda minSdkVersiondi kisaran 15-16:

  • Jika Anda ingin tampilan Desain Material yang di-backport, gunakan AppCompatActivity

  • Jika tidak, tetapi Anda ingin fragmen bersarang, gunakan FragmentActivity

  • Jika tidak, gunakan Activity

Hanya menambahkan dari komentar sebagai catatan: AppCompatActivitymemanjang FragmentActivity, sehingga siapa pun yang perlu menggunakan fitur FragmentActivitydapat menggunakan AppCompatActivity.

CommonsWare
sumber
Bagaimana jika saya ingin menggunakan tampilan Material Design dan juga menginginkan fragmen bersarang? Apakah AppCompatActivity mewarisi dari FragmentActivity?
Orcun Sevsay
4
@MiloRambaldi: Ya, FragmentActivityadalah leluhur AppCompatActivity. Meskipun saya tidak merekomendasikan menggunakan fragmen bersarang, sejauh fragmen bersarang bekerja sama sekali, AppCompatActivityakan mendukung fragmen bersarang.
CommonsWare
Terima kasih atas jawaban terinci @CommonsWare. Bisakah Anda mengatakan minSDK mana yang memungkinkan untuk hanya menggunakan Activitysebagian besar yang terbaru tanpa support-v7mis. Desain Material yang tidak didukung Tujuan saya adalah target 19 menit 25
jugutier
1
@jugutier: Untuk menggunakan Theme.Material, Anda memerlukan minSdkVersion21 atau lebih tinggi.
CommonsWare
83

Activityadalah kelas dasar dari semua kegiatan lainnya, saya tidak berpikir itu akan ditinggalkan. Hubungan di antara mereka adalah:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' berarti warisan di sini. The referensi mengatakan ActionBarActivitysudah ditinggalkan, gunakan AppCompatActivitysebagai gantinya.

Jadi pada dasarnya, menggunakan AppCompatActivityselalu merupakan pilihan yang tepat. Perbedaan di antara mereka adalah:

  • Activity adalah yang mendasar.
  • Berdasarkan Activity, FragmentActivitymenyediakan kemampuan untuk digunakan Fragment.
  • Berdasarkan FragmentActivity, AppCompatActivitymenyediakan fitur untuk ActionBar.
Ted Yu
sumber
2
jawaban yang elegan.
M.kazem Akhgary
69

2019: Gunakan AppCompatActivity

Pada saat penulisan ini (periksa tautan untuk mengonfirmasi itu masih benar), Dokumentasi Android merekomendasikan penggunaan AppCompatActivityjika Anda menggunakan Bilah Aplikasi.

Ini adalah rasional yang diberikan:

Dimulai dengan Android 3.0 (API level 11), semua aktivitas yang menggunakan tema default memiliki ActionBar sebagai bilah aplikasi. Namun, fitur bilah aplikasi secara bertahap telah ditambahkan ke ActionBar asli melalui berbagai rilis Android. Akibatnya, ActionBar asli berperilaku berbeda tergantung pada versi sistem Android yang digunakan perangkat. Sebaliknya, fitur terbaru ditambahkan ke Toolbar versi pustaka dukungan, dan mereka tersedia di perangkat apa pun yang dapat menggunakan pustaka dukungan.

Untuk alasan ini, Anda harus menggunakan kelas Toolbar perpustakaan dukungan untuk menerapkan bilah aplikasi aktivitas Anda. Menggunakan bilah alat perpustakaan dukungan membantu memastikan bahwa aplikasi Anda akan memiliki perilaku yang konsisten di berbagai perangkat yang terluas. Misalnya, widget Toolbar memberikan pengalaman desain materi pada perangkat yang menjalankan Android 2.1 (API level 7) atau lebih baru, tetapi bilah tindakan asli tidak mendukung desain material kecuali perangkat menjalankan Android 5.0 (API level 21) atau lebih baru.

Petunjuk umum untuk menambahkan ToolBar adalah

  1. Tambahkan pustaka dukungan appcompat v7
  2. Buat semua aktivitas Anda diperluas AppCompatActivity
  3. Dalam Manifes menyatakan bahwa Anda inginkan NoActionBar.
  4. Tambahkan ToolBartata letak xml untuk setiap aktivitas.
  5. Dapatkan ToolBardi setiap aktivitas onCreate.

Lihat petunjuk dokumentasi untuk lebih jelasnya. Mereka cukup jelas dan bermanfaat.

Suragch
sumber
Hai @ Suragch, terima kasih untuk ini. Katakanlah saya sedang membuat aplikasi hari ini yang HANYA mendukung 21 dan seterusnya. Memang, seperti yang terjadi, saya tidak ingin, pernah ada bilah tindakan atau bilah aplikasi (lebih dari aplikasi layar penuh). Studio menyarankan (16 November) saya mungkin menggunakan "Kompatibilitas mundur (AppCompat)" . Naluri saya adalah JANGAN menggunakan AppCompat. Apa pendapat ahli Anda? Saya hanya bisa berterima kasih, terima kasih.
Fattie
Saya bukan ahli jadi saya tidak bisa memberi Anda pendapat ahli, tetapi dokumentasi menyarankan mendukung sebanyak mungkin perangkat sehingga itulah yang saya lakukan. Saya menggunakan AppCompat dengan semua aplikasi saya dan sejauh ini sudah berfungsi dengan baik. Saya kira jika Anda benar-benar tidak ingin mendukung pra 21 maka Anda dapat mengabaikan saran Studio.
Suragch
50

Untuk level API minimum 15, Anda ingin menggunakannya AppCompatActivity. Jadi misalnya, Anda MainActivityakan terlihat seperti ini:

public class MainActivity extends AppCompatActivity {
    ....
    ....
}

Untuk menggunakan AppCompatActivity, pastikan Anda telah mengunduh Perpustakaan Dukungan Google (Anda dapat memeriksanya di Tools -> Android -> SDK manager). Kemudian cukup sertakan dependensi gradle dalam file gradle.build aplikasi Anda:

compile 'com.android.support:appcompat-v7:22:2.0'

Anda dapat menggunakan ini AppCompatsebagai utama Anda Activity, yang kemudian dapat digunakan untuk meluncurkan Fragmen atau Kegiatan lainnya (ini tergantung pada jenis aplikasi yang Anda buat).

Buku BigNerdRanch adalah sumber yang bagus, tapi ya, sudah ketinggalan zaman. Bacalah itu untuk informasi umum tentang cara kerja Android, tetapi jangan berharap kelas khusus yang mereka gunakan terbarui.

adao7000
sumber
OK, saya punya ketergantungan pada file gradle.build saya. Jadi, misalnya, jika saya membuat tabel dengan banyak baris (seperti aplikasi Notes), layar utama saya akan menjadi AppCompat dan juga apa pun yang host juga akan menjadi AppCompat? Apakah saya pada dasarnya hanya perlu menggunakan AppCompat?
Jameson
Jadi AppCompat Anda akan mengembang beberapa sumber daya tata letak yang menentukan desain (tabel dengan banyak baris). Tetapi katakanlah Anda ingin membuka halaman baru ketika Anda mengklik pada satu baris. Anda dapat mengatur onClickListener untuk membuka Aktivitas AppCompat atau Fragmen baru.
adao7000
Pada 3 Agustus, BigNerdRanch memiliki edisi baru dari bukunya: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410
1
@ adao7000 sobat di mana ia telah menyebutkan bahwa untuk 15 atau lebih Anda dapat menggunakan AppCompatActivity - Saya pikir v7 di android.support.v7.app adalah untuk minimum SDK yang diperlukan adalah 7.
codebased
1
@codebased android.support.v7 dapat digunakan mulai dari API level 9. Sumber: developer.android.com/topic/libraries/support-library/…
adao7000
30

Activitykelas adalah kelas dasar. (Asli) Ini mendukung manajemen Fragmen (Sejak API 11). Tidak direkomendasikan lagi penggunaan murni karena spesialisasi yang jauh lebih baik.

ActionBarActivitysebentar menjadi pengganti kelas Aktivitas karena membuatnya mudah untuk menangani ActionBar dalam suatu aplikasi.

AppCompatActivityadalah yang cara baru untuk pergi karena ActionBar tidak dianjurkan lagi dan Anda harus menggunakan Toolbar bukan (yang saat ini ini pengganti ActionBar). AppCompatActivity mewarisi dari FragmentActivity jadi jika Anda perlu menangani Fragmen Anda bisa (melalui Manajer Fragmen). AppCompatActivity untuk API APA PUN, tidak hanya 16+ (siapa bilang begitu?). Anda dapat menggunakannya dengan menambahkan compile 'com.android.support:appcompat-v7:24:2.0'file Gradle Anda. Saya menggunakannya di API 10 dan berfungsi sempurna.

Joaquin Iurchuk
sumber
1
"ActionBar sekarang sudah ditinggalkan" - bilah tindakan tidak ditinggalkan. "Anda harus menggunakan Bilah Alat sebagai gantinya" - aplikasi tidak perlu digunakan Toolbar.
CommonsWare
@CommonsWare Ok, tidak usang tetapi penggunaannya tidak dianjurkan lagi dalam bentuk yang lebih murni (yang lama). Sekarang, jika Anda ingin memiliki Action Bar di aplikasi Anda, Anda harus menambahkannya secara manual menggunakan Toolbar.
Joaquin Iurchuk
"penggunaannya tidak dianjurkan lagi dalam bentuknya yang lebih murni" - Saya tidak melihat apa pun dalam dokumentasi atau posting blog resmi yang akan membenarkan klaim Anda. Apakah Anda memiliki tautan?
CommonsWare
@CommonsWare Anda adalah yang terkemuka di sini dan Anda benar. Hanya pedoman desain Material yang menyarankan penggunaan Bilah Alat sebagai Bilah Tindakan. Mungkin saya harus menghapus jawaban saya karena tidak tepat. Terima kasih
Joaquin Iurchuk
2
Dimulai dengan Perpustakaan Dukungan versi 26.0.0 (dirilis pada Juli 2017), level API minimum yang didukung telah berubah menjadi Android 4.0 (API level 14) untuk semua paket perpustakaan dukungan. sumber: developer.android.com/topic/libraries/support-library/…
Andrea Leganza
12

Ada banyak kebingungan di sini, terutama jika Anda membaca sumber yang sudah usang.

Yang mendasar adalah Activity, yang dapat menampilkan Fragmen. Anda dapat menggunakan kombinasi ini jika Anda menggunakan versi Android> 4.

Namun, ada juga perpustakaan dukungan yang meliputi kelas-kelas lain yang Anda sebutkan: FragmentActivity, ActionBarActivitydanAppCompat . Awalnya mereka digunakan untuk mendukung fragmen pada versi Android <4, tetapi sebenarnya mereka juga digunakan untuk mendukung fungsi dari versi Android yang lebih baru (misalnya desain material).

Yang terbaru adalah AppCompat, 2 lainnya lebih tua. Strategi yang saya gunakan adalah selalu menggunakan AppCompat, sehingga aplikasi akan siap jika terjadi backport dari versi Android masa depan.

flower_green
sumber
Terima kasih! OK, jadi saya bisa menggunakan AppCompat di tempat Kegiatan untuk menjadi tuan rumah ... apa? Untuk meng-host AppCompats lainnya? Atau untuk menjadi tuan rumah FragmentActivities?
Jameson
Aktivitas yang biasanya hanya menampung fragmen lain ... Dan jangan khawatir tentang FragmentActivity, ini lebih merupakan kelas "basis", yang berasal dari semua XXXActivity mewah lainnya.
Mehdi
Tapi kelas mana yang harus di-host AppCompat saya? AppCompat lain, atau yang lain?
Jameson
Anda hanya memiliki satu hal untuk dipahami di sini: kegiatan menampung fragmen. Aktivitas tidak di-host oleh hal lain, mereka tidak dapat disarangkan. Appcompat hanyalah jenis kegiatan lainnya. Setelah itu Anda dapat melanjutkan dan membuat fragmen, tetapi itu mulai rumit untuk dikelola.
flower_green
1
Tidak, Anda menggunakan appcompat sebagai aktivitas dan Anda menghosting fragmen, bukan aktivitas fragment.
flower_green
7

Jika Anda berbicara tentang Activity, AppcompactActivity, ActionBarActivitydll ..

Kita perlu berbicara tentang kelas Base yang mereka perpanjang, Pertama kita harus memahami hierarki kelas super.

Semua hal dimulai dari Konteks yang merupakan kelas super untuk semua kelas ini.

Konteks adalah kelas abstrak yang implementasinya disediakan oleh sistem Android. Hal ini memungkinkan akses ke sumber daya dan kelas khusus aplikasi, serta panggilan untuk operasi tingkat aplikasi seperti meluncurkan aktivitas, menyiarkan dan menerima maksud, dll.

Context diikuti oleh atau diperpanjang oleh ContextWrapper

The ContextWrapper adalah kelas yang memperpanjang Konteks kelas yang hanya delegasi semua panggilan ke konteks lain. Dapat disubklasifikasikan untuk memodifikasi perilaku tanpa mengubah Konteks asli.

Sekarang kita jangkau Activity

The Activity adalah kelas yang meluas ContextThemeWrapper yang satu, hal terfokus bahwa pengguna dapat melakukan. Hampir semua aktivitas berinteraksi dengan pengguna, sehingga kelas Activity mengatur pembuatan jendela untuk Anda

Kelas di bawah ini dibatasi untuk memperpanjang tetapi mereka diperpanjang oleh keturunan mereka secara internal dan memberikan dukungan untuk Api tertentu

The SupportActivity adalah kelas yang meluas Kegiatan yang merupakan kelas dasar untuk menyusun bersama-sama fungsi kompatibilitas

The BaseFragmentActivityApi14 adalah kelas yang meluas SupportActivity yang merupakan kelas Base Hal ini dibatasi kelas tetapi memperpanjang oleh BaseFragmentActivityApi16 untuk mendukung fungsi V14

The BaseFragmentActivityApi16 adalah kelas yang meluas BaseFragmentActivityApi14 yang merupakan kelas Base untuk {@code FragmentActivity } untuk dapat menggunakan V16 API. Tetapi ini juga kelas terbatas tetapi diperluas oleh FragmentActivity untuk mendukung fungsionalitas V16.

sekarang FragmentActivty

The FragmentActivity adalah kelas yang meluas BaseFragmentActivityApi16 dan yang ingin menggunakan berbasis dukungan-Fragmen dan Loader API.

Saat menggunakan kelas ini sebagai lawan dari dukungan fragmen dan pemuat bawaan platform baru, Anda masing-masing harus menggunakan getSupportFragmentManager()dan getSupportLoaderManager()metode untuk mengakses fitur-fitur tersebut.

ActionBarActivity adalah bagian dari Perpustakaan Dukungan. Pustaka dukungan digunakan untuk menghadirkan fitur-fitur baru pada platform lama. Misalnya ActionBar diperkenalkan di API 11 dan merupakan bagian dari Kegiatan secara default (tergantung pada tema sebenarnya). Sebaliknya tidak ada ActionBar di platform lama. Jadi pustaka dukungan menambahkan kelas aktivitas anak ( ActionBarActivity ) yang menyediakan fungsionalitas dan fungsi ActionBar

Pada 2015, ActionBarActivity tidak digunakan lagi dalam revisi 22.1.0 dari Perpustakaan Dukungan. AppCompatActivity harus digunakan sebagai gantinya.

The AppcompactActivity adalah kelas yang meluas FragmentActivity yang kelas dasar untuk kegiatan yang menggunakan dukungan perpustakaan tindakan bar fitur.

Anda bisa menambahkan ActionBar ke aktivitas Anda saat berjalan di API level 7 atau lebih tinggi dengan memperluas kelas ini untuk aktivitas Anda dan mengatur tema aktivitas ke Theme.AppCompatatau tema serupa

Sini

Saya merujuk dua ini satu , dua

Farhana
sumber
3

Karena namanya kemungkinan akan berubah di versi Android masa depan (saat ini yang terbaru adalah AppCompatActivitytetapi mungkin akan berubah di beberapa titik), saya percaya hal yang baik untuk dimiliki adalah kelas Activityyang diperluas AppCompatActivitydan kemudian semua aktivitas Anda diperluas dari yang itu. Jika besok, mereka mengubah nama menjadi AppCompatActivity2misalnya Anda harus mengubahnya hanya di satu tempat.

Belly Mahal
sumber
0

AppCompatActivity memperluas FragmentActivity memperluas BaseFragmentActivityApi16 memperluas BaseFragmentActivityApi14 memperluas DukunganAktivitas meluas Kegiatan

Jadi Aktivitas lebih cepat dari semua & AppCompatActivity adalah yang terbaik dari semuanya.

Ahamadullah Saikat
sumber