본문 바로가기

분류 전체보기

[Android] Bitmap OutOfMemory - OOM 메모리 부족. 안드로이드에서 OutOfMemoryError라 발생하는 가장 많은 경우는 비트맵 로딩때문이다. 안드로이드는 어플리케이션 프로세스별 메모리가 제한되어 있다.(16M, 24M, 32M 등)문제는 위의 메모리 에러가 DDMS에서 가장 쉽게 확인할 수 있는 메모리 값인 VM Heap 사이즈와는 크게 상관없이 발생한다는 것이다. Bitmap을 로딩할 경우 VM 내의 힙메모리를 사용하는 게 아니라 VM 밖의 Native 힙메모리 영역을 사용한다고 한다. 그리고 BitmapFactory의 decode함수들은 메모리 Leak이 존재한다고 알려져 있다.해결 방안 ::1. 가용 메모리의 확인 – 아래 API들을 활용해서 Native Heap 값을 확인할 수 있다. Debug.getNativeHeapSize(.. 더보기
[FragmentTabHost] Fragment + Tab Host를 이용해 탭메뉴 만들어 보기 tab menu를 만드는 방법은 여러가지가 있지만, 각자 특색이 있다.tab host를 쓰는 방법과 tablayout을 쓰는 방법이 있는데, tabhost는 각각의 탭 backgroundColor를 바꿀 수 있는 반면 스크롤이 되지 않고 [ 구현을 더 해야한다]. 반면에 tablayout을 하게되면 스크롤을 자연스럽게 구현해 주는 반면 tab 각각의 색을 변경할 수가 없다. 이 포스팅에선 Fragment + tab host를 이용해 탭메뉴를 구현해 보기로 한다. 일단 이와 같이 xml을 구현한다. public class MainActivity extends FragmentActivity { FragmentTabHost host; @Override protected void onCreate(Bundle s.. 더보기
[Android] Permission 체크 하나의 메소드로 해결해보기 안드로이드 마시멜로우 이후 구글의 퍼미션 정책이 바뀌어 중요 퍼미션을 사용해야 하는 기능마다 그 기능을 사용할 때 퍼미션 권한 획득에 대해 물어보게 되었다. 소스코드가 어려운 것은 아니냐 내용이 적지 않으므로 매 퍼미션 사용시 그 코드를 사용하면 코드의 가독성이 떨어질 뿐더러 중복성이 증가하게 된다. 그렇기 때문에 메소드 하나를 생성해 더욱 편리하게 퍼미션 관리를 하는 방법이 없을까 고민해 보았다. 물론 퍼미션 라이브러리가 존재하나 개인적으로 라이브러리를 상속해 쓰다보면 그 라이브러리와 내가 써야하는 코드의 방법이 중복되어 난관에 부딪힐 확률이 높다고 생각하고, 그에 따라 메소드를 불러오는 형식을 선호하여 이러한 방식을 사용하는 것을 보시는 분은 이해해 주셨으면 한다. 일단 퍼미션 관련 메소드의 기본 형.. 더보기
XML 특수문자 처리방법 xml 특수문자 처리 방법 1. 공백문자.수평 탭 : 09 line-feed : 0A carrage-return: 0D ASCII space : 902. Escape 문자& : & : > ' : ' " : " ============================특수문자 (Special Characters)3. XML 예약문자 , &는 XML tag 표시와 entity를 표시하는 XML 예약문자로, XML 문서에 그대로 사용할 수 없기 때문에 다음과 같이 사용합니다. s-than sign) (greater-than sign) > & (ampersand) & XML 예약문자 / 특수문자 (Special Characters) XML 에서 엔터나 & 와 같은 특수문자를 사용할 때는 .. 더보기
Service 사용 1. Service Service는 안드로이드 4대 컴포넌트 [Activity, Broadcast receiver, Content provider, Service] 중 하나이다.코드가 동작하는 것은 같지만 사용자가 무언가 조작을 하기 위해서 필요한 것이 아니라, 앱을 종료하더라도 지속해서 돌아가야 하는 [ex. 음악앱, 메신저앱] 등을 만들 때 주로 쓰인다. 안드로이드에서는 Service가 실행되고 있는 상태라면 메모리 부족같은 특수한 경우가 아니라면 service가 돌아가고 있는 process를 없애지 않고 지속적으로 관리한다. 그렇기 때문에 지속적으로 background에서 돌아가야 하는 앱에 적합하다. 2. Type Service에는 두가지 타입이 있다. Start service와 Bind serv.. 더보기
Custom ListView ListView는 안드로이드 앱에서 빠져서는 안되는 기본 중에 기본이라 할만한 컴포넌트다. 아무리 기초적인 앱이라도 ListView 하나쯤은 들어가 있기 마련이다.그러한 ListView를 내가 원하는 방식으로 Customizing 하여 만든 것을 Custom ListView 라고 한다. 안드로이드는 Activity 와 View로 화면 구성이 되어 있다. 혹시나 모르고 있을 사람들을 위해 간략히 설명하자면. Activity 가 View가 존재할 수 있는 영역을 제공한다고 할 수 있고, View는 다른 언어에서 Conponent 라는 이름을 흔히 불리는 체크박스, 버튼, 에디트, 라디오 버튼, 이미지 박스 등등을 가리키는 안드로이드의 용어이다. ListView는 그러한 View들이 모이는 viewGroup .. 더보기
Android permission request 안드로이드 6.0(마시멜로우) 부터는 기존과 다르게 어플에서 사용자에게 필요한 권한을 획득해야 할 때마다 사용자에게 권한을 사용하겠다는 허락을 받아야 한다. 처음 어플을 설치할 때 한번에 나열되었던 때에 비해서 개발자 입장에서 매우 귀찮아 진 것은 사실이지만 무분별한 어플의 권한 획득으로 인한 피해를 막겠다는 의도는 좋아 보인다.아무튼 퍼미션 권한을 획득하지 못하면 해당 기능을 사용할 수 없으니 퍼미션 권한 획득 방법에 대해 알아보자. 현재 이 정책은 마시멜로우 이후 부터 적용되는 것이기 때문에 그 이전에 나온 버전들에 대해서는 권한을 일일히 얻어야 할 필요는 없다. 그렇기 때문에 SDK버전이 마시멜로우 이하. 그러니까 targetSDKversion을 23미만으로 설정하면 기존과 같이 manifest에 .. 더보기
Fragment 6. 실 사용예 예이 문서에서 논의한 모든 것을 한 번에 모아 보기 위해, 다음은 두 개의 프래그먼트를 사용하여 창이 두 개인 레이아웃을 생성하는 액티비티를 예시로 나타낸 것입니다. 아래의 액티비티에 포함된 한 프래그먼트는 셰익스피어 희곡 제목 목록을 표시하고, 또 다른 하나는 목록에서 선택했을 때 해당 희곡의 요약을 표시합니다. 또한 화면 구성을 근거로 프래그먼트를 여러 가지로 구성하여 제공하는 방법도 보여줍니다.참고: 이 액티비티에 대한 완전한 소스 코드는 FragmentLayout.java에 있습니다.주요 액티비티는 onCreate() 중에 일반적인 방식으로 레이아웃을 적용합니다.@Override protected void onCreate(Bundle savedInstanceState) { super.onCreat.. 더보기
Fragment - 5. Fragment 수명 주기 처리+ 프래그먼트 수명 주기 처리그림 3. 액티비티 수명 주기가 프래그먼트 수명 주기에 미치는 영향.프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷합니다. 액티비티와 마찬가지로 프래그먼트는 세 가지 상태로 존재할 수 있습니다.재개됨(Resumed)프래그먼트가 실행 중인 액티비티에 표시됩니다.일시정지됨(Paused)또 다른 액티비티가 포그라운드에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시됩니다(포그라운드의 액티비티가 부분적으로 투명하거나 전체 화면을 뒤덮지 않습니다).정지됨(Stopped)프래그먼트가 표시되지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트도 여전히 표시.. 더보기
Fragment - 4. 액티비티와의 통신 액티비티와의 통신Fragment는 Activity로부터 독립적인 객체로 구현되었고 여러 개의 액티비티 안에서 사용할 수 있는 것이 사실이지만, 프래그먼트의 주어진 인스턴스는 그것을 포함하고 있는 액티비티에 직접적으로 연결되어 있습니다.구체적으로 말하면, 이 프래그먼트는 getActivity()를 사용하여 Activity 인스턴스에 액세스하여 액티비티 레이아웃에서 뷰를 찾는 것과 같은 작업을 손쉽게 수행할 수 있습니다.View listView = getActivity().findViewById(R.id.list);이와 마찬가지로, 액티비티도 프래그먼트 안의 메서드를 호출할 수 있습니다. 그러려면 FragmentManager로부터의 Fragment에 대한 참조를 가져와야 하며, 이때 findFragmentB.. 더보기

반응형