안드로이드
[Android] 태스크 관리
앱은 하나의 프로세스 위에서 동작한다. 프로세스가 하나 실행되고 그 위에 가상 머신(Virtual Machine)이 만들어지고, 이 가상 머신 위에서 앱이 실행이 된다. 그러나 인텐트의 액션 데이터의 MIME타입으로 전화 앱을 실행시킬 수 있었다. 이 전화 앱 역시 다른 프로세스 위에서 실행하게 된다. 전화 앱에서 뒤로가기 버튼을 누르면 원래 앱으로 돌아올 수 있어야 하는데, 프로세스 끼리는 정보공유가 어렵다. 그래서 앱에서는 태스크(Task)가 만들어진다. 태스크는 앱이 어떻게 동작할지 결정할 때 사용된다. 태스크를 이용하면 프로세스처럼 독립적인 실행 단위와 상관없이 어떤 화면들이 같이 동작해야 하는지 흐름을 관리하는 것이 가능하다. ex.) A 액티비티에서 B 액티비티(전화 앱)을 실행하면 태스크가 ..
[Android] 플래그와 부가 데이터 - feat. Parcelable과 양방향 데이터 바인딩 사용
액티비티를 만들때 보통 Intent를 생성해서 startActivity를 이용해 띄우게 된다. 같은 액티비티가 여러번 띄워지게 되면 중복해서 띄워지게 되는데, 이런 문제는 플래그를 이용하면 해결할 수 있다. 플래그 플래그는 액티비티가 처리되는 방식을 이해해야 이해가 가능하다. 액티비티는 액티비티 매니저라는 객체에 의해 액티비티 스택에서 관리가 된다. 액티비티가 스택에 쌓이고 상위에 있던 액티비티가 사라지면 그 다음 액티비티가 보여지는 방식으로 관리가 된다. 액티비티 매니저가 관리하는 액티비티는 다음 종류와 같다. 화면에 띄워지는 액티비티 (현재 실행중인 액티비티) 스택에 쌓이는 액티비티 (실행중이였다가 정지되는 액티비티) 동일한 액티비티가 여러 번 생성돼서 스택에 들어가는 것 등을 막는 것이 플래그라는 ..
[Android] 인텐트, Intent
안드로이드에서는 다른 액티비티를 화면에 띄우거나 기능을 동작시킬 때, 그리고 데이터를 전달할 때 인텐트를 사용했다. 시스템은 인텐트에 들어있는 명령을 확인하고 다른 액티비티, 혹은 다른 앱을 띄우는 것이다. 인텐트는 개발자가 만든 앱 구성 요소가 해야 할 일을 지정하는 역할을 한다. 인텐트는 android.content 패키지 안에 정의되어있다. 인텐트는 앱 구성 요소 간 작업 수행을 위한 정보를 전달한다. 다른 앱 구성 요소에 인텐트를 전달하는 메서드는 다음과 같다. startActivity() : 액티비티 시작 startActivityForResult() Deprecated -> ActivityResultLauncher 객체의 launch() + registerForActivityResult() st..
[Android] startActivityForResult Deprecated된 이유와 해결책
startActivityForResult()가 Deprecated되었다. 활동에서 결과 가져오기 | Android 개발자 | Android Developers 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어, 앱에서 카메라 앱 developer.android.com 위 페이지를 본다면 Deprecated된 이유는 AndroidX Activity와 Fragment에 도입된 Activity Result API 사용을 적극 권장. 결과를 얻는 Activity를 실행하는 로직을 사용할 때, 메모리 부족으로 인해 프로세스와 Activity가 사라질 수 있다. (특히 카메라 같은 메모리를 많이 ..
[Android] 화면 여러개 만들어서 화면 전환하기 - onActivityResult, startActivityForResult Deprecated. registerForActivityResult 사용해보기
화면 전환은 액티비티를 전환하는 것으로 이루어진다. (물론 요즘은 프래그먼트를 이용해서 많이 전환한다.) 그렇다고 액티비티만 안다고 안드로이드 앱을 잘 구성할 수 있는 것은 아니다. 안드로이드의 앱 구성 요소에는 네 가지가 있는데 액티비티는 그 중 한 개일 뿐이다. - 안드로이드 앱 구성요소 네 가지 1. 액티비티 2. 서비스 3. 브로드캐스트 수신자 4. 내용 제공자 앱을 단말에 설치했을 때, 안드로이드 시스템이 이 구성요소 네 가지에 대한 정보를 앱에 요구한다. 이 구성요소들에 대한 정보는 앱 프로젝트에 있는 AndroidManifest.xml 파일에 존재한다. 액티비티 같은 경우 이 파일에 ... 태그로 추가해야 새로 만든 액티비티를 화면에 보여줄 수 있다. 액티비티를 시작하는 방법은 두 가지가 있..
[Android] 레이아웃 인플레이션
안드로이드에서는 화면 구성이 두 가지로 나뉘어져 있다. XML 레이아웃 파일 : 화면의 UI구성 소스 코드 파일 : 화면에서 기능을 담당 이 때, 어떤 XML 레이아웃 파일이 어떤 소스 코드 파일로 기능하는지 어떻게 알 수 있을까? 안드로이드 스튜디오로 프로젝트를 새로 만들 때, Override된 OnCreate메서드에는 자동으로 추가되는 것이 있다. setContentView(R.layout.activity_main) (물론 요즘엔 Data Binding해서 쓰긴 하지만 어쨌든 최초로 만들었을 땐 이렇다.) 이 메서드가 XML 레이아웃 파일과 소스 코드 파일을 연결해 주는 것이다. (이 메서드는 MainActivity 파일이 상속받는 AppCompatActivity에 존재하는 것이다.) 매개변수에서 대..
[Android] Do It! 안드로이드 도전 04. SMS 입력 화면 만들고 글자의 수 표시하기 + 데이터 바인딩, 뷰 모델, 라이브 데이터로 풀어보기
Do It! 안드로이드 p.151 도전 04. 문제 editText의 addTextChangedListener를 사용하면 되는 도전 문제 였다.물론 이렇게 할 수도 있지만, 데이터 바인딩과 라이브 데이터를 이용해서도 한번 풀어보았다. 우선 editText의 addTextChangedListener를 사용해서 풀면 다음과 같다. 우선 레이아웃 구조를 살펴보자면 다음과 같다. 제약 레이아웃을 사용한 구조이다. background로 사용한 drawable이 있는데 그냥 검은색 네모칸을 위해 만들어 놓았다. TextView도 하나 만들어 놓아서 바이트 수를 표기할 것이다. 버튼은 두 개를 만들어 놓았고 수평구조를 이루게 레이아웃 선을 선정해 놓았다. EditText의 addTextChangedListener를 ..
[Android] Do It! 안드로이드 도전 03. 두 개의 이미지뷰에 이미지 번갈아 보여주기
Do It! 안드로이드 p.150 도전 03. 문제 app:layout_constraintHorizontal_chainStyle="packed" 라는 속성이 있다. 이 속성값은 제약 레이아웃에서 뷰 두개를 가운데로 모아주는 역할을 해 주는 속성이다. init() 메서드로 전역 변수로 선언한 수평스크롤 뷰 2개를 초기화 해준다. 그리고 upBtn과 downBtn 메서드를 구현해서 버튼 온클릭 리스너로 xml파일에서 정해줬다.
[Android] 스크롤 뷰, Scroll View
스크롤 뷰는 한 화면에 뷰가 모두 보이지 않을 때 사용한다. 단순하게 스크롤 뷰만 추가하면 스크롤이 생긴다. 스크롤 뷰의 방향은 디폴트는 수직 방향이다. 수평 방향의 스크롤 뷰는 HorizontalScrollView를 사용하면 된다. 이렇게 HorizontalScrollView 안에 ScrollView를 넣으면 가로 세로 모두 화면의 크기를 벗어날 경우 스크롤이 생기게 된다. 자바 소스 파일에서 setContentView 메서드로 레이아웃 파일을 지정해 준다. 그리고 init()이라는 초기화 메서드에서 img와 srcView를 초기화 해주고 srcView에 수평방향의 스크롤을 할 수 있도록 setHorizontalScrollBarEnabled(true)를 호출한다. 그리고 BitmapDrawable 자료..
[Android] 프레임 레이아웃, Frame Layout
프레임 레이아웃은 중첩(Overlay) 기능이 있어서 뷰가 추가된 순서대로 차곡차곡 쌓이는 레이아웃이다. 만일 특정 뷰만 보여지게 하고 싶다면 visibility라는 속성을 이용하면 된다. visible : 뷰가 보여진다. 디폴트 값이다. invisible : 뷰를 보진 못하지만 뷰가 그 공간을 차지한다. gone : 뷰를 보지도 못하고 뷰가 그 공간을 차지하지도 않는다. 다음과 같이 이미지뷰를 두 개 생성해 놓고 먼저 생성한 이미지 뷰는 invisible 속성을 준다. 그러면 나중에 생성한 이미지 뷰만 보이게 된다. 이제 이미지를 클릭했을 때 다른 이미지가 보이도록 해 보겠다. xml파일이 아닌 소스 코드에서 소스를 수정하면 된다. 소스 코드가 어려운 구조는 아니다. xml에서 onClick 메서드를 ..