![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cPWXwS/btqErK6wulI/Ail7zoMPoULXmI9xkN9w3K/img.png)
https://developer.android.com/guide/components/intents-filters?hl=ko#PendingIntent * Intent : 시스템에서 안드로이드 구성요소에 데이터를 전달하기 위한 메시지 역할 수행 Intent를 전달받는 구성요소 - Activity : 앱 안의 단일화면으로써, Intent를 통해 Activity를 시작할 수 있음. ( startActivity, startActivityForResult ) - Service : 사용자와의 인터페이스 없이 백그라운드 작업을 수행하는 요소로써, Intent를 통해 Service를 시작할 수 있음 ( API 21 이하 : Service 클래스로 서비스 시작 , API 21 이상 : JobScheduler로 서비스 시작..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/0jn8F/btqEgQylhQ9/nk2ucsplVaD7DpK6X1i7D1/img.png)
RecyclerView 를 구현하면서 데이터 변경사항을 알리기 위해, notifyDataSetChanged(); 를 호출한다. 근데, 이 함수는 데이터셋의 변경된 일부분에 대한 업데이트가 아닌, 데이터셋 전체를 새로운 리스트에 리로드한다. 즉, 변경할 때마다 새로운 리스트에 전체를 리로드한다는 것이며, 성능에 문제가 발생할 수 있다는 말이다. 물론, notifyDatSetChanged()가 아닌 notifyItemChanged(int), notifyItemInserted(int) ... 등의 함수를 사용하여 해결해도 된다. 그러나, 변경된 아이템의 위치정보를 알고 있어야 하고, 데이터 변경의 오퍼레이션(insert, remove, update.. )도 알고 있어야 하는 까다로움(?)이 있다. 그러니.....
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bjGgT2/btqEcToLMrC/rXR2yCFSzgfOB3T1vIohV1/img.png)
MainActivity에서 ViewModel 클래스에 대한 인스턴스를 생성하는 과정에서 "Cannot create an instance of class ~viewmodel" 에러가 발생. YouTube 보고 따라하다가 발생한건데... 에러에서 보면 "~ has no zero argument constructor" 라고 표시되어 있음. 즉, 파라미터가 없는 생성자가 viewmodel 에 없기 때문에 인스턴스가 생성될 수 없다는 것을 알 수 있음. 그러나, 내가 생성하고자 하는 ViewModel 인스턴스는 Application 이라는 파라미터를 받아야 하므로.... ViewModelFactory를 따로 생성해줘서 해결하였다.
MVP 패턴 Model : 비즈니스 로직 처리, ( 네트워크, 내장 데이터 등등 ... ) View : User와 상호작용하는 화면 Presenter : View 와 Model의 중간 매개체 * MVC 패턴을 안드로이드에 적용하기 어려운 이유 : Controller가 요청을 받고 처리한 결과를 View에 전달하여 View를 User에게 표출해줌. 그러나, 안드로이드는 Controller와 View의 역할이 화면에서 전부 일어나므로, 이를 나누기 어려움. 따라서, MVP 패턴이나 MVVM 패턴을 적용하여 각 layer에 맞게 집중하고, 결합력을 낮추려고 하는 추세임. MVP 패턴은 ... 각 layer가 interface를 가지고 있으며, interface를 통해 상호작용함. 한 화면에 대한 처리에 따라 ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/oy9n0/btqDrkUordO/Ql4skSvy1wQkvgKTcjsRik/img.png)
배경 : 개발 시 사용했던 log를 release 버전에서는 로그가 찍히지 않도록 변경하였다. 변경 후, 이 부분을 테스트하기 위해 개발과정에서 release 버전으로 앱을 실행시켜야 했다. 방법 : release 버전에 사용할 keystore 를 생성 생성한 keystore 파일을 android studio의 app 폴더에 지정 app 폴더의 builde.gradle 에서 앱이 release 버전으로 실행 해당 keystore를 이용해 앱을 실행시키도록 함 ( 참고로, build.gradle 파일에 직접 keystore 의 민감한 정보를 포함하기 때문에 property 파일에 따로 작성하고 이를 불러서 사용하도록 하는 방법이 있음... 참고 url : https://developer.android.co..
안드로이드 앱 개발 중에 홈버튼에 대한 이슈가 발생함. 꺼진화면, 잠금화면에 대해 lifecycle이 2번 도는데 (API 26이하까지), 그렇다면 꺼진화면 & 잠금화면일 경우, 총 onStop이 3번 돌아야 된다고 생각한다. ( 이미 꺼진 화면 stop 한번 , 잠겼으니 stop 한번, 최종적으로 activity 꺼질 경우(activity에 대해서 꺼지는 행동만 할 수 있다는 가정하에..) stop 한번 ) ..... 그러나, 실제 run으로 확인하면 stop이 2번만 될 때도 있고, 3 번이 될 수 도 있다(심한욕...)....,,,, 그래서 아예 activity가 꺼지는 상황이 발생했을 경우에만 onDestroy 되게 끔, 수정해야 한다. 1. swipe 를 사용했을 때, 2. 홈버튼 눌렀을 때....
안드로이드 앱을 개발하면서 MediaPlayer를 사용하는데, API 29 테스트 도중에 다른 음악 앱에서 음악 재생 시, 내 앱 음악과 동시 재생되는 문제를 발견하였다. 찾아보니, AudioFocus를 얻어야 한다고 되어 있었음... (한참 해맸다.... ...... 힘...드...ㄹ...) 이미 다른 앱에서 오디오에 대한 포커스를 가지고 있으면, 내 앱이 오디오 포커스를 가지기 위한 처리를 해줘야 한다. 특히 API 26이상와 이전으로 포커스를 갖는 방법이 다르다. (이상한건 API24, 26에서도 딱히 오디오 포커스를 생각하지 않아도 알아서 잘 멈추고 실행되었음....) 사용 방법 아래 참고 *스택오버플로우 https://stackoverflow.com/questions/15390126/how-to..