달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형
728x90
반응형

 

오류가 전혀 없는 프로젝트 파일이 갑자기 빨간색 표시가 되면서
빌드가 되지 않아서 확인해 보니
안드로이드 debug.keystore가 만료 되었다.
debug.keystore파일을 삭제후 다시 재실행해서 갱신해준다.


Description Resource Path Location Type
Error generating final archive: Debug Certificate expired on 11. 7. 5 오전 10:19 Unknown Android Packaging Problem


 

728x90
반응형
:
Posted by mapagilove
728x90
반응형

[안드로이드] 화면 해상도에 관계없는 레이아웃(Layout) 만들기

개발자 이야기/안드로이드 2011/06/29 17:11

안드로이드로 개발하다보면 xml 파일을 이용해서 레이아웃(Layout)을 설정하고 그 안에서 코드를 작성하는 경우가
대다수일겁니다.

이 때, 각 뷰(View)들의 좌표나 폭, 높이 등을 설정하는데, 픽셀 좌표인지, 밀도 좌표인지 기타 또 다른 좌표계인지에
따라 그 값이 바뀌게 됩니다. 또한 해당 어플리케이션을 실행시킬 단말기의 스크린 크기나 해상도에 따라
화면이 어색하게 나오거나 심한 경우에는 깨진 화면이 나타나기도 합니다.

저는 480x800의 해상도를 가진 갤럭시S2와 600x1024의 해상도를 가진 갤럭시탭 7인치 모델을 동시에 사용해서
개발하다보니 서로의 GUI 화면 좌표가 다르게 표시되는 현상이 발생해버렸습니다.

별의별 수단을 써봤습니다. 픽셀 좌표인 px를 사용해서 값을 지정해보기도 했고,
밀도 좌표인 dip나 dp를 사용해보기도 했습니다.


여기서 잠깐!! px와 dp에 대해서 먼저 정리하고 넘어가겠습니다.

안드로이드는 160dpi를 기본으로 가정하고 있습니다. 이때 화면 해상도는 320x480이 됩니다.
해상도 320x480에서 가로폭이 160dp가 되기 때문에, 1dp의 크기는 320 / 160 = 2 pixel이라고 볼 수 있습니다.

하지만 요즘 단말기들의 해상도들은 WVGA인 480x800의 단말기가 많습니다.
픽셀 좌표를 이용해서 320x480 단말기에서 GUI를 구성하면 480x800인 단말기에서는 작은 화면으로 출력이 되고,
그 반대로 480x800에서의 GUI를 320x480인 단말기에서 출력하면 GUI가 잘려서 보여지게 됩니다.
심한 경우에는 깨진 GUI를 보이기도 하죠.

이 때를 대비해서 만든 것이 dip(density independent pixel) 단위입니다.
화면의 픽셀 밀도를 정의해서 만든 단위이기 때문에 같은 dip 값을 이용해서 레이아웃을 작성하면
어느 해상도를 가진 단말기라고 하더라도 같은 비율로 이루어진 GUI 화면을 보여주게 됩니다.
즉, 화면 해상도에 관계없는 균일한 GUI를 제공하는 어플리케이션을 제공할 수 있는거죠.

안드로이드에서 간주하고 있는 해상도 범주는 크게 3가지 입니다.
LDPI(저해상도), MDPI(중해상도), HDPI(고해상도) 이며, 각각의 밀도값은 LDPI가 120, MDPI가 160, HDPI가 240입니다.
(인치당 픽셀수를 의미합니다.)



그리고 픽셀 좌표와 dip 좌표의 환산공식은 다음과 같습니다.

dip = px * (160 / density)

안드로이드가 160dpi를 기준으로 하고 있기 때문에 위와 같은 공식이 나오는 것이며,


만약 해상도 480x800 단말기에서 이런 수식을 계산하게 된다면, 480x800은 고해상도인 HDPI이기 때문에

480x800 해상도에서 dip와 px 단위 환산

dip = px * (160/240) = px * (2/3)

이 됩니다. 따라서 480x800 px 좌표는 320x533 dip 좌표라고 생각하면 됩니다.




하지만 !!!
이렇게 px나 dip만을 이용해서 모든 해상도를 고려한 레이아웃이 술술술 나온다면 얼마나 좋겠습니까?
저도 갤럭시S2와 갤럭시탭7인치를 갖고 개발하다가 큰 난관에 봉착하게 되었는데
이 녀석들이 같은 dpi를 가지고 있는 겁니다. 화면 해상도는 480x800과 600x1024인데 dpi는 둘 다 240dpi입니다.

즉, 갤럭시S2에 맞게 GUI를 구성하면 갤럭시탭에서 깨진 GUI를 보여주게 되더군요.


결국, 이런 저런 문제 해결을 고려하다가 레이아웃에서 가중치(weight)값을 이용해서 화면을 구성하는 방법을 택하게 되었습니다.
어제 하루종일 px와 dip를 갖고 고민을 했지만, weight를 이용하니 고민이 한번에 날아갔습니다. +_+


만약 이와 같은 GUI를 구성한다고 할 때, 레이아웃은 다음과 같이 작성하면 됩니다.
아무 것도 없는 공간에 LinearLayout을 이용해서 공간을 할당하는게 키포인트입니다.


샘플 xml 코드는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:background="@drawable/player_landscape_bg_control">


<LinearLayout

android:layout_width="0px"

android:layout_height="fill_parent"

android:layout_weight="175"/>

<ImageButton

android:id="@+id/btnImgP_ZoomOut"

android:layout_width="0px"

android:layout_height="wrap_content"

android:layout_weight="83"

android:background="@drawable/photoviewer_btn_zoom_out_landscape"/>

<LinearLayout

android:layout_width="0px"

android:layout_height="fill_parent"

android:layout_weight="40"/>


<ImageButton

android:id="@+id/btnImgP_PlayAndPause"

android:layout_width="0px"

android:layout_height="wrap_content"

android:layout_weight="83"

android:background="@drawable/photoviewer_btn_play_landscape"/>

<LinearLayout

android:layout_width="0px"

android:layout_height="fill_parent"

android:layout_weight="30"/>


<ImageButton

android:id="@+id/btnImgP_ZoomIn"

android:layout_width="0px"

android:layout_height="wrap_content"

android:layout_weight="83"

android:background="@drawable/photoviewer_btn_zoom_in_landscape" />

<LinearLayout

android:layout_width="0px"

android:layout_height="fill_parent"

android:layout_weight="40"/>

<ImageButton

android:id="@+id/btnImgP_ChangeDMR"

android:layout_width="0px"

android:layout_height="wrap_content"

android:layout_weight="83"

android:background="@drawable/photoviewer_btn_changedisplay_landscape" />

<LinearLayout

android:layout_width="0px"

android:layout_height="fill_parent"

android:layout_weight="183"/>


</LinearLayout>

샘플은 가로 방향의 빈 공간에 대해서만 가중치를 줬지만 weight는 가로든 세로든 어디에나 적용할 수 있습니다.


그리고 무사히 갤럭시S2와 갤럭시탭에서 같은 화면을 보여줄 수 있게 되었습니다.
편하게 사용하려고 만든 dip 단위가 참 쓸모가 없다라는걸 느꼈던 순간이네요. -_-;;
728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 앱배포시 DB 배포.

앱배포시 DB배포는 안되므로,

하나의 방법중 하나인 웹으로부터 다운받게끔 한뒤 파일을 해당패키지로 복사한다.

 

해당 패키지의 디렉토리를 만들고, 파일을 생성해야 된다. 그렇치 않으면 두번 실행해야 파일이 제대로 쓰여진다.

 

private void downloadDB(HttpURLConnection conn, String FileName) {

 

            // 웹페이지에서 다운받은 db파일을 해당 패키지 db 저장한다.

            final String DIR ="/data/data/com.ludvan/databases/";

            final String PATH = DIR+ FileName;

            File fDir = new File(DIR);

            File f = new File(PATH);

 

            FileOutputStream fos = null;

            BufferedOutputStream bos = null;

            InputStream is = null;

            BufferedInputStream bis = null;

 

            try {

                  URL url = new URL("http://........db");

                  HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

 

                  if(!fDir.exists()){

                        fDir.mkdir();

                  }

                  if (f.exists()) {

                        f.delete();

                        f.createNewFile();

                  }

                  is = httpConn.getInputStream();

                  bis = new BufferedInputStream(is);

 

                             

                  fos = new FileOutputStream(f);

                  bos = new BufferedOutputStream(fos);

 

                  int read = -1;

                  int len = conn.getContentLength();

                  byte[] buffer = new byte[len];

 

                  while ((read = bis.read(buffer, 0, 1024)) != -1) {

                        bos.write(buffer, 0, read);

                  }

                  bos.flush();     

                  Log.i(TAG, "write sucess");

            } catch (IOException e) {

                  // TODO Auto-generated catch block

                  Log.i(TAG, "file Write error");

            } finally {

                  try {

                        fos.close();

                        bos.close();

                        is.close();

                        bis.close();

                  } catch (IOException e) {

 

                  }

            }

      }// downloadDB

안드로이드 앱배포시 DB 배포.

앱배포시 DB배포는 안되므로,

하나의 방법중 하나인 웹으로부터 다운받게끔 한뒤 파일을 해당패키지로 복사한다.

 

해당 패키지의 디렉토리를 만들고, 파일을 생성해야 된다. 그렇치 않으면 두번 실행해야 파일이 제대로 쓰여진다.

 

private void downloadDB(HttpURLConnection conn, String FileName) {

 

            // 웹페이지에서 다운받은 db파일을 해당 패키지 db 저장한다.

            final String DIR ="/data/data/com.ludvan/databases/";

            final String PATH = DIR+ FileName;

            File fDir = new File(DIR);

            File f = new File(PATH);

 

            FileOutputStream fos = null;

            BufferedOutputStream bos = null;

            InputStream is = null;

            BufferedInputStream bis = null;

 

            try {

                  URL url = new URL("http://........db");

                  HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

 

                  if(!fDir.exists()){

                        fDir.mkdir();

                  }

                  if (f.exists()) {

                        f.delete();

                        f.createNewFile();

                  }

                  is = httpConn.getInputStream();

                  bis = new BufferedInputStream(is);

 

                             

                  fos = new FileOutputStream(f);

                  bos = new BufferedOutputStream(fos);

 

                  int read = -1;

                  int len = conn.getContentLength();

                  byte[] buffer = new byte[len];

 

                  while ((read = bis.read(buffer, 0, 1024)) != -1) {

                        bos.write(buffer, 0, read);

                  }

                  bos.flush();     

                  Log.i(TAG, "write sucess");

            } catch (IOException e) {

                  // TODO Auto-generated catch block

                  Log.i(TAG, "file Write error");

            } finally {

                  try {

                        fos.close();

                        bos.close();

                        is.close();

                        bis.close();

                  } catch (IOException e) {

 

                  }

            }

      }// downloadDB

 

728x90
반응형
:
Posted by mapagilove
2012. 3. 27. 21:36

안드로이드 - 사칙연산 안드로이드 이야기2012. 3. 27. 21:36

728x90
반응형

 

java BigDecimal 사칙연산  

Float이나 Double로 사칙연산을 하는 경우 정확한 값을 얻지 못할 때가 있고, 

이는 소수점 이하의 값을 제대로 읽지 못하기 때문이다. 

예를 들어 0.2 * 0.4 의 결과가 0.0800000005 이렇게 나오는 경우이다 

 

이럴때는 BigDecimal을 이용하자. 

java.math.BigDecimal import해야한다  

 

// 예제에서는 String 타입을 인자로 넣었다. 

BigDecimal preNum = new BigDecimal("6"); 

BigDecimal postNum = new BigDecimal("2");

// 곱하기

 

mutipleResult = preNum.multiply(postNum);

// 나누기, 반올림해서 소수점 둘째자리까지 보여준다.

 

divideResult = preNum.divide(postNum, 2, BigDecimal.ROUND_UP) 

// 더하기

 

addResult = preNum.add(postNum); 

// 빼기

 

subtractResult = preNum.subtract(postNum);

 

 

728x90
반응형
:
Posted by mapagilove
2012. 3. 26. 21:43

옥토버페스트 이야기 - 다섯번째 여 행 이야기2012. 3. 26. 21:43

728x90
반응형
안녕하세요. 옥토버 페스트 이야기 다번섯째 스토리 올립니다. 우선 독일 혹은 유럽에서 렌트할 일이 있으시면, 우선 EuroCar와 같은 유럽전역에서 운영되고 있는 대형 회사를 이용하시기 바랍니다.
그러자고 하면 우선 가까운 운전면허 발급을 하고 있는 경찰서에서 국제 운전면허증을 발급받으세요. 아마도 대략 반명함판 사진 2장이랑 몇 만원 정도의 돈이 필요할 것으로 기억납니다.
추가로, 렌트의 경우는 공항에서 빌리면 묵으시려는 지역근처에서 빌리는 것보다 상당히(20~30%)가량 비쌉니다. (국제운전면허증, 여권필요)
빌리는 비용의 경우 대게 차량별로 차이가 나니 꼼꼼히 확인 하시고, 최초로 차량을 대여 받을때 전체적으로 스크레치등 확인이 반드시 필요합니다.
아래는 주유소 주유기 사진입니다.
잘 확인하시고 넣으세요.

유럽의 경우 디젤차와 가솔린차가 반반이니 주의 하시고, 셀프 세차장이 많지만 관리하시는 분이 있으므로 물어보시면 됩니다. 주유 후 아마 영수증이 나오는 카운터에서 계산하시면 끝...


 


728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 프로그래밍에서 중요한 개념 'Intent'

보고있는 책보다도 잘 정리를 해 놓았다.....

[원문] http://gtko.springnote.com/pages/5254593?edit=1

인텐트를 통한 액티비티를 명시적으로 시작하는 방법, 암시적인 인텐트로 데이터의 한 부분에 대해 수행되는 액션을 요청하는 방법, 안드로이드가 그 요청을 서비스할 수 있는 애플리케이션 콤포넌트를 결정하도록 하는 방법을 설명한다.

브로드캐스트 인텐트는 시스템 전역에 이벤트를 알린다. , 브로드캐스트로 전송하고 브로드캐스트 수신자로 이를 받아 처리한다.

어댑터는 데이터 소스와 프리젠테이션(view )과 연결하는 방법.

인텐트 소개

어 떤 액션이 수행되는데 특정 데이터의 특정 부분을 가지고 수행하라는 선언으로 메시지를 전달하는 메커니즘이다. , activity, native 장치 등 상호간의 작용을 지원한다. 독립적인 콤포넌트들의 컬렉션을 서로 연결된 단일 시스템으로 변경하는 역할이기도 하다.

인텐트 역할

액티비티를 명시적( 클래스 지정) 혹은 암시적(데이터의 어느 한 부분에 대해 수행되는 액션을 요청)으로 시작하는 것.

브로드캐스트 인텐트로 이벤트 중심 애플리케이션을 구성할 수 있다

인테트로 activity 시작

인텐트는 애플리케이션 내에 있는 activity 간의 시작, 중지, 전이에 사용된다.

현재 activity에서 다른 activity 화면을 열려면, startActivity() 를 사용한다. 이 액티비티는 부모 액티비티와 독립적이다.

  1. startActivty(a_intent)
  • Intent a_intent 는 대상 클래스를 명시적으로 지정하거나, 수행할 액션일 수 있다. 액션을 지정하면 런타임은 intent resolution 이라는 과정을 거쳐 acitivity를 선택한다.

명시적 activity start

AndroidMenifest에 선언된 activity 를 명시적으로 지정해 시작할 수 있다.

  1. Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
  2. sgtartActivity(intent);
  • startActivity()가 수행되면 현재 MyActivity onPause() 상태로 가고, MyOtherAcitivity 가 활성상태로 스택의 맨 위로 갈 것이다.
  • 새로운 acitivity에서 finish()를 호출하면 MyActivity는 종료되어 스택에서 제거된다.
  • 그렇지 않다면 MyOtherActivity에서 back button을 누르면 MyActivity로 돌아 올 수 있다.
  1. Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName(this, MyActivity.class.getName());
    startActivity(intent);

암시적 activity start

수행할 액션과 요구되는 데이터로 acitvity를 시작할 수 있다.

예를 들어 dialer를 통해 전화걸기를 하려며 새로운 dialer를 구현하기 보다 기존 dialer와 전화목록을 이용하면 될 것이다.

  1. Intent new_intent = new Intent( Intent.ACTION_DIAL, Uri.parse("tel:555-2368")
  2. startAcitivity(new_intent)
  • runtime new_intent를 분석해 전화번호에 대한 전화걸기 action을 제공하는 acitivity를 시작한다.
  • 여러 native application은 이런 액션에 대한 콤포넌트를 제공하고, 사용자도 새로운 액션을 지원하거나
  • 네이티브 액션의 대체 공극바를 제공하기 위해 등록될 수 있다.

Linkity 로 시작

정 규식 패턴 매칭을 통해 TextView 에 하이퍼링크를 자동으로 생성해 주는 helper class잉다. 즉 패턴에 일치하는 텍스트는 그것을 대상 URI로 사용해 암시적으로 startAcitivity( new Intent(Intent.ACTION_VIEW, uri)) 를 호출하는 하이퍼 링크로 변환된다.

Linkify 클래스는 대표적으로 TextViewSpinnerable UI 를 사용할 수 있다.

코드에서 Likify 사용

  • 텍스트에 있는 http url, email 주소를 likify 한다.
  1. TextView myTextView = (TextView)findViewById(R.id.myTextView);
    Linkify.addLinks(myTextView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
  • url 을 클릭하면 웹브라우저가 열리고, email 주소를 클릭하면 email client가 호출된다.

view 선언에서 linkify 사용

android:autoLink 속성에 none, web, email, phone, all self-describing-values '|'로 구분해 사용할 수 있다.

  1. <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/linkify_me"
    android:autoLink="phone|email"
    />

사용자 정의 linkify 문자열 만들기

사용자 RegExp 를 만들어 linkify 문자열로 사용할 수 있다.

  1. int flags = Pattern.CASE_INSENSITIVE;
    Pattern pattern = Pattern.compile("\\bquake[0-9]*\\b", flags);
    Linkify.addLinks(myTextView, pattern, "content://com.pad.earthquake/earthquakes/");
  • quake로 시작하고 그 뒤에 숫자가 나오는 모든 문자열 찾아 content://.. URI에 붙여준다.

TransformFilter, MatchFilter 인터페이스 이용한 문자열 사용

RegExp 패턴 매치에 추가적인 조건을 더할 수 있다.

  1. MatchFilter matchfilter = new MatchFilter() {
    public boolean acceptMatch(CharSequence s, int start, int end) {
    return (start == 0 || s.charAt(start-1) != '!'); }
    };
    TransformFilter transformfilter = new TransformFilter() {
    public String transformUrl(Matcher match, String url) {
    return url.toLowerCase(); }
    };

String prefixWith = "http://www.";
pattern = Pattern.compile("\\bTEST.COM\\b");
Linkify.addLinks(myTextView, pattern, prefixWith, matchfilter, transformfilter );

  • 문자열 앞에 !가 있는 것은 취소하는 필터 구현.

액티비티 결과

서 브액티비티를 시작하면 서브 액티비티가 종료할 때 부모의 이벤트 핸들러(onActivityResult())를 호출한다. startActivityForResult() 는 시작할 intent request code 를 사용해서 activity의 결과를 request code로 식별한다.

명시적으로 서브 액티비티 시작

  1. private static final int SHOW_SUBACTIVITY = 1;
  2. Intent intent = new Intent(getApplicationContext(), MyOtherActivity.class);
    startActivityForResult(intent, SHOW_SUBACTIVITY);

암시적 서브 액티비티 시작

  1. private static final int PICK_CONTACT_SUBACTIVITY = 2;
  2. Uri uri = Uri.parse("content://contacts/people");
    Intent intent = new Intent(Intent.ACTION_PICK, uri);
    // Result resturned in onActivityResult
    startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

서브액티비티에 데이터 전달하기

Intent intent = new Intent();
Bundle bun = new Bundle();

bun.putString(”param_string”, “the actual string”); // add two parameters: a string and a boolean
bun.putBoolean(”param_bool”, true);

intent.setClass(this, SecondaryActivity.class);
intent.putExtras(bun);
startActivity(intent);

서브액티비티에서 전달된 데이터 처리...

Bundle bun = getIntent().getExtras();
String param1 = bun.getString(”param_string”);
boolean param2 = bun.getBoolean(”param_bool”);

서브 액티비티 / 인텐트 필터 호출에 응답

암시적으로 호출된 서브액티비티에서 수행할 액션, 데이터를 통해 요청된 작업을 진행한다.

  1. @Override
  2. public void onCreate(Bundle bundle) {
  3. ...
  4. Intent intent = getIntent(); // 수행할 action, date 를 얻기 위해.
  5. String action = intent.getAction();
  6. Uri data = intent.getData();
  7. ...
  8. }

또한 다음과 같이 startNextMatchingActivity() 메서드로 액션의 처리 책임을 가장 잘 일치하는 컴포넌트로 넘길수 있다.

, 야밤에 다른 intent 로 처리를 넘겨버리는 예이다.

  1. Intent intent = getIntent(); // 수행할 action, date 를 얻기 위해.
  2. if( isAfterMidnight)
  3. startNextMatchingActivity(intent);

서브 액티비티 / 결과 돌려주기

finish()를 호출하기 전에 setResult() 로 결과를 저장한다. 결과 코드와 Intent로 표현된 result payload 로 제공된다.

Activity.RESULT_OK, Activity.RESULT_CANCELED 를 결과로 많이 사용하고, 사용자 정의 결과값을 줄 수 있다. 결과 인텐트에 연락처, 전화번호, 미디어 파일에 대한 URI 정보를 가질 수 도 있다.

  1. Uri data = Uri.parse("content://horses/" + selected_horse_id);
    Intent result = new Intent(null, data);
    result.putExtra(IS_INPUT_CORRECT, inputCorrect);
    result.putExtra(SELECTED_PISTOL, selectedPistol);
    setResult(RESULT_OK, result);
    finish();

결과 받기

부모 액티비티에서 onActivityresult() 메소드는 서브액티비티의 결과를 받는다.

  • Request code: 서브 액티비티를 시작하는데 사용되었던 요청 코드
  • Result code: 서브 액티비티가 자신의 결과를 나타내기 위해 설정한 코드 예) Activity.RESULT_OK, Activity.RESULT_CANCELED
    • 서브 액티비티가 비정상 종료되거나 결과코드가 지정 안되면 Activity.RESULT_CANCELED 이 결과 코드이다.
  • data: 모든 결과를 담은 인텐트.
  1. @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch(requestCode) {
    case (SHOW_SUBACTIVITY) :
    if (resultCode == Activity.RESULT_OK) {
    Uri horse = data.getData();
    boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
    String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
    Toast.makeText(this, "Pistol Selected: " + selectedPistol, Toast.LENGTH_SHORT).show();
    }
    break;

    case (PICK_CONTACT_SUBACTIVITY) :
    if (resultCode == Activity.RESULT_OK) {
    Toast.makeText(this, "CONTACT SELECTED", Toast.LENGTH_SHORT).show();
    // TODO Handle contact selection.
    }
    break;
    }

Native android action

네이티브 안드로이드 애플리케이션도 역시 인텐트를 사용해 액티비티와 서브 액티비티를 시작한다. Intent 에서 제공하는 네이티브 액션을 살펴보자. 아래 static 문자열은 암시적으로 인테트를 사용할 때 유용하다.

상수

타겟 컴포넌트

액션

ACTION_CALL

activity

전화를 걸어라.

ACTION_EDIT

activity

사용자에게 편집할 데이터를 표시하라.

ACTION_MAIN

activity

데이터 입력과 반환 결과 없이 태스크의 최초의 액티비티로써 액티비티를 실행하라.

ACTION_SYNC

activity

모바일 디바이스의 데이터와 서버의 데이터를 동기화하라.

ACTION_BATTERY_LOW

broadcast receiver

배터리가 부족하다는 경고.

ACTION_HEADSET_PLUG

broadcast receiver

헤드셋이 디바이스에 연결 또는 분리되었다는 것.

ACTION_SCREEN_ON

broadcast receiver

스크린이 켜졌다는 것.

ACTION_TIMEZONE_CHANGED

broadcast receiver

타임존 설정이 바뀌었다는 것.

ACTION_INSERT : 지정된 커서로 새로운 항목을 삽입할 수 있는 액티비티를 연다. 서브 액티비티느 새로 삽입된 항목에 대한 URI를 리턴해야 한다.

ACTION_PICK: URI 로 부터 데이터 항목 하나를 고를 수 있는 서브 액티비티를 듸운다. ) content://contacts/people 전달되면 네이티브 연락처 목록이 뜬다.

ACTION_SEARCH; 검색, SearchManager.QUERY 키를 사용하는 인텐트의 엑스트라 문자열 형태.

ACTION_SENDTO: uri에 지정된 사람에게 보내는 액티비티.

ACTION_SEND: 지정된 데이터를 전송하는 액티비티 시작. 인텐트 타입은 setType을 사용해 전송되는 데이터의mime타입으로 설정

ACTION_VIEW: URI가 합리적으로 보여지게 요청. http: 는 브라우져, tel: 다이얼러, geo: 구글맵

ACTION_WEB_SEARCH: uri에 웹검색을 수행하는 액티비티를 연다

Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, “검색어”);
startActivity(intent);

참조

http://www.itwizard.ro/how-to-create-a-new-android-activity-82.html

인텐트 필터를 이용한 암시적 인텐트 서비스

인텐트가 데이터 집합에 대해 수행되는 액션을 위한 요청으로 보면 인텐트 필터는 액티비티, 서비스, 브로드캐스트 수신자를 특정한 종류의 데이터에 대한 액션을 수행하는 존재로 등록하는데 사용.

  1. <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

<activity android:name=".EarthquakeDamageViewer" android:label="View Damage">
<intent-filter>
<action android:name="com.paad.earthquake.intent.action.SHOW_DAMAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.ALTERNATIVE_SELECTED"/>
<data android:mimeType="vnd.earthquake.cursor.item/*"/>
</intent-filter>
</activity>

  • action: 서비스 되는 액션의 이름. 액션은 유일한 문자열이어야 하므로 자바 패키지 이름 규약을 사용한다.
  • category: 액션이 서비스 되어야 하는 상황을 지정. 여러개의 category 가능.
    • 안드로이드 기본 cagegory
      • android.intent.category.ALTERNATIVE: 기본 액션에 대한 대안 액션임을 선언.
      • android.intent.category.SELECTED_ALTERNATIVE: 대안으로 선택 가능한 것들에 대한 선언.
      • android.intent.category.BROWSABLE: 브라우져 안에서 사용 가능한 액션 지정.
      • android.intent.category.DEFAULT : 데이터 값에 대한 기본 액션으로 지정.
      • android.intent.category.GARGET : 이 액티비티가 다른 액티비티 내부에 포함되어 동작 할 수 있도록 지정.
      • android.intent.category.HOME: 네이티브 홈 스크린의 대안.
      • android.intent.category.LAUNCHER: 애플리케이션 런처.
  • data: 실행 할 수 있는 데이터에 대한 명세. 여러개 지정 가능.
    • android:host: 유효한 호스트 이름
    • android:mimetype: 데이터 형식. ) <data android:mimeType="vnd.moonbase.cursor.item/*"/> 는 ㅁ든 안드로이드 커서
    • android:path: URI에 대한 유효한 경로 값 예) /transport/boarts/
    • android:port 지정된 호스트에 대한 유효한 포트
    • android:scheme 특정한 스킴. ) contnet, http
  •  

안드로이드가 인텐트 필터를 찾는 방법

인테트 URI 실행시 실행 할 수 있는 액티비티가 여러개 존재하면 그중 가장 좋은 것이 시작될 것이다. 이런 과정을 Intent resolution 이라 한다.

  1. 설치된 패키지로 부터 사용 가능한 모든 인텐트 필터들의 리스트를 구성
  2. action이나 cagegory에 맞지 않는 필터는 제외
    1. 필터가 지정된 액션을 포함하거나 아무런 액션도 지정되지 않은 경우 action matches 가 이루어 진다.
      정의된 action이 있지만 지정된 액션과 일치않으면 실패
    2. category matching: 인텐트 필터는 인텐트에 정의된 모든 category 를 반드시 포함해야 한다. catregory가 지정되지 않은 인텐트 필터는 category가 없는 인텐트하고만 일치된다.
  3. 인텐트에 있는 data uril 의 각 부분이, scheme, permissionk path, mime 등 정의하고 있다면, 인텐트 필터의 data 태그와 비교 된다.
    1. MIME: 와일드카드를 이용해 하위 타입을 일치할 수 있다.
    2. scheme: URI의 프로토코 부분. http, ftp...
    3. host name, URI에서 경로 사이에 있는 부분 www.google.com
    4. 경로
이 과정에서 하나 이상의 컴포넌트가 확인되면 인턴트 필터 노드에 추가될 수 있는 선택적 태그와 함께 우선순위에 따라 순서가 매겨진다. 그런다음 가장 높은 순위의 컴포넌트가 리턴된다.
728x90
반응형
:
Posted by mapagilove
반응형