progressbar - 진행 상태 표현(막대모양 / 원모양)
- max : 진행 상태의 최대값
- progress : 진행 상태 값
- setProgress(int progress) : 프로그레스 바의 진행 상태 값을 바꿀 수가 있음
- intcrementProgressBy(int diff) : 현재 진행 상태 값에 더하거나 뺄 수 있음
- requestWindowFreature(Window.FEATURE_PROGRESS) : 이 메서드를 사용하면 프로그레스 바가 앱의 타이틀 부분으로 올라가서 컨텐츠를 수월하게 볼 수 있게 해 줌
일반적으로는 앱의 타이틀을 안 보이도록 하기 때문에 크게 유용한 메서드는 아님
화면 간 전환하는 방법
- 액티비티
- 레이아웃
- 액티비티 하나만 사용
- 여러 액티비티를 만들어서 전환하는 방법
레이아웃 인플레이션
- XML 레이아웃 : XML 태그가 들어간 파일 / 화면을 어떻게 배치하고 구성하는지만 정의
- 액티비티 코드 : 잦바 코드로 XML 레이아웃을 불러와 화면에 배치한대로 화면에 보여줌
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
setContentView(R.layout.activity_main);
-> 앱이 실행될 때 / 이 액티비티가 생성될 때 XML 레이아웃의 내용이 메모리에 객체화 됨
-> 객체화된 XML 레이아웃을 setContentView와 그 이후의 소스코드가 사용하는 것
-> XML 레이아웃의 내용이 메모리에 객체화 되는 과정을 인플레이션(inflation)이라고 함
RAM
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#1 (activity_main) | XML 레이아웃 객체
XML 레이아웃은 앱이 실행되는 / 액티비티가 생성되는 시점에 메모리에 객체화됨
XML 레이아웃 안에 태그를 아무리 많이 작성하더라도 실제고 그 XML 레이아웃을 사용하는 액티비티가 생성되지 않으면 앱은 레이아웃의 존재 차체를 모름
ExampleLayoutInflater
setContentView(int layoutResID);
setContentView(View view);
- 현재 액티비티에 보여줄 레이아웃(전체화면)을 설정하는 메서드
현재 메인레이아웃인 전체화면에 작은 부분화면을 만들어 주려면 setContentView로는 해결 불가능
LayoutInflater 클래스를 사용해서 작은 부분 화면을 만들 수 있음
LayoutInflater는 단독으로 사용할 수는 없고 getSystemService 메서드를 같이 사용해야 함
LayoutInflater는 시스템 서비스라고 함
- 시스템서비스 = 내장객체
- 안드로이드 앱이 실행될 때 앱이 만들어 주는 내장객체 / getSystemService로 가져다 씀
ex) LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
여러 화면을 만들고 화면 간 전환
- 메뉴를 누르면 앱의 화면이 메뉴에 따른 화면이 보이게 됨 / 화면은 액티비티로 구성
- 액티비티간의 전환이 일어나면서 메뉴에 따른 적절한 화면(액티비티)를 보여주는 것!
안드로이드 앱의 기본 구성 요소
- 액티비티
- 서비스
- 브로드캐스트 수신자
- 내용 제공자
액티비티를 소스 코드를 사야ㅛㅇ해서 띄울 떄는 startActivity() 메소드 사용
startActivity() -> 액티비티를 화면에 띄운다
startActivityForResult() -> 새 액티비티에서 원래의 액티비티로 돌아올 때 새 액티비티의 결과값을 받을 수 있음
한 액티비티에서 작업했던 또는 생성된 데이터를 유지한 채로 다른 액티비티로 넘어가서 그 데이터를 활용해야되는 경우가 빈번하게 생김
예 ) 로그인 액티비티에서 로그인을 하고 나면은 로그인 정보를 유지한 채로 다른 기능 (액티비티)에서 로그인이 된 상태로 무언가를 해야 함
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[메뉴를 달고 싶을 때 순서]
1. 새로운 액티비티 추가
- 새로운 액티비티를 추가하면 XML 파일 하나, 자바 소스 파일 하나 만들어짐
- manifest 파일에 액티비티 태그가 추가됨
2. 새로운 액티비티의 XML 레이아웃을 정의
3. 메인 액티비티에서 새로운 액티비티를 띄울 수 잇도록 XML레이아웃을 수정하고, 자바 소스코드를 추가
4. 새로운 액티비티에서 메인 액티비티로 보낼 응답 코드와 데이터를 구성 & 보내기
5. 메인 액티비티는 onActivityResult 메소드를 오버라이딩 해서 응답을 처리
(여러 액티비티를 만들어 두고 서로간의 정보를 주고받는 방법)
intent가 중요한 역할을 함
intent에 담아서 정보를 주고받음
intent?!
앱 구성요소 - 액티비티, 서비스, 브로드캐스트 수신자, 내용 제공자
인텐트 - 앱 구성요소가 해야 할 일을 지정
- android.content 패키지 안에 정의되어있음
- 앱 구성요소 간의 작업 수행을 위한 정보를 전달하는 역할
- 다른 앱 구성 요소에 인텐트를 전달할 수 있는 대표적인 메소드
a. startActivity() 또는 startActivityResult()
b. startService() 또는 bindService()
c. broadcastIntent()
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
인텐트의 구성요소
- 액션(Action) : 수행할 기능
a. ACTION_DIAL
b. ACTION_VIEW
c. ACTION_EDIT
- 데이터(Data) : 액션을 수행할 대상의 데이터를 의미
데이터를 안드로이드가 확인한 후 적절한 액티비티를 자동으로 찾아 띄워줄 수 있음
데이터에 들어가는 데이터 타입이 MIME 타입
a. tel:01012345678
b. content://contacts/people | http://www.naver.com
c. content://contacts./people/2
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
인텐트의 생성자
- Intent()
- Intent(Intent o);
- Intent(String action [, Uri uri]);
- Intent(Context packageContext, Class<?> cls); //명시적 인텐트
- Intent(String action, Uri, Context packageContext, Class<?> cls); // 명시적 인텐트
클래스 객체나 컴포넌트 이름을 지정해서 호출할 대상을 확실히 알 수 있는 경우 -> 명시적 인텐트
액션과 데이터는 있지만 호출할 대상을 지정하지 않아서 안드로이드에 따라서 호출할 대상이 달라질 수 있는 경우 -> 암시적 인텐트
- 그 외에도 범주(Category) / 타입(Type) / 컴포넌트(Component) / 부가데이터(Extras)가 더 존재합니다.
ㄱ. 카테고리 - 액션이 실행되는데 필요한 추가적인 정보
CATEGORY_LAUNCHER 라고 지정을 하면 런처(Launcher) 화면에 이 앱을 보여 주어야 한다는 뜻
ㄴ. 타입 - 데이터의 MIME 타입을 명시적으로 지정할 수 있음 / 데이터에 MIME 타입을 사용해서 자주 사용하지는 않음
ㄷ. 컴포넌트 - 인텐트에 사용될 컴포넌트 클래스의 이름을 명시적으로 지정 / 지정한 컴포넌트가 실행됨
ㄹ. 부가 데이터 - 인텐트 안에는 추가적인 정보를 넣을 수 있는 번들(Bundle) 객체를 갖고 있음
번들을 통해서 다른 앱 구성 요소에 데이터를 전달할 수 있음
예) 액션 - 이메일 / 데이터 - 이메일의 제목, 이베일을 받는 사람, 내용 등...
플래그, 부가데이터 사용
- startActivity 또는 startActivityForResult
- 위 메소드를 사용할 때 주의해야할 사항!
- 위 메소드를 호출할 때마다 액티비티가 계속 새롭게 생성
- 액티비티를 중복하지 않고 띄울렴녀 플래그 (Flag)를 사용하면 됨
액티비티를 생성하면 액티비티 스택(stack)에 액티비티가 관리됨
플래그 값
- FLAG_ACTIVITY_SINGLE_TOP : 액티비티를 생성할 때 이미 생성된 액티비티가 있다면 그 액티비티를 그대로 사용
- startActivity, startActivityForResult 메소드를 사용하는 이유...
- 이 플래그와 startActivity, startActivityForResult 메소드를 사용하면 이미 생성된 액티비티를 재활용하는 것이므로 재활용하는 시점에 전달되는 인텐트를 받을 수 없다는 의미가 됨
- 재활용하는 시점에서 전달되는 인텐트를 받으려면?
새로운 액티비티를 띄워주는 액티비티를 부모 액티비티
부모 액티비티로부터 전달받은 인텐트는 재활용하는 액티비티의 onCreate 메소드 안에 getIntent 메소드로 전달받을 수가 있음
onNewIntent 메서드를 사용하면 더 확실하게 부모 액티비티가 전달해 주는 인텐트를 재활용하는 액티비티에 전달받을 수 있음
onNewIntent 메서드를 사용하려면 오버라이딩을 해야 함
onNewIntent 메서드를 오버라이딩 하려면 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달받을 수 있음
- FLAG_ACTIVITY_NO_HISTORY : 액티비티 스택에 없는 액티비티를 띄울 때는 액티비티 스택에 쌓이게 됨/ 액티비티 스택에 이미 있는 액티비티를 띄울 때는 액티비티 스택에 쌓지 않는 플래그
- 이 플래그를 사용해서 액티비티를 띄운다면은 항상 맨 처음 실행되었던 액티비티가 바로 보임
- 예) 알람화면은 한 번만 보여주면 되니까 주로 이 플래그를 사용해서 구현
- FLAG_ACTIVITY_CLEAR_TOP : 이 액티비티 위에 있는 다른 액티비티를 모두 종료시키게 됨
- 예) 홈화면, 메인 액티비티처럼 다른 액티비티보다 항상 우선시 되는 액티비티를 만들 때 유용하게 사용할 수 있음
'웹앱개발 > Android Studio' 카테고리의 다른 글
*2021-05-20 (0) | 2021.06.01 |
---|---|
*2021-05-18 (0) | 2021.06.01 |
*2021-05-17 (0) | 2021.06.01 |
*2021-05-14 (0) | 2021.06.01 |