'2014/03'에 해당되는 글 7건

  1. 2014.03.12 인텐트 필터 (1)
  2. 2014.03.12 안드로이드 리소으와 에셋
  3. 2014.03.12 logback 로그 프레임워크
  4. 2014.03.12 Spring fro Android
  5. 2014.03.12 Fragment와 Activity통신
  6. 2014.03.12 이미지 캐싱
  7. 2014.03.12 큰 이미지 로딩
posted by 동건이 2014. 3. 12. 14:51

인텐트 필터

안드로이드 인텐트 필터


인텐트 필터

- intent-filter 는 적어도 하나의 action 을 포함하여야 한다.

샘플 AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.notepad">

<application android:icon="@drawable/app_notes" android:label="@string/app_name">

<provider android:name="NotePadProvider" android:authorities="com.google.provider.NotePad"/>

<activity android:name="NotesList" android:label="@string/title_notes_list">

<intent-filter>

<action android:name="android.intent.action.MAIN"/> // 이 어플리케이션에 대한 메인 시작 점을 선언한다.

<category android:name="android.intent.category.LAUNCHER"/> // 이 시작점이 어플리케이션 런처안에 나열되어야 한다는 것을 말한다.

</intent-filter>

<intent-filter>          // 이 필터를 통해 액티비티가 할 수 잇는 것들을 선언한다.

<action android:name="android.intent.action.VIEW"/> // 디렉토리 조회

<action android:name="android.intent.action.EDIT"/> // 디렉토리 수정

<action android:name="android.intent.action.PICK"/> // 디렉토리 내의 특정 노트를 가져올 수 있음

<category android:name="android.intent.category.DEFAULT/>

<data android:mimeType="vnd.android.cursor.dir/vnd.google.note"/> // 위의 액션들이 디렉토리를 대상으로 실행되는것을 지정

</intent-filter>

<intent-filter>

<action android:name="android.intent.action.GET_CONTENT"/> // 사용자에 의해 선택된 노트를 반환

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="vnd.android.cursor.item/vnd.google.note"/>  // 위의 액션들이 하나의 노트를 대상으로 실행되는것을 지정

</intent-filter>

</activity>

<activity android:name="NoteEditor"

android:theme="@android:style/Theme.Light"

android:label="@string/title_note" >

<intent-filter android:label="@string/resolve_edit">

<action android:name="android.intent.action.VIEW" /> // 노트 조회

<action android:name="android.intent.action.EDIT" /> // 노트 수정

<action android:name="com.android.notepad.action.EDIT_NOTE" />  // EDIT_NOTE 는 EDIT 와 동의어이다.

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />   // 위의 액션들이 하나의 노트를 대상으로 실행되는것을 지정

</intent-filter>

<intent-filter>

<action android:name="android.intent.action.INSERT"/> // 신규 노트 생성

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="vnd.android.cursor.dir/vnd.google.note"/> // 위의 액션들이 디렉토리를 대상으로 실행되는것을 지정

</intent-filter>

</activity>

<activity android:name="TitleEditor"

android:label="@string/title_edit_title"

android:theme="@android:style/Theme.Dialog">

<intent-filter android:label="@string/resolve_title">

<action android:name="com.android.notepad.action.EDIT_TITLE" /> // 노트의 제목을 수정하는 커스텀 액션

<category android:name="android.intent.category.DEFAULT" />

<category android:name="android.intent.category.ALTERNATIVE" />

<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />

<data android:mimeType="vnd.android.cursor.item/vnd.google.note"/>   // 위의 액션들이 하나의 노트를 대상으로 실행되는것을 지정

</intent-filter>

</activity>

</application>

</manifest>


'개발' 카테고리의 다른 글

인텐트 필터  (1) 2014.03.12
안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12

댓글을 달아 주세요

  1. Favicon of https://tood-re.tistory.com BlogIcon 먹튀 검증 2018.07.30 11:52 신고  Addr  Edit/Del  Reply

    잘보고갑니다

posted by 동건이 2014. 3. 12. 14:49

안드로이드 리소으와 에셋

안드로이드 리소스와 에셋


리소스와 에셋

- 리소스와 에셋의 차이는 그리 크지 않다. 읽어 들이는 방법에 차이가 존재한다.

- 리소스는 컴파일된 R 클래스에 의해 쉽게 접근 가능하며 에셋은 AssetManager 를 사용해야 한다.


리소스와 국제화

res/anim/  애니매이션 프레임 또는 트윈드(tweened) 애니매이션 오브젝트

res/drawable/ .png, .9.png, .jpg 

※ 여기에 위치한 이미지는 aapt 도구에 의해 자동으로 최적화 된다. 예를 들어 256 컬러 이상이 요구되지 않는 

트루컬러 PNG는 컬러 팔레트를 가진 8-비트 PNG로 변환된다.

따라서 빌드 하는동안 변경된다. 변경되지 않도록 하기 위해서는 res/raw/ 폴더에 위치시키자

res/layout/ 스크린 레이아웃

res/values/ 기타 값을 정의하는 xml 파일들

array.xml 배열을 정의함, colors.xml 컬러 drawable 과 컬러 문자열 값을 정의함 Resources.getColor()

dimens.xml 크기 값을 정의함 Resources.getDimension()

string.xml 문자열 값을 정의함 Resources.getText()

styles.xml

res/xml/ Resources.getXML() 로 읽어들여질 수 있는 임의의 xml 파일들

res/raw/ Resources.openRawResource()


코드에서 리소스 사용

R.resource_type.resource_name

android.R.resource_type.resource_name



xml 파일에서 리소스 사용

android:textColor=”@color/opaque_red”

android:text=”@string/hello_world” />

android:textColor=”@android:color/opaque_red” // 시스템 리소스를 참조하기 위해서는 @android: 를 붙여준다.



리소스 선택

- 디바이스 상의 언어 설정, 하드웨어 설정 에 따라 사용할 리소스를 제공할 수 있다.

MyApp/

res/

values-en/

strings.xml

values-fr/

string.xml



각각의 설정에 따라 여러 타입의 수식어를 지원한다. 수식어(qualifier)는 -(대시) 로 구분되어진다.

MyApp/

res/

drawable-en-rUS-finger/

drawable-port/

drawable-port-mdpi/

drawable-qwerty/



수식어(Qualifier) 종류

MCC 와 MNC    디바이스의 SIM에 잇는 모바일 국가 코드(MCC : Mobile Coutry Code, MNC : Mobile Network Code)

언어와 지역 en-rUS, fr-fFR, es-rES , 대소문자 구분이 있다. 언어코드는 소문자, 국가코드는 대문자

스크린 크기 small, normal, large, xlarge

더 넓은 / 더 긴 스크린 long, notlong

스크린 오리엔테이션 port(세로, portrait), land(가로), square(정사각형)

스크린 픽셀 밀도 ldpi, mdpi, hdpi, xhdpi, nodpi

터치스크린 타입 notouch, stylus, finger

키보드 제공 여부 keysexposed(사용가능), keyshidden(없음), keyssoft( 소프트 키보드 사용가능)

텍스트 입력방법 nokeys, qwerty, 12key

네비게이션키 제공 여부 navexposed( 사용가능), navhidden( 없음)

터치스크린외 네비게이션 방법 nonav(없음), dpad(방향키), trackball(트랙볼), wheel(휠)

SDK 버젼



수식어는 위 표에 나와 있는 순서대로 -(대시) 를 사용해서 구성된다.

ex) drawable-en-rUS-large-long-port-mdpi-finger-keysexposed-qwerty-dpad



- 리소스 컴파일러는 대소문자를 구분하지 않는다


코드에서 리소스 레퍼런스

MyApp/res/drawable-port-mdpi/myimage.png


R.drawable.myimage (JAVA)

@drawable/myimage (XML)


'개발' 카테고리의 다른 글

인텐트 필터  (1) 2014.03.12
안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12

댓글을 달아 주세요

posted by 동건이 2014. 3. 12. 11:03

logback 로그 프레임워크

안드로이드 로그 프레임웤 logback 


안드로이드 프로그래밍시 Log 관련해서는 자체 제공하고 있는 Log 클래스를 사용하고 있었습니다.

그런데...

로그 레벨 변경하는게 꽤 번잡합니다. properties 에서 설정을 변경하라고 하는데

그동안 자바 프로그래밍을 주로 하던 저에게는 귀차니즘을 동반하더군요...

그래서 찾아봤더니 역시나 저와 같은 고민을 하시던 분께서 아예 log4j 같은 로그 프레임웤을 안드로이드용으로 개발해 놓으셨더라구요


이름하여 logback 

사이트는 아래 URL

http://tony19.github.io/logback-android/


사용방법은 그동안 log4j 를 사용해 오셨으면 간단하게 적응하실 수 있습니다.

우선 간단하게 ADT 에서 제공하는 LogCat 에 출력하길 위해서는 관련 library와 설정파일이 필요합니다.

현시점에서 logback 을 사용하기위해서는 아래 두개의 jar 파일이 필요합니다. 메이븐 사용시는 홈페이지에서 참조 바랍니다.

(사이트에서 다운로드 받은 파일을 잘 살펴보면 아래 두개의 jar 파일이 있습니다.)

slf4j-api-1.7.5.jar

logback-android-1.0.10-2.jar


그리고 설정파일은 프로젝트내 /assets 디렉토리에 logback.xml 파일을 생성하시면 됩니다.



LogCat 에 출력을 하기 위해 아래 설정을 사용합시다. (아래 내용을 logback.xml 에 복사합니다.)

<configuration>

  <!-- Create a logcat appender -->

  <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">

    <encoder>

      <pattern>%msg</pattern>

    </encoder>

  </appender>


  <!-- Write INFO (and higher-level) messages to logcat -->

  <root level="DEBUG">

    <appender-ref ref="logcat" />

  </root>

</configuration>


자바에서 사용하는 방법은 log4j 의 사용방법과 거의 동일합니다.

// Logger 생성

org.slf4j.Logger Log = LoggerFactory.getLogger(Method1Activity.class);


// Logging

if( Log.isDebugEnabled()){

Log.debug( "checkbox " + i + " : ischecked." );

...

}


log4j 를 사용해 봤다면 쉽게 적응하시리라 생각됩니다.


홈페이지에는 다양한 방법이 나와 있으니 고급 사용을 위해서는 홈페이지를 꼭 방문하시기 바랍니다.

'개발' 카테고리의 다른 글

인텐트 필터  (1) 2014.03.12
안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12

댓글을 달아 주세요

posted by 동건이 2014. 3. 12. 11:00

Spring fro Android

Spring For Android, Rest Client 를 사용한 서버와의 통신



Spring For Android 는 안드로이드 애프리케이션 개발을 단순화하기 위한 Spring 프레임워크의 확장이다. 라고 정의가 되어 있네요

주요 지원하는 기능을 살펴보면 아래와 같습니다.


첫째. 안드로이드용 Rest Client 

- Rest Client 를 통해서 서버와의 통신을 쉽게 처리할 수 있습니다.

둘째. Auth support for accessing secure APIs

- 인증 관련 지원 입니다.


Rest Client 를 사용해서 서버와의 통신을 지원하게 되면서 서버와 데이터를 손쉽게 주고 받을 수 있습니다.

서버 통신 예제


public class HttpGetActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_http_get);

}


@Override

protected void onStart() {

super.onStart();

new HttpGetTask().execute( 10);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.http_get, menu);

return true;

}

public void showResult( UserModel model){

TextView view = (TextView)findViewById( R.id.textview);

if( model != null){

view.setText( "id : " + model.getId() + ", name : " + model.getName());

}

}

class HttpGetTask extends AsyncTask<Integer, Void, UserModel>{

@Override

protected UserModel doInBackground(Integer... params) {

final String url = "http://192.168.56.1/zadu/user/{id}";

// Accept header "application/json" 을 명시하여 JSON 데이터를 리턴받길 원한다고 설정해 줍니다.

                        HttpHeaders requestHeaders = new HttpHeaders();

            List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();

            acceptableMediaTypes.add(MediaType.APPLICATION_JSON);

            requestHeaders.setAccept(acceptableMediaTypes);

            

            // Rest Template 객체에서 사용할 reqeustEntity 를 위에서 정의한 request Header 를 사용해서 생성합니다.

            HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);


            // 서버와의 통신을 담당할 RestTemplate 객체를 생성합니다.

            RestTemplate restTemplate = new RestTemplate();

    // MappingJacksonHttpMessageConverter 를 통해서 결과값인 JSON 데이터를 UserModel 데이터로 변환할 수 있습니다.

            MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();

            restTemplate.getMessageConverters().add(converter);

            

            // HTTP GET 요청을 수행합니다.

            ResponseEntity<UserModel> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, UserModel.class, params[0]);

            

// 결과값을 받아옵니다.

                        return responseEntity.getBody();

}

@Override

        protected void onPostExecute(UserModel result) {


            // 결과값을 찍어줍니다.

            showResult(result);

        }

}

}



'개발' 카테고리의 다른 글

안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12
큰 이미지 로딩  (0) 2014.03.12

댓글을 달아 주세요

posted by 동건이 2014. 3. 12. 10:52

Fragment와 Activity통신

안드로이드 Fragment에서 Activity 와 통신하기


Fragment 는 여러 Activity 에서 사용될 수 있으므로 Activity 에 독립적으로 구현되어야 합니다.

Fragment 는 getActivity() 메소드로 Attach 되어 있는 Activity 를 가져올 수 있습니다.


Activity 로 이벤트 콜백 메소드 만들기

Fragment 내에서 발생하는 이벤트를 Activity 와 공유하기 위해서는 Fragment 에서 이벤트 콜백 인터페이스를 정의하고 Activity 에서 그 인터페이스를 구현해야 합니다.


예를 들면

Activity 내에 두개의 Fragment 가 있고, 하나는  최신기사의 제목 목록을 보여주는 ListFragment 이고  다른 Fragment 는 선택된 기사의 상세내용을 보여주는 DetailFragment 입니다.

사용자가 ListFragment에서 최신기사의 제목을 선택했을 때 선택한 선택된 기사의 상세 내용을 보여주기 위해서는 선택됬다는 이벤트를 DetailFragment에서 알아채야 합니다.


이때 가장 쉽게 생각할 수 있는 방법은 

ListFragment 에서 사용자가 선택 했을때 DetailFragment 를 바로 호출하는 방법입니다.

DetailFragment detailFrag = (DetailFragment)getActivity().getFragmentManager().findFragmentById( ... );

detailFrag.viewArticle(...)


Fragment 에서는 Activity 를 가져올 수 있는 getActivity() 메소드가 존재하기 때문에 위처럼 작성하는 것도 가능합니다.

그럼 위 코드의 문제점은 뭘까요? ListFragment가 기사를 보여주는 DetailFragment 와 연관되어 있기 때문에 ListFragment 는 재사용이 가능하도록 독립적으로 설계되지 않았습니다.


그럼 ListFragment 가 홀로 설수 있는 방법은 무엇을 까요?

1. ListFragment 내에 이벤트 인터페이스를 정의합니다.

public interface OnArticleSelectedListener {

        public void onArticleSelected(Uri articleUri);

}



2. Activity 에서 Fragment 의 이벤트 인터페이스를 구현합니다.

... Activity implements ListFragment.OnArticleSelectedListener{

...

public void onArticleSelected(Uri articleUri){

// DetailFragment 를 가져와서 이벤트를 처리합니다.

DetailFragment detailFrag = (DetailFragment)getFragmentManager().findFragmentById( ... );

detailFrag.viewArticle(...)

}

}



3. ListFragment 에서 Activity 에 대한 참조를 얻습니다.

Fragment는 onAttach lifecycle 콜백함수에서 Activity 에 대한 참조를 얻을 수 있습니다.

    OnArticleSelectedListener mListener;

    @Override

    public void onAttach(Activity activity) {

        super.onAttach(activity);

        try {

            mListener = (OnArticleSelectedListener) activity;

        } catch (ClassCastException e) {

            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");

        }

    }



4. ListFragment 의 이벤트 콜백 함수에서 Activity 에서 인터페이스를 구현한 이벤트 콜백 함수를 호출합니다.

    @Override

    public void onListItemClick(ListView l, View v, int position, long id) {

        // Send the event and Uri to the host activity

        mListener.onArticleSelected(noteUri);

    }



복잡하지만 Fragment 와 Activity 중간에 인터페이스를 두어 Fragment 를 독립적으로 구현할 수 있습니다.

'개발' 카테고리의 다른 글

안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12
큰 이미지 로딩  (0) 2014.03.12

댓글을 달아 주세요

posted by 동건이 2014. 3. 12. 10:46

이미지 캐싱

안드로이드 이미지 캐쉬하기


이미지 캐쉬하는 것은 그렇게 어렵지 않습니다. 기본적으로 Cache 클래스를 제공해주기 때문에 사용자는 HashMap 처럼 넣고 빼고 하면서 자연스럽게 사용하면 됩니다.

제공되는 Cache 클래스는 메모리 캐쉬는 LruCache, 디스크 캐쉬는 DiskLruCache 입니다.


메모리 캐쉬를 사용하여 이미지를 캐쉬해보자


// 캐쉬 변수 설정

private LruCache<String, Bitmap> mMemoryCache;


@Override

protected void onCreate( Bundle savedInstanceState){

// 캐쉬의 기본 단위는 킬로바이트 입니다. 

final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);

final int cacheSize = maxMemory / 8;

        // 캐쉬를 생성합니다. cacheSize 는 이 메모리 캐쉬의 사이즈입니다.(단위 킬로바이트)

        // sizeOf 함수는 구현해야 합니다. 캐쉬하려는 객체의 사이즈를 리턴하는 함수. 캐쉬 남은용량과 캐쉬하려는 객체의 용량을 비교하기 위해서 사용되는것 같습니다.

mMemoryCache = new LruCache<String, Bitmap>( cacheSize){

@Override

protected int sizeOf( String key, Bitmap bitmap){

return bitmap.getByteCount() / 1024;

}

};

}


// 이미지 캐쉬 하기

public void addBitmapToMemoryCache( String key, Bitmap bitmap){

if( getBitmapFromMemCache( key) == null){

mMemoryCache.put( key, bitmap);

}

}


// 캐쉬된 이미지 가져오기

public Bitmap getBitmapFromMemCache( String key){

return mMemoryCache.get( key);

}


'개발' 카테고리의 다른 글

안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12
큰 이미지 로딩  (0) 2014.03.12

댓글을 달아 주세요

posted by 동건이 2014. 3. 12. 10:45

큰 이미지 로딩

안드로이드 큰 이미지를 효율적으로 로드하는 방법


- 사이즈가 큰 이미지를 로드할때는 메모리에 부담이 발생합니다. 따라서 화면크기보다 큰 사이즈의 이미지는 아래와 같이 로드하는게 메모리에 부담이 적게됩니다.


로드하려는 비트맵 이미지의 정보 읽기

BitmapFactory.Options options = new BitmapFactory.Options();

// 이미지는 로드 하지 않고 out~~(outHeight, outWidth) 으로 시작되는 속성 정보만 읽는다., 메모리에 부담이 적게 된다.

// true 로 설정되어 있을 경우 decode 시에 null 을 리턴한다. 로드된 이미지가 없기 때문에

options.inJustDecodeBounds = true; 

BitmapFactory.decodeResource( getResources(), R.id.myimage, options);

int imageHeight = options.outHeight;

int imageWidth = options.outWidth;

String imageType = options.outMimeType;



로드하려는 이미지가 실제 필요한 사이즈보다 큰지 체크하는 메소드

실제 필요한 사이즈로 이미지를 조절하기 위해 체크하는 메소드

public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight){

final int height = options.outHeight;

final int width = options.outWidth;

int inSampleSize = 1;

if( height > reqHeight || width > reqWidth){

final int heightRatio = Math.round((float)height / (float)reqHeight);

final int widthRatio = Math.round((float)width / (float)reqWidth);

inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;

}

return inSampleSize;

}


위의 calculateInSampleSize 메소드를 사용하여 이미지 로드하기

public static Bitmap decodeSampleBitmapFromResource( Resources res, int resId, int reqWidth, int reqHeight){

final BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeResource( res, resId, options);

options.inSampleSize = calculateInSampleSize( options, reqWidth, reqHeight);

// 로드하기 위해서는 위에서 true 로 설정했던 inJustDecodeBounds 의 값을 false 로 설정합니다. 

options.inJustDecodeBounds = false;

return BitmapFactory.decodeResource( res, resId, options);

}


'개발' 카테고리의 다른 글

안드로이드 리소으와 에셋  (0) 2014.03.12
logback 로그 프레임워크  (0) 2014.03.12
Spring fro Android  (0) 2014.03.12
Fragment와 Activity통신  (0) 2014.03.12
이미지 캐싱  (0) 2014.03.12
큰 이미지 로딩  (0) 2014.03.12

댓글을 달아 주세요