전체 글 324

안드로이드 노티피케이션 여러줄 생성

안드로이드 4.1 젤리빈 이후 부터는 노티피케이션이 할 수 있는 일이 정말 많아졌으며, 사용하기 쉽게 변했다. 여러줄을 생성 할 수도 있는데, 아래와 같이 하면 된다. bigText()에 긴 텍스트를 넣어주면 된다. mBuilder = new Notification.Builder(mContext); mBuilder.setSmallIcon(R.mipmap.ic_launcher); mBuilder.setAutoCancel(false); mBuilder.setContentTitle(title); mBuilder.setStyle(new Notification.BigTextStyle().bigText(big)); mBuilder.setContentIntent(PIntent); mBuilder.setDefaults..

안드로이드 노티피케이션 지우지 않기(고정), Led 출력하기

노티 영역에서 지우기를 해도 남아있게 하기mNotification.flags = Notification.FLAG_NO_CLEAR; 노티가 왔을 때 LED로 알려주기mNotification.defaults = Notification.DEFAULT_LIGHTS;Led 대신DEFAULT_SOUND, DEFAULT_VIBRATE 을 설정 할 수도 있다. 사용자 설정 LED 값mNotification.ledARGB = Color.GREEN; mNotification.ledOnMS = 4000; mNotification.ledOffMS = 1000;mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;

[안드로이드 스튜디오] avd 에 사용할 sdcard 만들기

안드로이드 api 버전별로 avd를 만들어서 data를 테스트 할 때,sdcard를 하나 만들어서 데이터(이미지 등)를 넣어 두면, avd 마다 data를 올릴 필요 없이 sdcard에 있는 데이터를 쓸 수 있다. 1. 윈도우 개발환경이라면 도스 커맨드 창에서 다음과 같이 명령어를 치면 1G 의 sdcard.iso 파일이 생긴다. Android\sdk\tools\mksdcard 1024M sdcard.iso (윈도우 환경변수에 PATH=F:\Android\sdk\tools; 추가해 두면 커맨드 창에서 파일경로 상관없이 명령어 쓸 수 있다.) 2. AVD 만들 때 Show Advanced Settings를 눌러서 SD card-External file 을 눌러 위에서 만든 sdcard를 불러오면 된다.

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

예전엔 매니페스트에서 디버그 모드 설정을 해주었는데, 안드로이드 스튜디오로 넘어 오면서 부터는 그래들에 설정을 해주면 된다. 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) { /..