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. 파일 첨부 하기

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



Android Jetpack viewpager2

  Android Jetpack ViewPager2 기본 개념 및 샘플 코드 오늘은 안드로이드 개발에 있어서 굉장히 유용한 컴포넌트 중 하나인 ViewPager2에 대해 이야기해볼까 합니다. ViewPager2는 사용자 인터페이스에서 여러 화면을 좌우...