활동, AppCompatActivity, FragmentActivity 및 ActionBarActivity : 언제 사용해야합니까?


266

쉬운 iOS에서 왔으며 UIViewController를 사용하면됩니다. 그러나 안드로이드에서는 특정 API 레벨에 대한 특정 UIComponent를 사용하면 훨씬 더 복잡해 보입니다. Android 용 BigNerdRanch (책은 대략 2 세)를 읽고 있으며 Activity내 호스팅에 사용 하는 것이 좋습니다 FragmentActivities. 그러나 나는 Activity더 이상 사용되지 않는다고 생각했습니다 .

따라서 API 레벨 22 (API 레벨 15 또는 16에 대한 최소 지원)의 경우 구성 요소를 호스팅하고 구성 요소 자체에 정확히 무엇을 사용해야합니까? 이 모든 용도로 사용됩니까, 아니면 거의 독점적으로 하나 나 둘을 사용해야합니까?


1
당신은 FragmentActivityies를 호스팅하지 않을 것 입니다. 의 호스트 만 호스팅 Fragment합니다. 최신 Android 버전에서는 Activity클래스 자체가 직접 호스팅되도록 업데이트되었습니다. 이전 버전을 지원하기 위해 FragmentActivity도입되었습니다.
라비 Thapliyal

5
마찬가지로 API 11 이상 Activity에서는을 지원했습니다 ActionBar. 이 기능은 이전 버전에서 ActionBarActivity처음 지원되었으며 현재는 더 이상 사용되지 않으며로 대체되었습니다 AppCompatActivity. 이 두 클래스 모두 확장되어 FragmentActivity호스팅도 지원 Fragment합니다.
라비 Thapliyal

답변:


327

활동이 더 이상 사용되지 않는다고 생각했습니다.

아니.

따라서 API 레벨 22 (API 레벨 15 또는 16에 대한 최소 지원)의 경우 구성 요소를 호스팅하고 구성 요소 자체에 정확히 무엇을 사용해야합니까? 이 모든 용도로 사용됩니까, 아니면 거의 독점적으로 하나 나 둘을 사용해야합니까?

Activity기준선입니다. 모든 활동은 Activity에서 직접 또는 간접적으로 상속 합니다.

FragmentActivitysupport-v4support-v13라이브러리 에있는 프래그먼트의 백 포트와 함께 사용합니다 . 프래그먼트의 기본 구현이 제안 된 minSdkVersion값 보다 낮은 API 레벨 11에 추가되었습니다 . FragmentActivityAPI 레벨 17까지 네이티브 프래그먼트에서 지원되지 않았으므로 중첩 된 프래그먼트 (다른 ​​프래그먼트를 보유하는 프래그먼트)를 사용하려는 경우, 특별히 고려해야 할 유일한 이유 입니다.

AppCompatActivityappcompat-v7도서관 에서 왔습니다 . 기본적으로 이것은 작업 표시 줄의 백 포트를 제공합니다. 기본 조치 표시 줄이 API 레벨 11에 추가되었으므로 필요하지 않습니다 AppCompatActivity. 그러나 현재 버전은 appcompat-v7작업 표시 줄 및 다양한 위젯 측면에서 머티리얼 디자인 미학의 제한된 백 포트를 추가합니다. appcompat-v7이 특정 스택 오버플로 답변의 범위를 넘어서는 사용의 장단점 이 있습니다.

ActionBarActivity의 기본 활동의 이전 이름입니다 appcompat-v7. 여러 가지 이유로, 그들은 이름을 바꾸고 싶었습니다. 사용중인 일부 타사 라이브러리가을 주장하지 않는 경우을 ActionBarActivity선호 AppCompatActivity합니다 ActionBarActivity.

따라서 minSdkVersion15-16 범위의 경우 :

  • 백 포트 된 머티리얼 디자인 룩을 원한다면 AppCompatActivity

  • 그렇지 않은 경우 중첩 된 조각을 원한다면 FragmentActivity

  • 그렇지 않은 경우 Activity

메모에서 주석으로 추가하기 만하면됩니다 : AppCompatActivityextends의 FragmentActivity기능을 사용해야하는 사람은 누구나 사용할 FragmentActivity수 있습니다 AppCompatActivity.


머티리얼 디자인 룩을 사용하고 중첩 된 조각을 원한다면 어떻게해야합니까? AppCompatActivity는 FragmentActivity에서 상속합니까?
Orcun Sevsay

4
@MiloRambaldi : 예, FragmentActivity의 조상입니다 AppCompatActivity. 중첩 된 조각을 사용하지 않는 것이 좋지만 중첩 된 조각이 전혀 작동하는 한 중첩 된 조각 AppCompatActivity을 지원합니다.
CommonsWare

자세한 답변 @CommonsWare에 감사드립니다. 어떤 minSDK가 백 포트되지 않은 머티리얼 디자인 Activity없이 최신의 대부분을 사용할 수있게 해줄 수 있습니까 support-v7? 내 목표는 최소 19 목표 25
jugutier

1
@jugutier :를 사용하려면 21 이상 Theme.Material이 필요합니다 minSdkVersion.
CommonsWare

83

Activity다른 모든 활동의 기본 클래스이므로 더 이상 사용되지 않을 것이라고 생각하지 않습니다. 그들 사이의 관계는 다음과 같습니다.

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-'는 여기서 상속을 의미합니다. 참조는 말했다 ActionBarActivity, 사용되지 않습니다 AppCompatActivity대신.

따라서 기본적으로 사용하는 AppCompatActivity것이 항상 올바른 선택입니다. 그들 사이의 차이점은 다음과 같습니다.

  • Activity 기본입니다.
  • 을 바탕으로 Activity, FragmentActivity사용할 수있는 기능을 제공합니다 Fragment.
  • 에 기반하여 FragmentActivityAppCompatActivity기능을 제공합니다 ActionBar.

2
우아한 대답.
M.kazem Akhgary

69

2019 : 사용 AppCompatActivity

이 문서를 작성할 당시 (링크가 여전히 유효 한지 확인) Android 설명서AppCompatActivity 는 앱 바를 사용중인 경우 사용을 권장 합니다.

이것은 합리적입니다 :

Android 3.0 (API 레벨 11)부터 기본 테마를 사용하는 모든 활동에는 앱 바로 ActionBar가 있습니다. 그러나 다양한 Android 릴리스에서 기본 작업 표시 줄에 앱 표시 줄 기능이 점차 추가되었습니다. 결과적으로 기본 ActionBar는 기기에서 사용중인 Android 시스템 버전에 따라 다르게 작동합니다. 반대로 최신 기능은 지원 라이브러리의 툴바 버전에 추가되며 지원 라이브러리를 사용할 수있는 모든 장치에서 사용할 수 있습니다.

이러한 이유로 지원 라이브러리의 툴바 클래스를 사용하여 활동의 앱 바를 구현해야합니다. 지원 라이브러리의 도구 모음을 사용하면 광범위한 장치에서 앱이 일관되게 작동 할 수 있습니다. 예를 들어, 툴바 위젯은 Android 2.1 (API 레벨 7) 이상을 실행하는 디바이스에서 머티리얼 디자인 경험을 제공하지만 디바이스가 Android 5.0 (API 레벨 21) 이상을 실행하지 않으면 기본 조치 표시 줄이 머티리얼 디자인을 지원하지 않습니다.

툴바 추가에 대한 일반적인 지침은

  1. v7 appcompat 지원 라이브러리 추가
  2. 모든 활동을 확장하십시오 AppCompatActivity
  3. 매니페스트에서 원하는 것을 선언하십시오 NoActionBar.
  4. ToolBar각 활동의 xml 레이아웃에를 추가하십시오 .
  5. ToolBar각 활동에서를 가져 옵니다 onCreate.

자세한 내용은 설명서 지침 을 참조하십시오. 그들은 매우 명확하고 도움이됩니다.


@Suragch 님 안녕하세요. 감사합니다. 오늘 21 개만 지원하는 앱을 만들고 있다고 가정 해 보겠습니다. 실제로, 나는 액션 바 또는 앱 바 (전체 화면 앱의 더)를 원하지 않습니다. Studio는 (11 월 16 일) "역 호환성 (AppCompat)"을 사용할 수 있다고 제안 합니다. 내 직감은 AppCompat를 사용하지 않는 것입니다. 전문가의 의견은 무엇입니까? 감사합니다.
Fattie

나는 전문가가 아니기 때문에 전문가의 의견을 줄 수는 없지만 문서는 가능한 한 많은 장치를 지원하도록 제안합니다. 나는 모든 앱에서 AppCompat을 사용하고 있으며 지금까지 잘 작동했습니다. 당신이 정말로 21 이전 프리를 지원하고 싶지 않다면 Studio 제안을 무시할 수 있다고 생각합니다.
Suragch

50

최소 API 레벨 15의 경우을 사용하려고합니다 AppCompatActivity. 예를 들어 MainActivity다음과 같이 보일 것입니다.

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

를 사용하려면 AppCompatActivityGoogle 지원 라이브러리를 다운로드했는지 확인하십시오 (도구-> Android-> SDK 관리자에서 확인할 수 있음). 그런 다음 앱의 gradle.build 파일에 gradle 종속성을 포함하십시오.

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

이것을 AppCompatmain Activity으로 사용하여 조각 또는 다른 활동을 시작하는 데 사용할 수 있습니다 (이는 빌드하는 앱의 종류에 따라 다릅니다).

BigNerdRanch 책은 훌륭한 자료이지만, 구식입니다. Android의 작동 방식에 대한 일반적인 정보는이 설명서를 읽으십시오. 그러나 사용하는 특정 클래스가 최신 버전 인 것은 아닙니다.


그래, gradle.build 파일에 의존성이 있습니다. 예를 들어, 여러 행 (예 : Notes 애플리케이션)이있는 테이블을 만드는 경우 기본 화면은 AppCompat이되고 호스트도 AppCompat이되는 다른 항목이 있습니까? 기본적으로 AppCompat 만 사용해야합니까?
Jameson

따라서 AppCompat은 디자인을 지정하는 일부 레이아웃 리소스를 팽창시킵니다 (행이 많은 테이블). 그러나 행을 클릭 할 때 새 페이지를 열고 싶다고 가정 해 봅시다. onClickListener를 설정하여 새 AppCompat 활동 또는 프래그먼트를 열 수 있습니다.
adao7000

BigNerdRanch는 8 월 3 일 현재 책의 새로운 판을 가지고 있습니다 : amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410

1
@ adao7000 메이트는 15 이상에서는 AppCompatActivity를 사용할 수 있다고 언급했습니다. android.support.v7.app의 v7은 최소 sdk가 7 이상이라고 생각했습니다.
코드 기반

1
@codebased android.support.v7은 API 레벨 9부터 사용할 수 있습니다. 출처 : developer.android.com/topic/libraries/support-library/…
adao7000

30

Activityclass는 기본 클래스입니다. (원본) 조각 관리 (API 11부터)를 지원합니다. 전문성이 훨씬 우수하기 때문에 더 이상 순수한 사용을 권장하지 않습니다.

ActionBarActivity잠시였다 는 응용 프로그램에서 액션 바 취급이 용이했기 때문에 활동 클래스에 교체.

AppCompatActivity이다 액션 바는 더 이상 권장되지 않기 때문에 갈 새로운 방법 당신은 (현재의 대신 도구 모음을 사용한다 액션 바 교체). AppCompatActivity는 FragmentActivity에서 상속되므로 Fragment Manager를 통해 Fragment를 처리해야하는 경우 가능합니다. AppCompatActivity는 16 세 이상이 아닌 모든 API 용입니다 (누가 말했습니까?). Gradle 파일 에 추가하여 사용할 수 있습니다 . API 10에서 사용하고 완벽하게 작동합니다.compile 'com.android.support:appcompat-v7:24:2.0'


1
"ActionBar는 더 이상 사용되지 않습니다"-작업 표시 줄은 더 이상 사용되지 않습니다. "대신 툴바를 사용해야합니다"– 앱을 사용할 필요가 없습니다 Toolbar.
CommonsWare

@CommonsWare Ok, 더 이상 사용되지 않지만 더 순수한 형태 (이전 형태)로 더 이상 사용하지 않는 것이 좋습니다. 이제 앱에 작업 표시 줄을 만들려면 도구 모음을 사용하여 작업 표시 줄을 수동으로 추가해야합니다.
Joaquin Iurchuk

"더 순수한 형태로 사용하는 것은 더 이상 권장되지 않습니다."-귀하의 주장을 정당화 할 수있는 문서 나 공식 블로그 게시물에는 아무것도 보지 못했습니다. 당신은 링크가 있습니까?
CommonsWare

@CommonsWare 당신은 여기 저명하고 당신이 맞습니다. 머티리얼 디자인 가이드 라인에서만 툴바를 액션 바로 사용하는 것이 좋습니다. 정확하지 않은 답변을 삭제해야 할 수도 있습니다. 감사합니다
Joaquin Iurchuk

2
지원 라이브러리 버전 26.0.0 (2017 년 7 월에 릴리스 됨)부터 지원되는 최소 API 레벨이 모든 지원 라이브러리 패키지에 대해 Android 4.0 (API 레벨 14)으로 변경되었습니다. 출처 : developer.android.com/topic/libraries/support-library/…
Andrea Leganza

12

특히 오래된 소스를 읽는 경우 여기에 많은 혼란이 있습니다.

기본은 Activity입니다. 조각을 표시 할 수 있습니다. Android 버전> 4 인 경우이 조합을 사용할 수 있습니다.

그러나, 당신이 언급 한 다른 클래스를 포괄하는 지원 라이브러리는 또한 : FragmentActivity, ActionBarActivityAppCompat. 원래는 Android 버전 <4에서 조각을 지원하는 데 사용되었지만 실제로는 최신 버전의 Android (예 : 머티리얼 디자인)에서 기능을 백 포트하는 데에도 사용됩니다.

최신 버전은 AppCompat이고 다른 하나는 이전입니다. 내가 사용하는 전략은 항상을 사용하는 AppCompat것이므로 향후 버전의 Android에서 백 포트하는 경우 앱이 준비됩니다.


감사합니다! 좋아, 활동하기 위해 AppCompat을 사용하여 호스팅 할 수 있습니다 ... 무엇입니까? 다른 AppCompats를 호스팅하려면? 아니면 FragmentActivities를 호스팅하기 위해?
Jameson

액티비티는 일반적으로 다른 프래그먼트 만 호스팅합니다. FragmentActivity는 걱정할 필요가 없습니다. FragmentActivity는 다른 모든 멋진 XXXActivity에서 파생 된 "기본"클래스에 가깝습니다.
Mehdi

그러나 어떤 클래스를 AppCompat 호스트가해야합니까? 다른 AppCompat 또는 다른 것?
Jameson

여기서 이해해야 할 것은 활동 호스트 조각입니다. 활동은 다른 방법으로 호스팅되지 않으며 중첩 될 수 없습니다. Appcompat은 또 다른 종류의 활동입니다. 그 후에는 조각을 계속 내포 할 수 있지만 관리가 복잡해지기 시작합니다.
flower_green

1
아니요, appcompat를 활동으로 사용하고 조각 활동이 아닌 조각을 호스팅합니다.
flower_green

7

당신에 대해 이야기하면 Activity, AppcompactActivity, ActionBarActivity등 등 ...

확장하는 기본 클래스에 대해 이야기해야합니다. 먼저 슈퍼 클래스의 계층 구조를 이해해야합니다.

모든 것은이 모든 클래스의 수퍼 클래스 인 Context에서 시작됩니다.

컨텍스트 는 Android 시스템에서 구현을 제공하는 추상 클래스입니다. 응용 프로그램 별 리소스 및 클래스에 액세스 할 수 있으며 활동 시작, 방송 및 수신 의도 등과 같은 응용 프로그램 수준 작업을위한 전화

Context 뒤에 또는 확장 ContextWrapper

ContextWrapper이 확장 클래스입니다 상황에 맞는 클래스를 간단하게 모든 다른 문맥과의 통화 위임한다. 원래 컨텍스트를 변경하지 않고 동작을 수정하기 위해 서브 클래 싱 할 수 있습니다.

이제 우리는 Activity

활동 확장하는 클래스입니다 ContextThemeWrapper을 사용자가 할 수있는 하나의 초점을 맞춘 것은입니다. 거의 모든 활동이 사용자와 상호 작용하므로 Activity 클래스가 사용자를 위해 창을 만듭니다.

아래 클래스는 확장이 제한되어 있지만 내부적으로 하위 클래스로 확장되어 특정 API를 지원합니다.

SupportActivity는 함께 호환성 기능을 구성하기위한 기본 클래스입니다 활동을 확장하는 클래스이다

BaseFragmentActivityApi14은 확장하는 클래스입니다 SupportActivity을 그것은 클래스 제한되는 기본 클래스이지만 의해 확장되는 BaseFragmentActivityApi16 의 기능을 지원하기 위해 V14을

BaseFragmentActivityApi16은 확장하는 클래스입니다 BaseFragmentActivityApi14 {@code를위한 기본 클래스입니다 FragmentActivity } 사용할 수 있도록 V16의 API를. 그러나 클래스도 제한되어 있지만 FragmentActivity에 의해 V16의 기능을 지원하도록 확장되었습니다.

지금 FragmentActivty

FragmentActivity은 확장하는 클래스이다 BaseFragmentActivityApi16을 하고는 지원 기반 조각 및 로더 API를 사용하고자합니다.

새로운 플랫폼의 내장 프래그먼트 및 로더 지원과 달리이 클래스를 사용하는 경우 getSupportFragmentManager()getSupportLoaderManager()메소드를 각각 사용하여 해당 기능에 액세스 해야합니다 .

ActionBarActivity 는 지원 라이브러리의 일부입니다. 지원 라이브러리는 이전 플랫폼에서 최신 기능을 제공하는 데 사용됩니다. 예를 들어 ActionBar 는 API 11에 도입되었으며 기본적으로 활동의 일부입니다 (실제 테마에 따라 다름). 반대로 이전 플랫폼 에는 ActionBar 가 없습니다 . 지원 라이브러리는 ActionBar의 기능과 UI 를 제공하는 Activity의 하위 클래스 ( ActionBarActivity )를 추가합니다.

2015 년에 ActionBarActivity 는 지원 라이브러리의 개정판 22.1.0에서 더 이상 사용되지 않습니다. 대신 AppCompatActivity를 사용해야합니다.

AppcompactActivity은 확장하는 클래스입니다 FragmentActivity 지원 라이브러리 작업 표시 줄 기능을 사용하여 활동의 기본 클래스입니다.

활동에 대한이 클래스를 확장하고 활동 테마를 유사한 테마 로 설정하여 API 레벨 7 이상에서 실행할 때 활동에 ActionBar 를 추가 할 수 있습니다.Theme.AppCompat

여기

나는이 두 가지를 참조 하나 ,


3

향후 버전의 Android에서 이름이 변경 될 가능성이 있기 때문에 (현재 최신 버전 AppCompatActivity이지만 언젠가는 변경 될 수 있음) 나는 클래스 Activity가 확장 AppCompatActivity되고 모든 활동 이 그 클래스 에서 확장 된다고 생각합니다 . 내일이면 AppCompatActivity2예를 들어 이름 을 변경하면 한 곳에서 이름 을 변경해야합니다.


0

AppCompatActivity는 확장 FragmentActivity가 확장 BaseFragmentActivityApi16가 확장 BaseFragmentActivityApi14가 확장 SupportActivity가 확장 활동

따라서 활동 이 모든 것보다 빠르며 AppCompatActivity 가 가장 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.