[Android] 65일차 - intent, broadcast receiver, Content Provider :: 소림사의 홍반장!

 

65일차

(2) Intent Resolution
  <1> Intent 분류
   1) Explicit Intent (명시적 인텐트) : 명시적으로 같은 어플리케이션내의 Activity를 지정하거나 할때 쓰인다.
   2) Implicit Intent (암시적 인텐트) : 암시적으로 컴포넌트의 이름을 지정하지 않아서 실행을 다른 어플리케이션에게
    맡길 경우 주로 사용한다. (메일을 보내는건 메일 보내는 어플리케이션에게 맡기는 등)
    - 암시적 인텐트가 발생하면 안드로이드 시스템은 등록된 어플리케이션들의 Intent Filter 를 검색해서 맞는
    타입의 어플리케이션을 사용자로 하여금 선택하게 만든다. (이때에 Action, Data, Category 가 선택의 기준이다)
  <2> Intent Filter
   - Intent Filter 는 기본적으로 AndroidManifest.xml 을 통해서 <intent-filter> 를 통해서 선언되는데, broadcast receiver 만은
   Context.registerReceiver() 메소드를 통해서 동적으로 IntentFilter 객체로 등록되는 것이 가능하다.
   안드로이드 시스템은 Intent Filter의 다음 3가지 test 항목을 반드시 통과해야만 해당 컴포넌트에 Intent 를 전달해준다.
   1) Action test(필수항목)
    Action 은 인텐트 필터 선언시 반드시 하나라도 입력이 되어야만 하며, 만약 Action 이 없는 Intent 실행시는
    맞는 Action 이 없다고 하더라도 통과가 된다.
    다음과 같은 형태로 선언하는 것이 가능하며 지정된 action을 포함한 Intent 실행시 해당 컴포넌트가 작동하게된다.
    <intent-filter . . . >
     <action android:name="com.example.project.SHOW_CURRENT" />
     <action android:name="com.example.project.SHOW_RECENT" />
     <action android:name="com.example.project.SHOW_PENDING" />
     . . .
    </intent-filter>
   2) Category test
    기본적으로 category를 포함하고 있지 않은 Intent 가 실행시 대부분 Category test는 통과가 되지만,
    Activity가 암시적 인텐트를 받으려면 intent-filter 안에 android.intent.category.DEFAULT 를 반드시 포함하고 있어야 한다.
    단, MAIN, LAUNCHER 로 잡혀있는 기본 Activity 는 DEFAULT를 포함하고 있는 것으로 간주되어 생략이 가능하다.
    <intent-filter . . . >
     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.BROWSABLE" />
     . . .
    </intent-filter>
   3) Data test
    <intent-filter . . . >
     <data android:mimeType="video/mpeg" android:scheme="http" . . . />
     <data android:mimeType="audio/mpeg" android:scheme="http" . . . />
     . . .
    </intent-filter>
    위와 같은 형태로써 각각의 data 는 URI 와 data type(MIME Type)을 선언할 수 있다.
    URI 는 다음과 같은 형식을 가진다. scheme://host:port/path ex) content://com.study.zod425:200/data/data
    data type은 MIME Type을 선언할 수 있고, subtype으로 *을 쓸 수 있다. ex) text/ * audio/ * (안드로이드에선 반드시 소문자로만 표기한다)
    
    ※ 인텐트 필터에 data type만을 선언했을 경우 URI에 content:, file: 을 선언하지 않아도 된다.

 

15. Broadcast Receiver
    브로드 캐스트 리시버는 안드로이드에서 혹은 사용자에 의해서 일어나는 특정한 이벤트를 받아서 일을 처리하는 기능을 제공하는 클래스이다.
    (1) 작성법
        BroadcastReceiver 클래스를 상속 받고, onReceive() 메소드를 구현한다.
        AndroidManifest.xml에 해당 리시버를 등록하고 intent-filter로 원하는 브로드캐스팅 받을 Action을 등록한다.
        ex) 만약 SMS가 왔을 경우 리시버의 작동을 원한다면
        <receiver android:name="SMSReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>
        또한 권한 설정이 필요하다.
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    (2) 실행법
        안드로이드 자체에서 브로드캐스팅되는 것을 받는 경우는 해당 이벤트 발생시 자동으로 실행이 되지만,
        사용자 지정의 이벤트는 직접 sendBroadcast(intent) 메소드를 이용해야만 한다.

 


 FLAG_ACTIVITY_BROUGHT_TO_FRONT : 제일 앞으로 튀어나오는 플래그


13. Content Providers
 어플리케이션끼리 특정한 데이터를 주고 받을 수 있게 해주는 기술.(공용 데이터베이스)
 예를 들어 주소록이나 음악 앨범이나 플레이리스트 같은 것에도 접근하는 것이 가능하다.
 (1) ContentProvider 사용
  getContentResolver() 메소드로 ContentResovler를 얻을 수 있다.
  이 객체로부터 다음과 같은 각종 메소드를 실행하는 것이 가능하다.
  ① Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
   - uri : content://scheme 방식의 원하는 데이터를 가져오기 위한 uri
   - projection : 가져올 컬럼의 이름들 배열, null이면 모든 컬럼
   - selection : where 절에 해당하는 내용 ("where" 는 생략)
   - selectionArgs : 위의 selection에서 ?로 표시한 곳에 들어갈 데이터 배열
   - sortOrder : order by 절의 내용이 들어간다 ("order by"는 생략)
  ② Uri insert(Uri url, ContentValues values)
   - url : 값을 인서트할 테이블의 URL값
   - values : 새롭게 인서트할 값의 클래스 객체 (ContentValues 클래스의 put 메소드를 이용해 추가가능)
  ③ int bulkInsert(Uri url, ContentValues[] values) : 여러 행을 한꺼번에 인서트할때 사용
  ④ int update(Uri uri, ContentValues values, String where, String[] selectionArgs) : update시 사용
  ⑤ int delete(Uri url, String where, String[] selectionArgs) : delete시 사용
 (2) ContentProvider 작성
  <1> ContentProvider 클래스를 상속받아서 다음과 같은 메소드를 오버라이드 해야한다.
   ① query()
   ② insert()
   ③ update()
   ④ delete()
   ⑤ getType()
   ⑥ onCreate()
  <2> MIME type 지정
   완전히 새로운 타입의 경우 getType 메소드를 통해서 URI 가 일치할 경우 해당 MIME Type 을 리턴해준다.
   MIME Type은 일반적으로 다음과 같이 선언한다.
   - 단일 데이터일 경우
   vnd.android.cursor.item/vnd.yourcompanyname.contenttype
   - 복수행 데이터일 경우
   vnd.android.cursor.dir/vnd.yourcompanyname.contenttype
  <3> Content의 URI 작성
   content://authority/path/_id 형태로 작성이 가능하다. 이 URI로써 특정 데이터에 접근하는 것이 가능해진다.

 

 

[참고] http://developer.android.com/guide/topics/ui/notifiers/notifications.html

 

다른 카테고리의 글 목록

Dev. 640시간 뭉개기/강의내용정리 카테고리의 포스트를 톺아봅니다