10. IntentService를 활용하자 액티비티와 프래그먼트 수명주기에 의존하지 않고 백그라운드에서 처리하고 싶은 경우 일반적으로 IntentService가 최적의 선택이 됩니다. 여기서는 백그라운드로 벤치마크에서도 자주 이용되는 피보나치 수열을 계산하고, 그 결과를 LocalBroadcastReceiver를 통해 액티비티에 전달해 봅니다. 이용방법 IntentService 를 이용하는 클래스를 만든다 AndroidManifast.xml에 등록하면 됩니다. 안드로이드 스튜디오에 생성용 메뉴가 있으니깐 그걸 이용하도록 합시다. 그러면 AndroidManifast.xml 에 자동으로 등록 해줍니다. IntentService.onHandleIntent 는 워커 스레드로 실행되므로 이 안에서 계산을 처리하면..
tip6. 디버그 모드 구분하기 안드로이드에는 디버그 모드가 있다. 어플리케이션이 디버그가 가능한 상태인지 표시하는 플래그로 기본 값은 false이다. 보통 알려진 설정 방법은 AndroidManifest.xml 의 부분에 android:debuggable 값을 true/false로 설정하는 것이다.Default1234그런데 이 플래그는 구글 플레이 스토어에 apk를 올릴 때 필터링 대상이라 AndroidManifest.xml 안에 저 값을 그대로 두면 apk를 업로드할 수 없다. 또한 IDE에서는, 사용자가 임의로 설정하지 말고 디버그용으로 apk를 만들 때와 릴리즈용으로 apk를 만들 때 자동으로 설정이 되도록 놔두라고 가이드 한다. IDE에서 에뮬레이터나 단말로 Run/Debug를 실행하면 andr..
9. 상주 서비스를 만들자 상주하는 서비스이 예로 간이 음악 플레이어를 만들겠습니다. 구현을 간단히 하고자 앱 내에 저장하기로 하고 음악 재생은 MediaPlayer 클래스로 합니다. 여기서는 음악의 재생과 정지라는 두 가지 기능만 구현 해봅시다. 음악 재생과 정지 MediaPlayer 인스턴스를 만들고 start()를 호출하면 음악이 재생됩니다. MediaPlayer.create()의 두번째 인수로 전달하는 R.raw.bensound_clearday 음악 파일 입니다. 음악 재생 MediaPlayer 클래스를 이용하기 위해 선언 한다. private MediaPlayer mPlayer; /** * 음악을 재생한다 */ public void play() { Log.d(TAG, "play"); mPlaye..
8. Service 종류와 수명주기를 이해하자 액티비티와 프래그먼트는 화면에 표시되는 동안은 생존하지만 표시되지 않게 되면면 onStop이나 onDestory가 호출되어 폐기될 가능성이 있습니다 다른 앱의 액티비티가 최상위에 오는 경우에도 백그라운드에서 처리를 계속하고 싶을 때는 어떻게 하면 좋을까요? 백그라운드 처리를 위해 준비된 컴포넌트가 Service 입니다. Service는 UI 없이 백그라운드로 처리를 수행하는 컴포넌트 입니다. Service의 종류와 수명주기를 이해 하자 Service는 크게 세 종류로 나눌 수 있습니니다. 첫번째는 Context.startService() 를 호출해 시작되는 서비스 입니다.두번째는 Context.bindService() 를 호출해서 Service에 바인드하는 ..
LocalBroadcastReceiver 를 이해하자 브로드캐스트는 다른 앱에 송신하는 것이 가능하지만 경우에 따라서는 다른 앱에 알릴 필요 없이 앱 내에서 완결시키고 싶을 때도 있습니다. 그럴 때는 로컬 브로드캐스트로 다른 앱에 알리지 않고 끝낼 수 있습니다. 로컬 브로드캐스트를 수신하려면 LocalBroadcastReceiver 를 이용합니다. 로컬 브로드캐스트는 다음에 설명할 Service와 조합해 이용하는 경우가 많습니다. Service 쪽에서 처리를 하고, 처리가 끝나면 액티비티나 프래그먼트에 로컬 브로드캐스트에 처리 완료를 알리는 식으로 사용합니다. 브로드캐스트를 수신해 처리할 때 주의할 점안드로이드는 전력 소비를 줄이고자 사용자가 화면을 끄면 슬립 상태로 들어갑니다. 브로드캐스트를 수신해서 ..
BroadcastReceiver로 브로드캐스트 이벤트를 수신하자 어떤 이벤트가 발생한 사실을 앱에 알리고 싶을 때 BroadcastReceiver에 통지 합니다. 시스템의 이벤트를 앱에 알리거나, 앱간에 연계를 위해 이벤트를 알리고 싶을 때, 또는 소켓통신을 이용한 프로그램을 만들 때 이용합니다. 기본을 이해하자 BroadcastReceiver는 Intent를 받았을 때의 처리를 onReceive에서 구현합니다. 어느 브로드캐스트 Intent를 받을지는 IntentFilter\fh wjddml gkqslek. public abstract void OnReceive(Content content, Intent, intent); 두 번째 인수로 전달되는 Intent 는 Context.sendBroadcast(..
UI를 갖지 않는 프래그먼트를 이용하자 이런 프래그먼트를 헤드리스 프래그먼트라고 합니다. 기본 액티비티를 클래스로서 BaseActivity를 만들고 거기에 액티비티의 공통된 처리를 구현하는 경우가 있습니다.그러한 공통 처리에서 UI이와 연결되지 않는 부분을 헤드리스 프래그먼트로서 구현할 수 있습니다. 여기에서는 네트워크 연결 확인 및 네트워크 연결 변경 감지를 프래그먼트로 구현 해보겠습니다 public class MainActivity extends AppCompatActivity { private NetworkCheckFragment mFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedI..
4. 중첩 프래그먼트를 이용하자 프래그먼트안에 프래그먼트를 넣는 중첩 프래그먼트에 대해 알아보자 중첩 프래그먼는 처음에는 지원되지 않았지만 지원 라이브러리쪽에서 대응해 현재는 1.6 이상에서 이용 할 수 있게 되었습니다. 단, 중첩 프래그먼트를 이용하면 코드가 복잡해지고 구현 난이도가 높아 집니다. 가능하면 커스텀 뷰로 대체 등을 검토 해보세요 activity_main.xml MainActivity.java public class MainActivity extends AppCompatActivity { private static final String TAG_PARENT = "TAG_PARENT"; @Override protected void onCreate(Bundle savedInstanceState..
3. 프래그먼트를 동적으로 추가 및 삭제하기 앞에서는 프래그먼트를 레이아웃 XML 파일안에 직접 기술했지만 이번에는 동적으로 프래그먼트를 추가하고 삭제 해봅니다. 추가,삭제 버튼을 누르면 각각 프래그먼트가 추가되거나 삭제되고 순서를 알 수 있도록 x 번째 프래그먼트 라는 문자열을 표시 합니다. activity_main.xml MainActivity.javapublic class MainActivity extends AppCompatActivity { private static final String FRAGMENT_TAG = "FRAGMENT_TAG"; private static final String KEY_NUMBER = "KEY_NUMBER"; private int mNumber = 0; priva..
2. 프래그먼트를 이해하자 액티비티는 한 화면당 1개씩 있는 형태였지만 프래그먼트는 액티비티 1개당 여러 개존재할 수 있습니다. 그러므로 액티비티 1개로 구현했던 것을 기능 단위로 프래그먼트로 나누어 구현할 수 있습니다. 덧붙여, 프래그먼트는 안드로이드의 프레임워크에서 구현된 것과 지원 라이브러리에서 구현된 것으로 2가지가 있습니다. 안드로이드 2.3 이상을 지원하는 경우 지원 라이브러리를 이용할 수밖에 없지만 안드로이드 4.1 이상을 지원하는 경우라도 지원 라이브러리를 이용하는 편이 좋습니다. 그럼 이번에는 단순한 프래그먼트를 가진 앱을 만들어 보겠습니다. 누르면 클릭 이벤트를 액티비티에 통보하고 액티비티에서 Toast를 표시하는 앱입니다. 여기서는 프래그먼트를 다음 3단계로 생각하면 될것 같습니다. ..