본문 바로가기

프로그래밍/Android16

RecyclerView의 ViewHolder가 wrap_content만 적용될 때 분명 RecyclerView도 math_parent, ViewHolder의 xml도 math_parent로 만들었는데, 빌드해보면 ViewHolder가 자꾸 wrap_content로 적용되는 이슈가 있었다. LayoutInspector를 돌려봐도 wrap_content로 나온다. width 값을 고정 dp로 줘봐도 여전히 똑같고 이래저래 할 수 있는건 다 해봤는데 달라지지 않아서 혹시 ViewHolder를 Inflate할 때 주는 옵션같은게 있나? 해서 찾아보았더니, LayoutInflater를 잘못 쓰고 있었다. 공식 문서에서 가져온 LayoutInflater의 inflate 함수이다. 설명은 간단하게 인자값으로 넣은 xml으로 새로운 뷰 계층을 만들어준다. 인자값은 resource, root, att.. 2020. 12. 19.
안드로이드 서비스 (2) Started Service시작된 서비스란 다른 구성요소가 startService()로 서비스를 호출하고, 서비스는 onStatCommand()에서 백그라운드 작업을 수행하는것을 말한다. 서비스가 시작되면 서비스만의 생애주기를 가지며, 백그라운드 작업은 무기한 실행될 수 있다. 해당 서비스를 호출한 구성요소가 소멸되어도 무관하며, 서비스를 종료시킬 때는 stopSelf()를 호출하여 종료시키거나 다른 구성요소가 stopService()를 호출하여 종료시킬 수 있다. 어플리케이션의 구성요소(액티비티)가 서비스를 시작하면서 intent를 전달하여 데이터를 전달할 수 있다. 서비스는 onStartCommand()에서 수신받는다. 시작된 서비스는 Service와 IntentService 두 가지 클래스를 확장하.. 2019. 2. 18.
안드로이드 서비스 (1) 서비스서비스는 백그라운드에서 오래 실행되는 작업을 수행하는 애플리케이션 구성요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 구성요소(액티비티 같은)가 서비스를 시작할 수 있으며 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행된다. 이 외에도 앱의 구성요소를 서비스에 바인드하여 상호작용 할 수 있다. 서비스의 예로는 네트워크 트랜잭션을 처리하고, 음악을 재생하고, I/O를 처리하며 ContentsProvider와 상호작용할 수 있고 이 모든 작업을 백그라운드에서 실행할 수 있다. 서비스는 두 가지 형태가 있다. -시작됨애플리케이션의 구성요소(예:액티비티)가 startService()를 호출하여 서비스를 시작한다. 서비스는 한 번 시작되면 백그라운드에서 무기한 실행될 수 있으며, 호출한 구성요소가.. 2019. 2. 18.
액티비티 재생성 액티비티 재생성 정상적인 앱 동작으로 인해 액티비티가 정지되는 경우를 알아보자. 사용자가 Back버튼을 누르는 경우액티비티가 finish()를 호출하여 자체적으로 종료하는 경우액티비티가 전면에서 오랬동안 사용되지 않는 경우전면에 있는 액티비티가 많은 리소스를 필요로 하여 백그라운드 프로세스를 종료할 때 앞의 두 경우는 더 이상 액티비티가 필요하지 않다는 사용자의 의지가 명확하므로 시스템에서 더 인스턴스를 유지하지 않는다. 그러나 시스템에 의해 강제로 소멸한 경우 시스템은 액티비티 인스턴스를 기억한다. Bundle 객체의 '키-값' 쌍의 컬렉션에 이러한 정보가 저장된다.*액티비티가 화면을 회전할 때마다 액티비티는 완전히 소멸된 후 다시 생성된다. 이유는 화면 구성이 바뀌어 레이아웃의 대체 리소스를 로딩해야.. 2019. 2. 16.
안드로이드 액티비티 생명주기 안드로이드 액티비티의 수명주기 콜백의 이해 액티비티 인스턴스가 살아있는동안 안드로이드는 계단식 피라미드와 비슷하게 각 생명주기에 해당하는 메소드를 호출한다. 새로운 액티비티가 생성되면 안드로이드는 액티비티의 생명주기를 점차 상향으로 이동시켜서 resumed에서는 사용자와 상호작용 할 수 있는 상태가 된다. 액티비티가 소멸될 때 피라미드에서 점차 내려오기 위해 해당 메소드를 호출하게 되며, 경우에 따라 완전히 하향 이동되지 않고 기다린다. (사용자가 다른 앱으로 전환했거나) 이런 경우 액티비티는 다시 피라미드의 최상향으로 이동할 수 있다.(다시 원래 액티비티로 돌아간 경우) 액티비티의 수명주기를 올바르게 구현하면, 다음을 포함하여 여러가지 상황에서도 앱이 제대로 동작하는것을 보장할 수 있다.사용자가 앱을 .. 2019. 2. 16.
안드로이드 Notification 애플리케이션에 특정 이벤트(문자 메세지 도착이나 SD카드를 꽃았을 때)가 왔을때 사용자에게 그 사실을 인지시켜주어야 한다. Notification은 화면 상단바에 표시되며, 해당 Notification을 확인하고 지우기 전까지는 계속 상단바 리스트에 남아있고 클릭하면 원하는 컴포넌트를 호출할 수 있다. Notification을 사용하기 위해서는 크게 3가지를 구성해야 한다.TickerText(상태 표시줄에 표시되는 텍스트와 이미지)Notification List에 표시되는 항목 Notification List에서 항목을 눌렀을 때 수행할 작업 Notification 객체 생성하기Notification 객체를 생성하면서 상태 표시줄에 표시되는 문자 및 아이콘 이미지를 생성자로서 넣어준다. Notificat.. 2018. 12. 7.
dp/dip/sp/px 단위와 멀티해상도 안드로이드는 다양항 스마트폰의 해상도를 지원하므로 개발할 때 멀티해상도를 신경써야 한다. 스크린의 실제 단위 PX P는 화면을 구성하는 최소 단위이다. PX는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위이므로 안드로이드에서는 PX보다는 DP단위를 써야한다. DPIDot Per Inch의 줄인말로, 1인치에 들어가는 픽셀을 나타내는 단위이다. 안드로이드의 기본 단위는 mdpi : 160dpi 이다. 잠깐 살펴보자ldpi : 120dpimdpi : 160dpi(기본) 픽셀과 dp의 대응이 1:1이다. 즉 1dp는 1px가 된다.hdpi : 240dpixhdpi : 320dpixxhdpi : 480dpixxxhdpi : 640dpi 다양한 디바이스 크기에 대응하기 위해 필요한 .. 2018. 12. 7.
안드로이드 Firebase Auth / Realtime Databsae Firebase Auth는 사용자 인증에 관한 좋은 솔루션이다. 대부분의 앱에서는 사용자의 신원 정보를 필요로 한다. 사용자의 신원이 일단 확인되면, 사용자의 데이터를 클라우드에 저장할 수 있고 사용자의 모든 디바이스에서 사용자에게 맞춘 동일한 경험을 제공할 수 있기 때문이다. Firebase는 앱에서 인증에 필요한 SDK , 백엔드 , 인기 인증 업체에 대한 인증이 지원된다. 또한 Firebase 인증을 통해 다른 Firebase 서비스와 연동이 가능하며 OAuth 2.0 같은 산업 표준을 활용하므로 맞춤 백엔드와 쉽게 통합할 수 있다.1)오픈소스 형태로 제공하는 Firebase Auth UI를 삽입하거나2)Google, Facebook , Github같은 인증업체의 sdk를 통해 인증을 구현한다. 작.. 2018. 12. 6.
안드로이드의 구조 - MVC , MVP , MVVM 안드로이드를 처음 접할때 보통 액티비티에 안에 모든 작업을 수행하도록 코드를 짜는 경우가 많을것이다.가령, 액티비티 내에서 버튼 클릭 이벤트를 만들고, 해당 이벤트안에서 UI변경이나 데이터를 가져와서 넣어주거나 갱신된 데이터를 UI에 표현까지 모두 하나의 액티비티 안에 있는 경우이다. (반성한다.) 당연히 이렇게 코드를 짜다보면 서버와의 통신 부분이 추가되거나, 점차 기능이 추가될수록 가독성도 떨어지고 유지보수가 힘들어지는 코드로 가게 된다. 점점 화면이 복잡해지고 view에 의해 제어되는 로직들이 많아짐에 따라서 이를 분리하려는 노력들이 계속 진행되어왔다 MVC웹 서비스 개발자들이 가장 먼저 접하는 패턴일 것이다.Model : 데이터를 다루는 영역이다. 비지니스 로직이 들어있고, 네트워크, 데이터베이스.. 2018. 12. 6.
안드로이드 방향 전환 안드로이드 액티비티는 고유의 생애주기를 가지고 있다.안드로이드의 화면 방향이 전환이 되면 액티비티는 소멸되었다가 다시 생성되게 된다. 화면이 전환될 때 콜백 메소드의 호출 순서를 살펴보면1.onSavedInstanceState() - 현재 액티비티 상태 저장(EditText에 입력중인 텍스트 같은)2.onPause()3.onStop()4.onDestroy()5.onStart()6.onRestoreInstanceStae() - 액티비티 상태 복구7.onResume() 액티비티의 방향이 전환될 때 방향 변화에 대응할 수 있도록 해주는 속성을 같이 정의해주면, 방향이 변하더라도 액티비티가 소멸되지 않는다. 대신에 onConfigurationChanged(Configuration) 메소드가 호출되면서 환경이 바.. 2018. 12. 6.
안드로이드 컴포넌트 안드로이드 어플리케이션은 어떤 구조를 가지고 있는지 살펴보자. 안드로이드 구조는 사용자가 눈으로 보면서 상호작용을 하는 컴포넌트 - Activity , Notification이 있고, 눈에 보이지 않거나 백그라운드에서 실행되는 컴포넌트 - Broadcast Receiver, Content Provider, Service가 있다.intent와 notification은 안드로이드의 컴포넌트라고는 할 수 없지만 매우 밀접한 연관이 있으므로 같이 다룬다. 애플리케이션은 이들 컴포넌트의 여러 구성요소로 이루어져 있고 이들을 서로 호출하기 위해서는 intent를 사용한다. Activity액티비티는 애플리케이션의 한 화면을 뜻한다. 또한 실제 사용자와 소통하여 상호작용하는 컴포넌트이다. 안드로이드는 메모리 관리를 위.. 2018. 12. 6.
안드로이드 AlaramManager 안드로이드 백그라운드 작업먼저 첫번째 분류로서 처리하는 작업의 실행 시점에 따라서 1)당장 실행되어야 하거나2)설정한 조건에 맞으면 실행이 되거나로 나눌 수 있다. 두번째 분류는 작업의 결과가1)항상 작업이 실행이 되어야 한다.2)경우에 따라서 실행이 되지 않을 수 있다. 두 가지 기준에 따라서 사분면으로 나눌 수 있다.상황에 따라서 적절한 백그라운드 작업을 실행해야 한다. 초기에 안드로이드의 백그라운드 작업은 어렵지 않았다. 개발자는 필요에 따라 브로드캐스트 리시버로 앱을 깨우는 것도 가능했고 iOS와 대비되는 차이점이기도 했다. 그러나 장점이 높은만큼 앱들이 각자 백그라운드 작업을 돌린다면 안드로이드의 한정된 메모리와 CPU자원을 소모하게 되고, 안드로이드는 리눅스 커널과 다르게 스왑 공간이 없고 O.. 2018. 12. 5.
Android Material CalendarView 안드로이드에서 제공하는 기본 캘린더는 날짜를 다중 선택할 수가 없고, custom 하기에는 제한적이다. Material CalendarView 오픈소스 라이브러리를 활용해보자. https://github.com/prolificinteractive/material-calendarview 위 주소에서 사용방법을 볼 수 있다. 프로젝트에 적용해서 활용했던 기능은 다음과 같다. widget = findViewById(R.id.calendar_access_search); widget.setCurrentDate(new Date(System.currentTimeMillis())); widget.setDateSelected(new Date(System.currentTimeMillis()), false); widget... 2018. 12. 5.
안드로이드 Camera의 영상 출력하기 항상 정리되지 않았던 부분이라 짚고 넘어간다. 이번 장의 목표는 Camera 영상을 저번에 만든 Surface에 뿌려주는 것. SurfaceView의 코드에서 Camera 객체를 추가하여 preview까지 하는 코드를 우선 살펴보자. public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Camera mCamera; public MySurfaceView(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(.. 2018. 12. 5.
Android SurfaceView SurfaceView란? SufaceView라는 이름에서 알 수 있듯이 Textview나 ImageView처럼 내용을 표시할 수 있는 View이다. SurfaceView에서 직접 내용을 뿌려주지는 않고, SurfaceHolder를 통해 데이터를 받아서 처리한다. Android Thread편에서 알 수 있듯이 안드로이드의 모든 컴포넌트에서 동작하는 행위들은(View처리) Android의 UI 쓰레드에서 동작한다. 그러나 Camera Preview나, 동영상 재생 같은 처리들은 1초에 몇 십 프레임을 출력해야하는 제법 무거운 작업들이고 Android UI 혼자 감당하기에는 자원이 부족, 이는 곧 치명적인 ANR이 발생하는 원인이 된다. SurfaceView는 UI 쓰레드와는 별도로 백그라운드 쓰레드에서 동작.. 2018. 12. 4.
안드로이드 쓰레드(1) 목표1.안드로이드 쓰레드에 대해 알아본다.(정의, 메인쓰레드가 동작하는 방식, 필요한 이유, ANR)2.핸들러, 루프, 메세지 큐 등에 대해 알아본다.3.Message와 Runnable에 대해 알아본다.4.HandlerThread 클래스에 대해 알아본다.5.AsyncTask에 대해 간략히 알아본다. 5.쓰레드 구현 방법에 대해서 알아본다.(Thread 클래스 상속, Runnable 인터페이스 구현) 안드로이드 멀티쓰레딩안드로이드와 같은 클라이언트 프로그래밍에서 가장 복잡하고도 중요한 부분은 여러 쓰레드에서 실행되는 코드를 작성해야 하는 경우이다.공식 안드로이드 문서에서는 "기본적으로 같은 애플리케이션의 모든 컴포넌트는 같은 프로세스 및 쓰레드(메인 쓰레드 혹은 UI쓰레드)에서 실행된다." 라고 말한다. .. 2018. 11. 12.