2017년 4월 27일 목요일

Android N - AlarmManager 사용시 PendingIntent 에 Parcelable 로 전달시 수신부에서 null 이 되는 현상

AlarmManager 사용시 PendingIntent 에 Parcelable 로 전달시 수신부에서 null 이 되는 현상

Android N 이후부터 발생(정확히 7.0 인지 7.1 인지는 모르겠다)

// send
intent.putExtra(EXTRA_DATA, xxx);
// xxx  Parcelable 구현 객체
 
// receive
final XXX xxx = bundle.getParcelable(EXTRA_DATA);
// 여기서 null 발생.

관련하여 검색을 해보면 아래 issue tracker 에도 등록이 되어 있다.

google 에서는 “Won't Fix (Intended behavior)” 로 처리.

app 에서 수정 필요.

// send
Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_DATA, xxx);
intent.putExtra(EXTRA_DATA, bundle);
 
// receive
Bundle bundle = intent.getBundleExtra(EXTRA_DATA);if (bundle != null) {
    final XXX xxx = bundle.getParcelable(EXTA_DATA);
}


참고로, 문자열이나 정수형 등은 정상적으로 전달이 된다.
only Parcelable 객체만 해당되는 것 같다.

2017년 4월 26일 수요일

Android Studio Plugin

plugin 설치는 File -> Settings -> Plugins

1. BitBucket

Android Studio + BitBucket +Git 이용한 소스 관리 참고

2. Android API Level

간단히 api level 보여주는 plugin
Browser repositories -> "api level" 로 검색하여 설치

3. IdeaVim

vim emulating plugin
Browser repositories -> "ideavim" 으로 검색하여 설치


2017년 4월 21일 금요일

Android 개발 관련

Android 개발 관련 정리 및 Tip 모음.

1. signing key 확인

signing key 파일과 apk 가 같은 key 인지 확인할때 아래 명령어 사용

1.1 signing key fingerprint 확인
keytool -list -keystore xxx.jks

1.2 apk fingerprint 확인
keytool -list -printcert -jarfile xxx.apk

위 2가지의 fingerprint 같으면 동일한 key 로 서명이 된것임.

2. Log

Log 출력시, line, method name 포함하여 보여준다.
아래와 같은 식으로, level 별로 각각 만들면 됨.
LOGV_TAG 는 기존 로그와의 호환을 위해 사용.

Log.java

public class Log {
    public final static String TAG = "InputCommonTagName";

    public static final boolean LOGV = true;
    static final boolean LOGV_TAG = true;


    static int mLine=0;
    static String mName="";
    static String mPkg="";
    
    public static void v(String logMe) {
        if(LOGV) {
            StackTraceElement[] stack = (new Throwable()).getStackTrace();
            mLine = stack[1].getLineNumber();
            mName = stack[1].getMethodName();
            mPkg = stack[1].getFileName();
            android.util.Log.v(TAG, ""+mPkg+", "+mLine+" line, "+mName+"(), "+logMe);
        }
    }

    public static void v(String tag, String logMe) {
        if(LOGV_TAG) android.util.Log.v(tag, logMe);
    }
}


3. Live Templates 연동 (Android Studio)

File -> Settings -> Editor -> Live Templates -> AndroidLog

Add -> 적당한 이름 추가.






3-1. method 에 parameter 같이 출력하기.

3-1-1. android.util.Log 사용시

Template text :

Log.d("TAG_NAME", "$CLASS_NAME$ : $METHOD_NAME$()" : $content$);

$content$ 에 대한 Edit variables 작성 (그림 참고)

groovyScript("def params = _3.collect {it + ' = [\" + ' + it + ' + \"]'}.join(', '); return '\"' + _1 + ' : ' + _2 + '()' + (params.empty ? '' : ' : ' + params) + '\"'", className(), methodName(), methodParameters())


3-1-2. 2번의 Log 사용시

Log.d($content$);

groovyScript("def params = _1.collect {it + '=\"+'+it}.join('+ \"'); return '\"' + (params.empty ? '' : params)", methodParameters())

or

groovyScript("def params = _1.collect {it + ' = [\" + ' + it + ' + \"]'}.join(', '); return '\"' + (params.empty ? '' : params) + '\"'", methodParameters())


3-2. return value 같이 출력하기

3-2-1. android.util.Log 사용시

Template text :

Log.d("TAG_NAME", "$CLASS_NAME$ : $METHOD_NAME$() returned: " + $result$);

$content$ 에 대한 Edit variables 작성 (그림 참고)

variableOfType(methodReturnType())


3-2-2. 2번의 Log 사용시

Log.d("returned : $result$=" +  $result$);

$result$ 에 대한 Edit variables 작성
variableOfType(methodReturnType())


2017년 4월 13일 목요일

Blogger 관련 Tip

1. 소스 코드 넣기

1-1. highlightjs 를 사용한다. (아래 링크 참고)

https://highlightjs.org/download/



1-2. cdnjs 사용
테마 -> HTML 편집 -> <head> 마지막에 붙여넣는다.
css style 은 취향게 맞게 변경 가능.

<link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/styles/default.min.css" rel="stylesheet"></link>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

1-3. 소스 코드를 html 모드로 편집
class 설정은 생략 가능. 알아서 처리됨. (ex: <code class="language-java">)

<pre><code>
// to do
</code></pre>

1-4. html 태그의 경우는 escape 시켜줘야한다.
관련 web site 는 많으니 검색해서 사용하면 된다.(html escape)

http://www.igorware.com/tools/xml-escape
http://www.blogcrowds.com/resources/parse_html.php


ps 1. 테마 변경시마다 1-2번 작업을 다시 해주어야 한다.
ps 2. 테마중 "동적 뷰" 의 경우는 동작하지 않으니 다른 방식으로 적용해야 한다.(구글링...)


2. 메뉴 넣기(상단 or 사이드)

2-1. 레이아웃 -> 전체열(가젯추가) -> 페이지 선택
2-2. 외부 링크 추가 -> 입력
  웹주소 형식은 "http://블로그주소/search/label/라벨이름(태그이름)?max-results=숫자"
  숫자는 해당 탭 선택시 보여질 페이지수. 1 권장.
  예로, 페이지 제목 : "Android",
  웹주소 : "http://seesky89.blogspot.kr/search/label/Android?max-results=1" 설정하면,
  상단에 Android 탭이 생겨 사이드바의 태그와 동일한 기능을 한다.

3. 파일 첨부 하기

구글 드라이브 이용하여 링크 걸어야 한다.



구내염

  구내염은 입안에 생기는 염증으로, 여러 가지 원인으로 인해 발생해요. 입안에 불편함을 초래하고, 음식을 먹을 때나 말을 할 때 매우 아프게 느껴질 수 있죠. 오늘은 구내염에 대해 자세히 알아보고, 이 문제를 어떻게 해결할 수 있는지 알아보려 해요....