Android

Android

BuildType과 ProductFlavors

BuildType 프로젝트를 개발하다가 보면, debug 모드로 개발을 하다가, 릴리즈 버전으로 빌드해서 테스트를 진행하고자 할 때 Build Variants에서 release를 클릭하여 release 모드로 빌드하는 경험을 했을 것이라고 생각합니다. 이는 BuildType 변경을 통해서 “00용” 앱을 빌드할수 있게 하는 기능입니다. debug : 개발용 release : 배포용 Gradle에서 BuildTypes은 빌드 목적을 구성하여 단일 프로젝트에서 다양한 목적의 앱을 만드는 방법을 제공합니다. 기본적으로 모듈을 만들게 되면 gradle에서 자동 생성된, 다음을 확인할 수 있습니다. android { namespace = "com.example.buildvariants" compileSdk = 3..

Android

setContentView in Activity

우리는 Activity를 사용할 때, 다음과 같이 레이아웃을 정의해둔 xml과 Activity를 연결하기 위해서 onCreate()에서 setContentView를 호출했었습니다. class MainActivity2 : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) } } 오늘은 이 setContentView가 어떤 역할을 하는지 알아보려고 합니다. // In AppCompatActivity @Override public void setContentView(@LayoutRes int l..

Android

Activity

액티비티가 무엇이예요? 라고 정의할 수 있을까 이 글을 작성하기 전에 내가 아는 액티비티는 무엇일까 생각해 보았다. 내가 생각하는 Activity를 비유할 수 있는 단어는 화면(Screen)이다. Activity는 한 어플리케이션에 내용을 담는 스크린.. 화면이기 때문에 사용자의 입력을 받거나, 내용들을 보여줄 수 있는 기능이 필요하다. 한 화면에서 다른 화면으로 이동하는 로직도 필요하구. 어떠한 의도를 보여줄 수 있는 화면 단위. 이제 구글 공식문서에서는 뭐라고 정의하는지 봐보자. What is the Activity? “An activity is a single, focused thing that the user can do.” “액티비티는 사용자가 수행할 수 있는 집중된 단일 작업입니다” 거의 모든..

Android

Android에서 잠금화면 만들어보자

현재 잠금 화면 앱을 개발중에 있습니다. 잠금화면을 구현하기 위해서 필요한 요소들이 어떤게 있는지 얕게 알아보도록하겠습니다. 잠금화면을 만들기 위한 개요는 다음과 같습니다. Launcher Activity부터 하나씩 알아보도록하겠습니다. Launcher Activity Launcher Activity에서는 잠금화면 활성화나, 비밀번호 로직, Permission 체크 등의 기능이 들어갑니다. 잠금화면을 사용할 것 인지 아닌지를 여기서 on off 할 수 있습니다. 또한 Permission check는 잠금화면이 필요한 권한들을 확인합니다. 잠금 화면이 필수적으로 가져야 할 권한은 알림 접근 허용 과 다른 앱 위의 표시 권한입니다. 알림 접근 허용은 Android의 Notification에 접근해서 가져올 ..

Android

Notification을 수신해보자!

이번 사이드 프로젝트로 잠금화면 앱을 만들어보면서, 알림을 잠금화면에 띄우는 기능을 만들어야했습니다. 안드로이드에서는 어떻게 알림을 가져올 수 있을까요? NotificationListenerService 다행히 알림이 왔을때 시스템에서 호출받을 수 있는 서비스클래스가 존재합니다. 바로 NotificationListenerService입니다. NotificationListenerService는 Service를 상속하고 있어서 사용을 위해서 Mainfest.xml에 등록해주는 과정이 필요합니다. 위와 같이 Mainfest.xml에서 service를 등록하고 intent-filter에 NotificationListenerService를 포함합니다. 또한 BIND_NOTIFICATION_LISTENER_SERV..

Android

LiveData를 뜯어보자

LiveData는 Android Jetpack에 포함되어 있는 라이브러리 이며, 관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명주기를 인식하는 특징을 가지고 있습니다. 지금부터 어떻게 LiveData가 값의 변경을 반영하고 수명주기를 인식할 수 있는지 확인해보려고합니다. 일단 LiveData의 사용법부터 시작하도록 하겠습니다. LiveData 사용법 1. 처음으로 특정 타입의 데이터를 보유할 LiveData의 인스턴스를 생성합니다. class NameViewModel : ViewModel(){ private val _currentName : MutableLiveData = MutableLiveData("") val currentName : LiveData =..

Android

Coroutine이 무엇일까요?

Coroutine Coroutine은 "Co" + "Routine"으로 해석할 수 있습니다. "Co"는 "Cooperative"에서 왔고 Cooperative은 협력이라는 뜻을 가지고 있습니다. 그렇다면 "Routine"은 무엇일까요? 중괄호 상의 코드 뭉치를 의미하는데, 이 코드 뭉치를 함수나 메서드들로도 나타낼 수 있습니다. 쉽게 이해를 하기 위해서 루틴은 함수와 비슷하다라고 생각하겠습니다. 두개의 단어를 이어보자면, 협력적인 함수이라고 할 수 있겠네요? "협력적이다"라는 것이 바로는 이해가 되지 않습니다. 협력적이라는 것이 무엇을 뜻하는 걸까요? 위키에서 따온 코루틴의 정의를 보면 다음과 같습니다. 코루틴은 실행을 일시 중단하고 재개할 수 있도록 하여 비선점형 멀티태스킹을 위한 서브루틴을 일반화하는..

Android

Adapter Memory Leak

동아리 mvvm 스터디에서 Android Memory Leak이 발생한다고 설명했지만 정확히 어떻게 메모리 누수가 발생하는지 알아보자. Leak Canary는 SearchFragment에서 Item 클릭 후 해당하는 아이템의 Detail한 정보를 볼 수 있는 DetailFragment로 이동했을 때 memory leak을 탐지했다. 이 상황은 SearchFragment가 onDestroyView가 되었을 때 memory leak이 발생하는 것을 알 수 있었다. 이 메모리릭에 자세히 알아보기 전에 Fragment의 binding에 대해서 알아볼 필요가 있었다. binding = null in onDestroyView() viewbinding은 뷰와 상호작용하는 코드를 쉽게 작성하게 해준다. 뷰바인딩이 활성..

KimDaQ
'Android' 카테고리의 글 목록