[안드로이드 공부] 207

글로벌 알람매니저 등록과 취소 하는 법

앱이 눈에 보일 때만 알람매니저를 가지고 놀 생각이라면, 그냥 알람매니저 만들고 인텐트 만들어서 펜딩 시킨 뒤, cancel만 해주면 끝난다. 하지만, 알람 매니저를 글로벌로 사용할 경우 즉, 앱이 떠있거나, 덮여있거나, 자고 있거나 항상 동작하여야 할 경우에는 약간의 컨트롤을 해주어야 한다. public static AlarmManager mAlarmMgr = null; public static PendingIntent mAlarmIntent = null; public void setAlarmManager(){ mAlarmMgr = (AlarmManager) mContext.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent ..

안드로이드 시간대 설정 변경 이벤트

사용자가 직접 시간대를 변경하거나, 비행기를 타고 가다가 새로운 타임존을 만났을 때 안드로이드는 2가지 이벤트를 발생시킨다. 만약, 시간에 민감한 어플리케이션을 운영한다면 이러한 돌발? 변수에 대한 고려를 하지 않았다면.... 뒤통수가 엄청 가려워질 것이다. 사용자가 시간을 변경 했을 때ACTION_TIME_CHANGED 타임존을 변경 했을 때ACTION_TIMEZONE_CHANGED 위 브로드캐스트 메시지를 Manifest 에 등록하고 Receiver에서 아래와 같이 캐치해주면 최소한 가려운 머리에 샴푸는 바른 것이다. if(Intent.ACTION_TIME_CHANGED.equals(intent.getAction()) ){ cancelAlarmManger(); setTime(); } if(Intent..

[안드로이드스튜디오] 구글 플레이서비스 에러 (애드몹 등)

얼마전 안드로이드 스튜디오 1.3.2 업그레이드가 있었다. 이후 예전 처럼 애드몹을 넣으려고 했으나 처음 보는 에러와 마주해버렸다. 난감하다. 똑같은 소스인데 에러가 나니.... ignoring unknown package filter 'extra-google-m2repository'Warning 아무리 태양계의 고수들에게 검색 질의를 해봐도... 'SDK 버전이 문제다...' 이런 내용 밖에 찾아 볼 수 없었다. 그러나, 답은 태양계 너머? 명왕성에 있었다. dependencies { compile 'com.google.android:gms:play-services:6.+' } 예전 버전에서는 전혀 문제가 없었지만, 이번 버전의 안드로이드 스튜디오에서는 맨 위의 에러가 발생했다. dependencies..

FAILED BINDER TRANSACTION, TransactionTooLargeException

Preference를 overide 한 경우 OncreateView를 사용하여 새롭게 만들어 준다. 하지만, 이미지가 PreferenceScreen 자리에 들어가게 된다면 고려해야 할 것이 있다. UI에서 매번 다른 동작이 발생 할 때마다(다이얼로그 열리고 닫히는 등) 이 OnCreateView가 불려지면서 안드로이드 내부를 들쑤시고 다닐 수 있다. @Override protected View onCreateView( ViewGroup parent ) { super.onCreateView(parent); mLayoutInFlater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(mView == nu..

스레드, 타이머, 핸들러 그리고 루퍼

일정, 특정 시간 후에 어떤 작업을 해야 할 경우 아래와 같이 타이머를 쓸 수 있다. 하지만 이렇게 사용할 경우 TimerTask is scheduled already 에러를 만나 앱을 죽일 수 있다. public void stopTimer() { mTask = new TimerTask() { @Override public void run() { mTimer = new Timer(); ....... }; mTimer = new Timer(); if(mTimer != null) { mTimer.schedule(mTask, 10000); ....} 이 경우에는 아래와 같은 방법으로 에러를 피할 수 있다. public StropTimerTask stopTimerTask; public void reSchedul..

스레드(Thread) 대신 AsyncTask(비동기 태스크)를 쓰자!

UI 가 있는 곳에서 스레드 작업을 조금 길게 하면 화면에 버벅거리면서 아예 멈추는 경우도 발생한다. 하지만 스레드 대신 AsyncTask를 사용하면 이런 현상을 말끔히 해결해준다. class MainForReadyInitAsyncTask extends AsyncTask { @Override protected void onPostExecute(Void result) { // 작업이 완료 된 후 할일 super.onPostExecute(result); } @Override protected void onPreExecute() { // 작업을 시작하기 전 할일 super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { /..

Service에서 SharedPreference 사용하기(context와 getApplicationContext차이)

기본적으로 SharedPreferences pref = getContext().getSharedPreferences(key, Context.MODE_PRIVATE); 위와 같은 코드를 사용하면 SharedPreference를 사용하여 앱에서 필요한 부분을 저장하고 불러올 수 있다. 하지만, Service(onReceive 등)와 같은 곳에서는 아래와 같이 getApplicationContext를 사용하여야 sharedPreference를 불러올 수 있다. 만약 위처럼 getContext()를 사용하게 되면 아무것도 얻을 수 없다. mContext.getApplicationContext().getSharedPreferences(key, Context.MODE_PRIVATE); getContext, cont..

서비스가 죽어도 자동으로 다시 실행하기

앱에 서비스를 등록해서 사용하고 있는데, 이러저러한 이유로 갑자기 앱이 죽어버리거나 서비스가 종료되면 정말 난감하다. 이럴 때는 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, this.START_STICKY, startId); } 위와 같이 onStartCommand를 사용하여 startService를 하도록 하며, START_STICKY 플래그를 쓰게 하면 죽어도 다시 살아나는 좀비 같은 존재가 된다.