분류 전체보기 321

[안드로이드 스튜디오] 디버그툴 사용하기

예전엔 매니페스트에서 디버그 모드 설정을 해주었는데, 안드로이드 스튜디오로 넘어 오면서 부터는 그래들에 설정을 해주면 된다. Waiting for device.Cannot debug application com.comostudio.xxxxx on device pantech-xxxxxx.This application does not have the debuggable attribute enabled in its manifest.If you have manually set it in the manifest, then remove it and let the IDE automatically assign it.If you are using Gradle, make sure that your current varia..

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

앱이 눈에 보일 때만 알람매니저를 가지고 놀 생각이라면, 그냥 알람매니저 만들고 인텐트 만들어서 펜딩 시킨 뒤, 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..