# AndroidManifest.xml
안드로이드 앱의 기본정보를 저장한 파일
icon : 안드로이드 앱 아이콘 지정
label : 안드로이드 앱 제목 지정
activity : 안드로이드 앱 메인 액티비티 지정
android.intent.action.Main : 시작 액티비티 지정 여부
android.intent.category.LAUNCHER : 앱 실행 시 맨 처음 화면에 표시할 시작 액티비티로 지정
# activity_main.xml
화면에 보여질 위젯들을 배치하는 레이아웃 파일을 의미
GUI 형식으로 버튼이나 필요 위젯들을 직관적으로 배치할 수도 있고
CODE형식으로 코드를 작성해서 배치나 설정등을 해줄 수 있다.
# MainActivity.kt
화면(액티비티)에 배치된 위젯에 이벤트를 추가해서 인터랙티브 한 작업을 하거나
기타 백엔드 작업을 위한 코드들을 추가하는 파일을 의미
# 액티비티 activity
앱을 실행했을때 화면을 구성할 수 있도록 해주는 안드로이드 요소
보통 앱의 종류에 따라 하나 이상의 액티비티로 구성될 수 있음
웹으로 비유하자면 하나의 웹페이지 개념으로 이해하면 됨
# res
앱 개발에 필요한 다양한 리소스들을 저장하는 디렉토리
drawable : 앱을 구성하는 각종 시각적 리소스들을 저장
layout : 앱 배치에 사용할 레이아웃 파일을 저장
values : 앱을 구성하는 각종 문자열을 저장하는 파일을 저장
# findViewById
레이아웃에 선언된 구성요소들을 액티비티에서 접근해서
조작하려면 해당 요소를 id로 지정해서 변수에 할당해야 함
findViewById 함수를 이용하면 해당 위젯을 선택한 다음
변수에 할당할 수 있음
, 위젯을 지정할 때는 R.id. 위젯 아이디 형태로 사용해야 함
# View 클래스
안드로이드 화면에서 실제로 사용되는 것들은 모두 View 클래스 상속을 받음
다른 말로 '위젯' 이라고도 함
# ApplicationContext or ActivityContext
Context의 정의
Application 환경에 대한 전역 정보를 접근하기 위한 인터페이스
추상 클래스이며 실제 구현은 Android 시스템에 의해 제공된다
Context를 통해 애플리케이션에 특화된 리소스나 클래스에 접근할 수 있다.
Activity 실행, Intent 브로드캐스팅 그리고 Intent 수신 등과 같은 응용 프로그램 수준의 작업을 수행하기 위한 API를
할 수 있다.
Context의 역할
Context는 애플리케이션과 관련된 정보에 접근하고자 하거나
어플리케이션과 연관된 시스템 레벨의 함수를 호출하고자 할 때 사용된다.
그런데 안드로이드 시스템에서 어플리케이션 정보를 관리하고 있는 것은
시스템이 아닌, ActivityManagerService라는 일종의 또 다른 애플리케이션이다.
따라서 다른 일반적인 플랫폼과는 달리, 안드로이드에서는 애플리케이션과 관련된 정보에 접근하고자 할 때는 ActivityManagerService를 통해야만 한다.
ApplicationContext
어플리케이션 자체와 연동되는 것이므로애플리케이션의 life cycle이 지속되는 동안 동일한 객체
즉 애플리케이션을 종료 후 다시 실행시킬때에만 바뀌는 것.
+ 어플리케이션 전연적으로 하나만 존재하는 싱글턴 객체
ActivityContext
Activity의 라이프사이클과 함께 작동해 onDestroy()와 함께 사라진다.
즉, Activity에 대한 환경 정보들이 Context에 있고, 이 Context에 Intent를 통해 다른 액티비티를 띄우면
액티비티 스택이 쌓이게 된다.
# Intent
인텐트는 앱 컴포넌트(Component)가 무엇을 할 것인지를 담는 메시지 객체이다.
메시지는 의사소통을 하기 위해 보내고 받는 것
메시지를 사용하는 가장 큰 목적은
다른 액티비티, 서비스 , 브로드캐스트 , 리시버 , 컨텐트 프로바이더 등을 실행하는 것.
인텐트는 이들 사이에서 데이터를 주고받기 위한 용도로 사용된다.
intent 사용규칙
1. var로 선언한 프로퍼티에만 사용할 수 있다.
2. 클래스 몸체에 선언한 프로퍼티에만 사용할 수 있다. 주 생성자에는 사용할 수 없다.
3. 사용자 정의 getter/setter를 사용하지 않은 프로퍼티에만 사용할 수 있다.
4. null 허용프로 퍼티에는 사용할 수 없다.
5. 기초 타입 프로퍼티에는 사용할 수 없다.
+
애플리케이션을 만들때 하나의 화면을 가지고 어플리케이션을 만들지는 않는다.
하나의 화면에 모든 기능을 담기란 불가능하다.
대부분의 애플리케이션은 많은 View를 모으고 모아서 만든 결과물이다.
그래서 안드로이드에서 화면 간 이동과 화면간 데이터 전달이 무척이나 빈 전하고 중요하다.
안드로이드에서 페이지 전환과 페이지간 데이터 전달은 Intent를 통해서 구현이 가능하다.
실습)
1. HelloAndroid라는 액티비티를 생성
2. "Hello World" 문구를 보여주는 TextView 위젯 생성
3. 5개 버튼을 생성해서 각 버튼에 ID를 지정 / onClick 이벤트 발생 시 실행될 함수를
4. MainActivity.kt파일 안에서 정의 + 필요한 버튼 ID를 FindViewById를 이용해 변수 설정
package imlsw96.helloandroid
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
class MainActivity : AppCompatActivity() {
// 변수선언시 초기화를 바로 못하는 경우 lateinit 키워드 사용
lateinit var btnSayHello : Button
lateinit var btnGoogle : Button
//lateinit var btn911 : Button
//lateinit var btnGallery : Button
//lateinit var btnFinish : Button
override fun onCreate(savedInstanceState: Bundle?) {
// 안드로이드 앱의 실행 진입점
// 즉, 현재 액티비티가 생성되면 뭔가를 실행하라는 의미
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 화면에 무언가를 출력함
// res - layout - activity_main.xml
btnSayHello = findViewById(R.id.btnSayHello)
btnGoogle = findViewById(R.id.btnGoogle)
// activity_main.xml에 만들어 놓은 id로 위젯을 찾아서 변수에 할당
// btn911 = findViewById(R.id.btn911)
//btnGallery = findViewById(R.id.btnGallery)
//btnFinish = findViewById(R.id.btnFinish)
btnSayHello.setOnClickListener() { // btnSayHello에 클릭이벤트 추가
Toast.makeText(applicationContext, "Hello, World!!",
Toast.LENGTH_SHORT).show()
// makeText(대상, 메세지, 지연시간).show() 잠시동안 메세지를 출력함
// 코틀린에서의 Toast는 자바스크립트의 alert창과 유사하다.
}
btnGoogle.setOnClickListener() {
var gIntent : Intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.co.kr"))
startActivity(gIntent)
} // 버튼 클릭시 새로운 브라우져 뷰를 열어서 구글 홈페이지를 띄움
}
// 특정 위젯을 findViewById 함수로 잡아서 이벤트를 추가할때마다 코드가 지저분해짐
// 따라서, 이벤트 처리를 위한 독립적인 함수를 만들어 처리하는 것이 좋음
// 레이아웃의 onClick 속성에 이벤트 처리함수를 지정하면 됨
fun call911(v: View){
var mIntent : Intent = Intent(Intent.ACTION_VIEW, Uri.parse("tel:/911"));
startActivity(mIntent)
}
fun openGallery(v: View) {
var mIntent : Intent = Intent(Intent.ACTION_VIEW, Uri.parse("content://media/internal/images/media"));
startActivity(mIntent)
}
fun appFinish(v: View) {
finish();
}
}
lateinit 으로 변수를 클래스 안에서 설정해준것을 확인할 수 있다. '
lateinit은 코드 설명을 보면 알 수 있듯이 변수 선언시 초기화를 바로 못하는 경우 사용한다고 나와있다.
여기서 든 의문점으로는 초기화를 바로 못하는 경우는 언제인가에 대한 의문점이 생겼다.
뇌피셜을 돌려보려 코드를 찬찬히 보니 메서드 재정의한 onCreate부분을 봐보면 앱의 액티비티 실행 진입점임을
확인할 수 있는데 lateinit으로 선언한 변수들은 버튼이 클릭되었을때 이벤트를 걸기위해 설정을 해둔것이 아닌가
Toast 하는 문장에서 대상 부분에 applicationContext라고 지정되어있는데 이 부분은 지금 현재 MainActivity를 위치에 해당하는 의미
위의 설명에서 뷰 클래스는 액티비티의 '위젯'들의 최상위 클래스이다. 그중 버튼에 onClick에 맞는 함수들을 걸어놨으니 함수의 인자 값은 View 클래스가 지정된다.
'JAVA & APP :국비지원 학원 복습 > AndroidStudio' 카테고리의 다른 글
04 Files (0) | 2021.02.26 |
---|---|
실습)동물사진 보기 앱 (0) | 2021.02.25 |
02 안드로이드 : widget (0) | 2021.02.25 |