Hoạt động, AppCompatActivity, FragmentActivity và ActionBarActivity: Khi nào nên sử dụng cái nào?


266

Tôi đến từ iOS nơi dễ dàng và bạn chỉ cần sử dụng UIViewControll. Tuy nhiên, trong Android mọi thứ có vẻ phức tạp hơn nhiều, với các UIComponents nhất định cho các Cấp API cụ thể. Tôi đang đọc BigNerdRanch cho Android (cuốn sách này khoảng 2 năm tuổi) và họ đề nghị tôi sử dụng Activityđể lưu trữ FragmentActivities. Tuy nhiên, tôi nghĩ Activityđã bị phản đối.

Vậy đối với API cấp 22 (với sự hỗ trợ tối thiểu cho API cấp 15 hoặc 16), chính xác tôi nên sử dụng cả hai để lưu trữ các thành phần và cho chính các thành phần đó? Có sử dụng cho tất cả những điều này, hoặc tôi nên sử dụng một hoặc hai gần như độc quyền?


1
Bạn sẽ không được lưu trữ FragmentActivityies. Bạn chỉ lưu trữ Fragments. Trên các phiên bản Android mới hơn, Activitylớp này đã được cập nhật để lưu trữ chúng trực tiếp. Để hỗ trợ các phiên bản cũ hơn FragmentActivityđã được giới thiệu.
Ravi Thapliyal 8/07/2015

5
Tương tự, với API 11+ Activityies đã hỗ trợ cho một ActionBar. Điều này đã được hỗ trợ trên các phiên bản cũ hơn cho đến ActionBarActivitynay đã bị phản đối và thay thế bằng AppCompatActivity. Vì, cả hai lớp này đều mở rộng FragmentActivitynên chúng cũng hỗ trợ lưu trữ Fragment.
Ravi Thapliyal 8/07/2015

Câu trả lời:


327

Tôi nghĩ rằng hoạt động đã được phản đối

Không.

Vậy đối với API cấp 22 (với sự hỗ trợ tối thiểu cho API cấp 15 hoặc 16), chính xác tôi nên sử dụng cả hai để lưu trữ các thành phần và cho chính các thành phần đó? Có sử dụng cho tất cả những điều này, hoặc tôi nên sử dụng một hoặc hai gần như độc quyền?

Activitylà đường cơ sở. Mọi hoạt động đều kế thừa từ Activity, trực tiếp hoặc gián tiếp.

FragmentActivityđược sử dụng với backport của các mảnh được tìm thấy trong support-v4support-v13thư viện. Việc triển khai riêng các đoạn đã được thêm vào trong API Cấp 11, thấp hơn minSdkVersiongiá trị đề xuất của bạn . Lý do duy nhất tại sao bạn cần xem xét FragmentActivitycụ thể là nếu bạn muốn sử dụng các đoạn lồng nhau (một đoạn chứa một đoạn khác), vì điều đó không được hỗ trợ trong các đoạn gốc cho đến API cấp 17.

AppCompatActivitylà từ appcompat-v7thư viện. Về cơ bản, điều này cung cấp một backport của thanh hành động. Vì thanh hành động gốc đã được thêm vào trong API cấp 11, nên bạn không cần AppCompatActivityđiều đó. Tuy nhiên, các phiên bản hiện tại appcompat-v7cũng bổ sung một cổng giới hạn về thẩm mỹ Thiết kế Vật liệu, về mặt thanh hành động và các vật dụng khác nhau. Có những ưu và nhược điểm của việc sử dụng appcompat-v7, vượt ra ngoài phạm vi của câu trả lời Stack Overflow cụ thể này.

ActionBarActivitylà tên cũ của hoạt động cơ sở từ appcompat-v7. Vì nhiều lý do, họ muốn thay đổi tên. Trừ khi một số thư viện bên thứ ba mà bạn đang sử dụng khăng khăng ActionBarActivity, bạn nên ưu tiên AppCompatActivityhơn ActionBarActivity.

Vì vậy, đưa ra của bạn minSdkVersiontrong phạm vi 15-16:

  • Nếu bạn muốn giao diện Thiết kế Vật liệu được nhập, hãy sử dụng AppCompatActivity

  • Nếu không, nhưng bạn muốn các đoạn lồng nhau, sử dụng FragmentActivity

  • Nếu không, sử dụng Activity

Chỉ cần thêm từ nhận xét như ghi chú: AppCompatActivitymở rộng FragmentActivity, vì vậy bất cứ ai cần sử dụng các tính năng của FragmentActivityđều có thể sử dụng AppCompatActivity.


Điều gì sẽ xảy ra nếu tôi muốn sử dụng giao diện Thiết kế Vật liệu và cũng muốn các đoạn lồng nhau? AppCompatActivity có kế thừa từ FragmentActivity không?
Orcun Sevsay

4
@MiloRambaldi: Vâng, FragmentActivitylà tổ tiên của AppCompatActivity. Mặc dù tôi không khuyên bạn nên sử dụng các đoạn lồng nhau, đến mức các mảnh lồng nhau hoạt động hoàn toàn, AppCompatActivitysẽ hỗ trợ các đoạn lồng nhau.
CommonsWare

Cảm ơn câu trả lời chi tiết @CommonsWare. Bạn có thể nói minSDK nào sẽ cho phép chỉ sử dụng Activityhầu hết các bản mới nhất mà không có support-v7nghĩa là Thiết kế Vật liệu không được hỗ trợ. Mục tiêu của tôi là tối thiểu 19 mục tiêu 25
jugutier 17/2/2017

1
@jugutier: Để sử dụng Theme.Material, bạn cần minSdkVersiontừ 21 trở lên.
CommonsWare

83

Activitylà lớp cơ sở của tất cả các hoạt động khác, tôi không nghĩ nó sẽ bị từ chối. Mối quan hệ giữa chúng là:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' có nghĩa là thừa kế ở đây. Các tài liệu tham khảo cho biết ActionBarActivitylà không dùng nữa, sử dụng AppCompatActivitythay thế.

Vì vậy, về cơ bản, sử dụng AppCompatActivityluôn luôn là lựa chọn đúng đắn. Sự khác biệt giữa chúng là:

  • Activity là một trong những cơ bản.
  • Dựa trên Activity, FragmentActivitycung cấp khả năng sử dụng Fragment.
  • Dựa trên FragmentActivity, AppCompatActivitycung cấp các tính năng để ActionBar.

2
câu trả lời tao nhã.
M.kazem Akhÿ

69

2019: Sử dụng AppCompatActivity

Tại thời điểm viết bài này (kiểm tra liên kết để xác nhận nó vẫn đúng), Tài liệu Android khuyên bạn nên sử dụng AppCompatActivitynếu bạn đang sử dụng Thanh ứng dụng.

Đây là lý do được đưa ra:

Bắt đầu với Android 3.0 (API cấp 11), tất cả các hoạt động sử dụng chủ đề mặc định đều có ActionBar dưới dạng thanh ứng dụng. Tuy nhiên, các tính năng trên thanh ứng dụng đã dần được thêm vào ActionBar gốc qua các bản phát hành Android khác nhau. Do đó, ActionBar bản địa hoạt động khác nhau tùy thuộc vào phiên bản hệ thống Android mà thiết bị có thể đang sử dụng. Ngược lại, các tính năng gần đây nhất được thêm vào phiên bản Thanh công cụ của thư viện hỗ trợ và chúng có sẵn trên bất kỳ thiết bị nào có thể sử dụng thư viện hỗ trợ.

Vì lý do này, bạn nên sử dụng lớp Thanh công cụ của thư viện hỗ trợ để triển khai các thanh ứng dụng của hoạt động. Sử dụng thanh công cụ của thư viện hỗ trợ giúp đảm bảo rằng ứng dụng của bạn sẽ có hành vi nhất quán trên phạm vi rộng nhất của thiết bị. Ví dụ: tiện ích Thanh công cụ cung cấp trải nghiệm thiết kế vật liệu trên các thiết bị chạy Android 2.1 (API cấp 7) trở lên, nhưng thanh hành động gốc không hỗ trợ thiết kế vật liệu trừ khi thiết bị chạy Android 5.0 (API cấp 21) trở lên.

Các hướng chung để thêm ToolBar là

  1. Thêm thư viện hỗ trợ appcompat v7
  2. Làm cho tất cả các hoạt động của bạn mở rộng AppCompatActivity
  3. Trong tờ khai kê khai mà bạn muốn NoActionBar.
  4. Thêm một ToolBarbố cục xml của mỗi hoạt động.
  5. Nhận được ToolBartrong mỗi hoạt động onCreate.

Xem hướng dẫn tài liệu để biết thêm chi tiết. Họ khá rõ ràng và hữu ích.


Xin chào @Suragch, cảm ơn vì điều này. Giả sử tôi đang tạo một ứng dụng hôm nay CHỈ hỗ trợ 21 trở đi. Thật vậy, như nó xảy ra, tôi không muốn, bao giờ, một thanh hành động hoặc thanh ứng dụng (nhiều hơn một ứng dụng toàn màn hình). Studio đang đề xuất (ngày 16 tháng 11) Tôi có thể sử dụng "Khả năng tương thích ngược (AppCompat)" . Bản năng ruột của tôi là KHÔNG sử dụng AppCompat. Ý kiến ​​chuyên gia của bạn là gì? Tôi chỉ có thể cảm ơn bạn, cảm ơn.
Fattie

Tôi không phải là chuyên gia nên tôi không thể đưa ra ý kiến ​​chuyên gia, nhưng tài liệu cho thấy hỗ trợ càng nhiều thiết bị càng tốt vì vậy đó là những gì tôi làm. Tôi sử dụng AppCompat với tất cả các ứng dụng của mình và nó đã hoạt động tốt cho đến nay. Tôi cho rằng nếu bạn thực sự không muốn hỗ trợ trước 21 thì bạn có thể bỏ qua đề xuất Studio.
Suragch

50

Đối với cấp API tối thiểu là 15, bạn muốn sử dụng AppCompatActivity. Vì vậy, ví dụ, bạn MainActivitysẽ trông như thế này:

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

Để sử dụng AppCompatActivity, hãy đảm bảo bạn đã tải xuống Thư viện hỗ trợ của Google (bạn có thể kiểm tra điều này trong Công cụ của mình -> Android -> Trình quản lý SDK). Sau đó, chỉ cần bao gồm phụ thuộc lớp trong tệp gradle.build của ứng dụng của bạn:

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

Bạn có thể sử dụng mục này AppCompatlàm mục đích chính Activity, sau đó có thể được sử dụng để khởi chạy Fragment hoặc các Hoạt động khác (điều này phụ thuộc vào loại ứng dụng bạn đang xây dựng).

Cuốn sách BigNerdRanch là một tài nguyên tốt, nhưng vâng, nó đã lỗi thời. Đọc nó để biết thông tin chung về cách Android hoạt động, nhưng đừng mong đợi các lớp cụ thể mà họ sử dụng sẽ được cập nhật.


OK, tôi có sự phụ thuộc đó trong tập tin gradle.build của tôi. Vì vậy, ví dụ: nếu tôi tạo một bảng có nhiều hàng (như bất kỳ ứng dụng Ghi chú nào), màn hình chính của tôi sẽ là AppCompat và bất kỳ thứ gì khác mà máy chủ lưu trữ cũng sẽ là AppCompat? Tôi về cơ bản chỉ cần sử dụng AppCompat?
Jameson

Vì vậy, AppCompat của bạn sẽ tăng một số tài nguyên bố cục chỉ định thiết kế (bảng có một loạt các hàng). Nhưng hãy nói rằng bạn muốn mở một trang mới khi bạn nhấp vào một hàng. Bạn có thể đặt onClickListener để mở Hoạt động AppCompat mới hoặc Đoạn.
adao7000

Kể từ ngày 3 tháng 8, BigNerdRanch có một phiên bản mới của cuốn sách của mình: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/
đấm

1
@ adao7000 mate nơi đã đề cập rằng từ 15 trở lên, bạn có thể sử dụng AppCompatActivity - Tôi nghĩ v7 trong android.support.v7.app dành cho sdk tối thiểu là 7.
mã hóa vào

1
@codebasing android.support.v7 có thể được sử dụng bắt đầu ở cấp API 9. Nguồn: developer.android.com/topic/lologists/support-l
Library / trộm

30

Activitylớp là lớp cơ bản. (Bản gốc) Nó hỗ trợ quản lý Fragment (Kể từ API 11). Không được khuyến khích sử dụng thuần túy nữa vì chuyên môn của nó tốt hơn nhiều.

ActionBarActivitytrong một khoảnh khắc, sự thay thế cho lớp Activity vì nó dễ dàng xử lý ActionBar trong một ứng dụng.

AppCompatActivitynhững cách mới để đi vì ActionBar không khuyến khích nữa và bạn nên sử dụng thanh công cụ để thay thế (đó là hiện các thay ActionBar). AppCompatActivity kế thừa từ FragmentActivity vì vậy nếu bạn cần xử lý Fragment bạn có thể (thông qua Trình quản lý Fragment). AppCompatActivity dành cho BẤT K API API, không chỉ 16+ (ai nói vậy?). Bạn có thể sử dụng nó bằng cách thêm compile 'com.android.support:appcompat-v7:24:2.0'vào tập tin Gradle của bạn. Tôi sử dụng nó trong API 10 và nó hoạt động hoàn hảo.


1
"ActionBar hiện không được dùng nữa" - thanh hành động không được dùng nữa. "Bạn cần sử dụng Thanh công cụ thay thế" - ứng dụng không cần sử dụng Toolbar.
CommonsWare 8/07/2015

@CommonsWare Ok, nó không bị phản đối nhưng việc sử dụng nó không được khuyến khích nữa ở dạng thuần túy hơn (dạng cũ). Bây giờ, nếu bạn muốn có Action Bar trong ứng dụng của mình, bạn nên thêm nó bằng tay bằng Thanh công cụ.
Joaquin Iurchuk

"Việc sử dụng nó không được khuyến khích nữa ở dạng thuần túy hơn" - Tôi chưa thấy gì trong tài liệu hoặc bài đăng trên blog chính thức sẽ chứng minh cho yêu cầu của bạn. Bạn có một liên kết?
CommonsWare 8/07/2015

@CommonsWare Bạn là người nổi bật ở đây và bạn đã đúng. Chỉ các nguyên tắc thiết kế Vật liệu mới đề xuất sử dụng Thanh công cụ làm Thanh hành động. Có lẽ tôi nên xóa câu trả lời của mình vì nó không chính xác. Cảm ơn
Joaquin Iurchuk 8/07/2015

2
Bắt đầu với Thư viện hỗ trợ phiên bản 26.0.0 (phát hành vào tháng 7 năm 2017), cấp API được hỗ trợ tối thiểu đã thay đổi thành Android 4.0 (API cấp 14) cho tất cả các gói thư viện hỗ trợ. nguồn: developer.android.com/topic/lologists/support-l
Library / từ

12

Có rất nhiều nhầm lẫn ở đây, đặc biệt nếu bạn đọc các nguồn lỗi thời.

Một trong những cơ bản là Activity, có thể hiển thị các mảnh. Bạn có thể sử dụng kết hợp này nếu bạn đang ở phiên bản Android> 4.

Tuy nhiên, đó cũng là một thư viện hỗ trợ trong đó bao gồm các lớp học khác mà bạn đề cập: FragmentActivity, ActionBarActivityAppCompat. Ban đầu chúng được sử dụng để hỗ trợ các đoạn trên phiên bản Android <4, nhưng thực ra chúng cũng được sử dụng để sao lưu chức năng từ các phiên bản Android mới hơn (ví dụ như thiết kế vật liệu).

Cái mới nhất là AppCompat, 2 cái còn lại đều cũ. Chiến lược tôi sử dụng là luôn luôn sử dụng AppCompat, để ứng dụng sẽ sẵn sàng trong trường hợp backport từ các phiên bản Android trong tương lai.


Cảm ơn bạn! OK, vậy tôi có thể sử dụng AppCompat thay cho Activity để lưu trữ ... cái gì? Để lưu trữ các AppCompats khác? Hoặc để lưu trữ FragmentActivities?
Jameson

Một hoạt động thường chỉ lưu trữ các phân đoạn khác ... Và đừng lo lắng về FragmentActivity, đó là một lớp "cơ sở", mà tất cả các hoạt động XXXActivity ưa thích khác bắt nguồn từ đó.
Mehdi

Nhưng lớp nào nên lưu trữ AppCompat của tôi? Một AppCompat khác, hay cái gì khác?
Jameson

Bạn chỉ có một điều cần hiểu ở đây: các hoạt động lưu trữ các đoạn. Các hoạt động không được lưu trữ bởi bất cứ điều gì khác bằng cách này, chúng không thể được lồng nhau. Appcompat chỉ là một loại hoạt động khác. Sau đó, bạn có thể tiếp tục và lồng các mảnh, nhưng điều đó bắt đầu phức tạp để quản lý.
hoa_

1
Không, bạn sử dụng appcompat như một hoạt động và bạn lưu trữ các đoạn chứ không phải các đoạn.
hoa_ xanh

7

Nếu bạn nói về Activity, AppcompactActivity, ActionBarActivityvv vv ..

Chúng ta cần nói về các lớp Cơ sở mà chúng đang mở rộng, Đầu tiên chúng ta phải hiểu thứ bậc của các siêu lớp.

Tất cả mọi thứ được bắt đầu từ Ngữ cảnh là siêu hạng cho tất cả các lớp này.

Bối cảnh là một lớp trừu tượng có triển khai được cung cấp bởi hệ thống Android. Nó cho phép truy cập vào các tài nguyên và các lớp dành riêng cho ứng dụng, cũng như các cuộc gọi lên cho các hoạt động ở cấp ứng dụng như các hoạt động khởi chạy, phát sóng và nhận ý định, v.v.

Context được theo sau hoặc mở rộng bởi ContextWrapper

Các ContextWrapper là một lớp mà mở rộng Context lớp mà chỉ đơn giản đại biểu tất cả các cuộc gọi của mình cho bối cảnh khác. Có thể được phân lớp để sửa đổi hành vi mà không thay đổi Ngữ cảnh gốc.

Bây giờ chúng tôi đạt đến Activity

Các Hoạt động là một lớp học kéo dài ContextThemeWrapper đó là một duy nhất, điều tập trung mà người dùng có thể làm. Hầu như tất cả các hoạt động đều tương tác với người dùng, vì vậy lớp Activity đảm nhiệm việc tạo một cửa sổ cho bạn

Các lớp bên dưới bị hạn chế gia hạn nhưng chúng được mở rộng bởi nội bộ của chúng và cung cấp hỗ trợ cho Api cụ thể

Các SupportActivity là một lớp mà mở rộng Hoạt động đó là một lớp cơ sở cho việc soạn thảo chức năng tương thích với nhau

Các BaseFragmentActivityApi14 là một lớp học kéo dài SupportActivity đó là một lớp cơ sở này bị hạn chế lớp nhưng nó được mở rộng bởi BaseFragmentActivityApi16 để hỗ trợ các chức năng của V14

Các BaseFragmentActivityApi16 là một lớp học kéo dài BaseFragmentActivityApi14 đó là một lớp cơ sở cho {@code FragmentActivity } để có thể sử dụng v16 API. Nhưng nó cũng bị hạn chế lớp nhưng nó được mở rộng bởi FragmentActivity để hỗ trợ chức năng của V16.

bây giờ FragmentActivty

Các FragmentActivity là một lớp học kéo dài BaseFragmentActivityApi16 và muốn sử dụng sự hỗ trợ dựa trên Fragment và Loader API.

Khi sử dụng lớp này trái ngược với hỗ trợ phân đoạn và bộ nạp tích hợp của nền tảng mới, bạn phải sử dụng các phương thức getSupportFragmentManager()getSupportLoaderManager()phương thức tương ứng để truy cập các tính năng đó.

ActionBarActivity là một phần của Thư viện hỗ trợ. Thư viện hỗ trợ được sử dụng để cung cấp các tính năng mới hơn trên các nền tảng cũ hơn. Ví dụ: ActionBar được giới thiệu trong API 11 và là một phần của Hoạt động theo mặc định (tùy thuộc vào chủ đề thực sự). Ngược lại, không có ActionBar trên các nền tảng cũ hơn. Vì vậy, các thư viện hỗ trợ thêm một lớp con của hoạt động ( ActionBarActivity ) mà cung cấp của ActionBar chức năng và giao diện người dùng

Năm 2015 ActionBarActivity bị phản đối trong phiên bản 22.1.0 của Thư viện hỗ trợ. AppCompatActivity nên được sử dụng thay thế.

Các AppcompactActivity là một lớp học kéo dài FragmentActivity đó là cơ sở lớp học cho các hoạt động sử dụng các tính năng thư viện Action Bar hỗ trợ.

Bạn có thể thêm ActionBar vào hoạt động của mình khi chạy trên API cấp 7 trở lên bằng cách mở rộng lớp này cho hoạt động của bạn và đặt chủ đề hoạt động thành Theme.AppCompathoặc một chủ đề tương tự

Đây

Tôi giới thiệu hai , một , hai


3

Vì tên có thể sẽ thay đổi trong các phiên bản Android trong tương lai (hiện tại là phiên bản mới nhất AppCompatActivitynhưng có thể sẽ thay đổi vào một lúc nào đó), tôi tin rằng một điều tốt để có là một lớp Activitymở rộng AppCompatActivityvà sau đó tất cả các hoạt động của bạn mở rộng từ đó. Nếu ngày mai, họ đổi tên thành AppCompatActivity2ví dụ, bạn sẽ phải thay đổi nó chỉ ở một nơi.


0

AppCompatActivity mở rộng FragmentActivity mở rộng BaseFragmentActivityApi16 mở rộng BaseFragmentActivityApi14 mở rộng SupportActivity mở rộng Hoạt động

Vì vậy, Activity nhanh hơn tất cả & AppCompatActivity là tốt nhất trong tất cả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.