태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Notification을 정ㅋ벅ㅋ - NotificationBuilder 예제 만들어보기

2010.01.19 00:15

강좌 작성환경
SDK Version : Android SDK 2.1, release 1
ADT Version : 0.9.5

추후 SDK업데이트로 인해 글의 내용과 최신 SDK 내용간 차이가 있을 수 있습니다.

Notification에 대해 간략하게 알아보았으니, 실제로 Notification을 만들어보도록 하겠습니다.

[어플리케이션 정보]

액티비티
  • NotificationBuilder (NotificationBuilder.java)
  • NotificationMessage (NotificationMessage.java)

레이아웃
  • main.xml (NotificationBuilder)

권한 (uses-permission)
  • 사용하지 않음

외부 라이브러리 (uses-library)
  • 사용하지 않음

API Level
  • 7 :  Android 2.1

어플리케이션 소스:
예제로 만들어 볼 어플리케이션에서는 우리가 원하는 문구로 Notification을 생성할 수 있도록 상태 표시줄에 표시되는 텍스트 및 Notification 리스트에 표시되는 문구를 입력받을 수 있도록 되어있습니다.



원하는 문구를 입력한 후 버튼을 누르면 Notification이 Notification Manager에 등록되게 되며, 예제 어플리케이션에서는 등록하는 순간 바로 Notification이 나오도록 지정하여 Notification이 뜨는 것을 확인할 수 있습니다.


상태 표시줄에 메시지가 표시됩니다.

메시지가 표시된 후에는 아이콘이 표시되어 있습니다.



예제 어플리케이션의 동작은 다음과 같습니다.

1. Notification에 표시할 문구를 사용자로부터 입력받음
2. 입력받은 문구로 Notification 생성 및 등록
3. Notification이 상태 표시줄에 표시됨
4. Notification List에 표시된 Notification 항목을 클릭하면 NotificationMessage 액티비티가 실행되고, 표시되어있던 Notification이 사라짐

우선, Notification을 생성하는 액티비티인 NotificationBuilder부터 만들어보도록 하겠습니다.

[NotificationBuilder.java]
package com.androidhuman.example.NotificationBuilder;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class NotificationBuilder extends Activity implements OnClickListener{
    
	private EditText tickerText;
	private EditText contentTitle;
	private EditText contentText;
	private Button registerButton;
	private NotificationManager nm;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tickerText = (EditText)findViewById(R.id.tickerText);
        contentTitle = (EditText)findViewById(R.id.contentTitle);
        contentText = (EditText)findViewById(R.id.contentText);
        registerButton = (Button)findViewById(R.id.registerNotification);
        
        registerButton.setOnClickListener(this);
    
    }

	public void onClick(View v) {
		
		switch(v.getId()){
		case R.id.registerNotification:
			// Get Notification Service
			nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
			
			PendingIntent intent = PendingIntent.getActivity(
					NotificationBuilder.this, 0, 
					new Intent(NotificationBuilder.this, NotificationMessage.class), 0);
			
			String ticker = tickerText.getText().toString();
			String title = contentTitle.getText().toString();
			String text = contentText.getText().toString();
										
			// Create Notification Object
			Notification notification =
				new Notification(android.R.drawable.ic_input_add,
						ticker, System.currentTimeMillis());
			
			notification.setLatestEventInfo(NotificationBuilder.this, 
					title, text, intent);
			
			nm.notify(1234, notification);
			Toast.makeText(NotificationBuilder.this, "Notification Registered.", 
					Toast.LENGTH_SHORT).show();
		break;
		}
		
	}
	
}

[main.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    style="?android:attr/listSeparatorTextViewStyle" 
    android:text="TickerText" android:layout_marginBottom="3dp"/>
    
<EditText android:layout_height="wrap_content" 
	android:id="@+id/tickerText" 
	android:hint="Ticker Text" 
	android:layout_width="fill_parent"></EditText>

<TextView android:layout_height="wrap_content" 
	android:text="Notification Panel" 
	android:layout_width="fill_parent" 
	style="?android:attr/listSeparatorTextViewStyle" 
	android:layout_marginBottom="3dp"></TextView>

<EditText android:layout_height="wrap_content" 
	android:layout_width="fill_parent" 
	android:id="@+id/contentTitle" 
	android:hint="Content TItle"></EditText>

<EditText android:layout_height="wrap_content" 
	android:id="@+id/contentText" 
	android:hint="Content Text" 
	android:layout_width="fill_parent"></EditText>

<Button android:layout_height="wrap_content" 
	android:text="Register Notification to Notification Manager" 
	android:id="@+id/registerNotification" 
	android:layout_width="fill_parent"></Button>
</LinearLayout>

Notification의 생성은 Notification 생성 버튼(registerButton)을 눌렀을 때 시작됩니다. 따라서 Notification 생성 코드는 버튼의 클릭 리스너인 OnClick() 메소드에서 처리합니다. 아래는 onClick 메소드 내부의 Notification 생성 부분입니다.

[NotificationBuilder.java]

// Get Notification Service
nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
			
PendingIntent intent = PendingIntent.getActivity(
		NotificationBuilder.this, 0, 
		new Intent(NotificationBuilder.this, NotificationMessage.class), 0);
			
String ticker = tickerText.getText().toString();
String title = contentTitle.getText().toString();
String text = contentText.getText().toString();
										
// Create Notification Object
Notification notification =
	new Notification(android.R.drawable.ic_input_add,
			ticker, System.currentTimeMillis());
	
notification.setLatestEventInfo(NotificationBuilder.this, title, text, intent);
	
nm.notify(1234, notification);
Toast.makeText(NotificationBuilder.this, "Notification Registered.", Toast.LENGTH_SHORT).show();

이 부분이 실질적으로 Notification을 처리하는 코드입니다. 하나하나씩 보도록 하죠.


 nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

Notification을 등록하기 위해 NotificationManager 객체를 생성합니다.

PendingIntent intent = 
	PendingIntent.getActivity(NotificationBuilder.this, 0, new Intent(NotificationBuilder.this, NotificationMessage.class), 0);

여기에서는 Notification List에 표시되는 Notification 항목을 클릭하면 실행할 액티비티를 설정합니다. 여기에서는 NotificationMessage 액티비티를 지정해 주었습니다. PendngIntent는 나중에 Notification Panel에 표시된 항목을 클릭했을 때 액티비티를 호출하기 위해 필요합니다. 여기에서는 액티비티를 호출하기 위해 getActivity()를 사용하였지만, 서비스를 호출하거나 브로드캐스트 메시지를 보내는 것도 가능합니다. 

API
public static PendingIntent getActivity (Context context, int requestCode, Intent intent, int flags)

위의 속성들 (context, requestCode, intent, flags)를 갖는 액티비티를 호출하는 PendingIntent 객체를 생성합니다.

NotificationMessage 액티비티의 구현은 아래에서 보도록 하고, 다음 코드로 넘어가도록 하겠습니다.

String ticker = tickerText.getText().toString();
String title = contentTitle.getText().toString();
String text = contentText.getText().toString();
EditText 필드로부터 상태 표시줄에 표시될 텍스트인 ticker, Notification List에 표시될 제목 및 내용인 title 과 text를 받아옵니다.

// Create Notification Object
Notification notification = 
	new Notification(android.R.drawable.ic_input_add, ticker, System.currentTimeMillis());
Notification 객체를 생성합니다. 여기에서는 상태 표시줄에 표시될 아이콘, 텍스트 및 표시될 시각을 지정해줍니다. Notification이 표시될 시각에 System.currentTimeMillis() (현재 시간)을 넣어주므로 Notification이 Notification Manager에 등록되자 마자 상태 표시줄에 해당 Notification이 표시되게 됩니다.

notification.setLatestEventInfo(NotificationBuilder.this, title, text, intent);
Notification List에 표시될 항목을 설정합니다. 제목 및 내용, 클릭시 수행할 작업인 PendingIntent를 넣어줍니다.
위에서 지정한 Ticker Text 및 Notification List에 표시되는 제목 및 내용이 표시되는 위치는 아래와 같습니다.



nm.notify(1234, notification);

마지막으로, Notification Manager에 생성된 Notification을 등록합니다.
Notification 등록시에는 추후 Notification Manager를 통해 등록한 Notification 표시를 해제하기 위해 각 Notifiation의 고유 ID를 같이 등록해줍니다.

Notification을 생성하고 등록해주는 과정을 살펴보면 아래와 같습니다. 



다음은 Notification 항목을 클릭했을 때 표시되는 액티비티인 NotificationMessage의 코드입니다.

[NotificationMessage.java]
package com.androidhuman.example.NotificationBuilder;

import android.app.Activity;
import android.app.NotificationManager;
import android.os.Bundle;
import android.widget.TextView;

public class NotificationMessage extends Activity {

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    TextView tv = new TextView(this);
	    tv.setText("위의 Notification이 사라진 것을 확인하셨나요? :)");
	    setContentView(tv);
	    
	    NotificationManager nm = 
	    	(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
	    
	    // Cancel Notification
	    nm.cancel(1234);
	}

}

이 액티비티가 표시되면, Notification Manager의 cancel() 메소드를 호출하여 방금 표시되어 있던 Notification을 해제하게 됩니다. NotificationBuilder 액티비티와 동일하게 NotificationManager 서비스를 받아온 후, cancel()메소드에 아까 등록했던 Notification의 ID를 같이 넘겨주게 되면 해당 Notification이 해제, 즉 상태 표시줄 및 Notification List에서 사라지게 됩니다.

상태 표시줄에서 Notification이 사라진 것을 확인할 수 있습니다.



저작자 표시 비영리 변경 금지
신고

커니 유저 인터페이스/알림(Notification) , , , , ,

  1. 이전 댓글 더보기
  2. Blog Icon
    포베

    안녕하세요~
    예제대로 잘 따라해 봤는데요^^
    해당 방법대로 실행하면 잘 돼긴하는데.. 상태바에 아이콘이 남더라구요.
    아이콘을 숨기거나 지우는 방법은 없을까요??

  3. http://developer.android.com/reference/android/app/Notification.html#FLAG_AUTO_CANCEL 을 이용하시면 알림을 선택했을 때 바로 없어지도록 할 수 있습니다~~

  4. Blog Icon
    포베

    제가 궁금했던것은 Ongoing으로 계속 알림패널에는 유지시키고 아이콘만 노티바에 안보이게 하는방법 이었습니다~ㅎㅎ

  5. 그 방법은 없습니다 ㅎㅎ

  6. Blog Icon
    jjaestory

    노티를 정 to the 벅! 했습니다. 감사합니다.

  7. Blog Icon
    captinpack

    AVD에서는 잘 되지만 겔S에서 실행하면 등록되었다는 토스트는 보여지지만 실제로 알림이 등록되지 않습니다.
    무슨 문제일까요?

  8. 갤럭시S에서도 특별히 문제될 것 없을텐데요...
    저도 갤럭시S가 있어서 테스트 해 보았는데 특별한 문제는 없었습니다.

  9. Blog Icon
    89휴학생

    커니님 한 가지 질문이 있는데
    혹시 상태바 오른쪽 영역에 알림 아이콘 띄우는 방법이 있을까요?
    오른쪽 영역은 서비스 영역이라고 하던데..
    몇몇 어플들은 그 영역에 알림 아이콘이 뜨길래 질문 드립니다.

  10. 온스크린 키보드를 만들 때 해당 영역에 아이콘을 띄울 수 있는 방법이 있기는 한데, 다른 곳에서도 해당 부분에 띄울 수 있는지까지는 잘 모르겠습니다 ^^;

  11. Blog Icon
    idream

    아무리 읽어봐도 노티피케이션을 이해하기 힘듭니다.노티피케이션에 정의에대해서 말씀해주시면 안돼나요..;;

  12. 단순히 '알림' 메시지라 생각하시면 됩니다.
    윈도우에서도 작업 표시줄 우측에 풍선 팝업들이 표시되면서 '하드웨어 설치 중', 과 같이 이벤트가 발생하면 알려주는데, 안드로이드의 알림도 그와 동일한 역할을 한다 이해하면 되겠네요~

  13. Blog Icon
    21

    여지껏 봤던 안드로이드 강좌중에 가장 탁월합니다...
    질문이있는데....
    Notification이 표시될 시각을 사용자가 설정한 시간에 띄우려고해서
    타입이 long when 으로 입력한 시간을 세팅해야하는데
    long when의 타입에 대한 정보가 아무리 검색해도 안나와요ㅠㅠ...

    long when 타입을 현재시각이 아닌 입력받으려면 어떻게 해야할까요??....

  14. 지정한 시각에 알림이 뜨게 하려면 AlarmManager 등을 사용하여 현재로부터 일정 시간 후에 알림이 표시되도록 하는 방법을 사용하시면 됩니다. when은 알림이 표시될 때 옆에 같이 표시되는 '시각'만을 나타낼 뿐, 실제 알림이 표시되는 시각과는 관련이 없습니다.

  15. 좋은글 출처를 표시하고 블로그에 담아갑니다. ^^

  16. Blog Icon
    브라이언

    메시지를 여러줄로 나오게 하고 싶은데 옵티머스G는 \n 처리가 되서 두줄로 나오는 것 같은데요 겔럭시S3 에서는 한줄로 나오더라구요. 겔럭시 S3에서 메시지를 여러줄로 보이게 하려면 어떤 작업을 더 해주어야 할까요?

  17. \n을 입력하면 여러 줄로 나오는 것이 정상입니다. 제대로 나오지 않는다면 기기 문제라는건데, 이 부분은 딱히 해결할 방법이 없습니다 (..)

  18. Blog Icon
    최용석

    감사합니다

  19. Blog Icon
    초보자

    혹시 데이터베이스에 글이 추가되면 자동으로 알려주는 알림기능도 이 노티피케이션으로 가능한가요?
    싸이월드같이 새로운 글이 올라오면 알려주는 기능을 추가해주고 싶은데 어떤 방법을 써야하는지 잘모르겠네요..

  20. Blog Icon
    김상현

    좋은 자료 감사드립니다~! ㅎㅎㅎ

    궁금한게 잇어서 질문드립니다..ㅠㅠ

    혹시 이러한 노티를 자신이 아닌 다른 사람의 디바이스로 보낼수도 잇는건가요~~!??

  21. 다른 사람에게 알림을 전달하는 것은 이 부분과는 완전 별개의 항목입니다. 어떤 식의 구현을 말씀하시는 것인지 잘 모르겠지만, 서버에서 기기로 푸시를 보내면 이를 받아 단말기에서 알림을 띄우는 시나리오는 매우 자주 사용하고 있는 패턴입니다.

  22. Blog Icon
    noti

    노티바에 여러 어플을 정렬하고 해당 어플 클릭시 해당 어플을 실행 해주는 설정 은 어떻게 하나요 ㅠ?
    리스트뷰에 담아서 remote view로 뿌릴려고 했더니 리스트뷰는 안되더군요;

  23. 리스트뷰가 아닌 다른 뷰를 사용해야 할 것 같네요.
    RemoteView의 한계 내에서만 구현 가능하기에 스크롤 기능은 구현이 불가능합니다.

  24. Blog Icon
    데모버전

    정말 감사합니다~잘보고 갑니다ㅠㅠ
    잘되내요 정말!
    메니페스트에 추가 시켜주기만 하면 뜨내요!

  25. Blog Icon
    서희상

    감사합니다 정리잘해주셔가지고 해결햇내요 ㅎㅎ 필요한부분은 제가 붙여서 ㅎㅎ

  26. Blog Icon
    spock

    안드로이드 기본 기능인 메세지가 왔을 때 이를

    없애려면 cancel() 메소드를 쓸 때 그 아이디 값을 알아야 하는데

    이 아이디 값은 어떻게 알 수 잇을까요?

  27. Blog Icon

    비밀댓글입니다

  28. 다른 어플의 ticker text 값을 받아오는 방법 혹시 아시나요?

  29. Blog Icon
    이승희

    안녕하세요 반가워요

  30. Blog Icon
    맞짱섯다

    http://killer.96.it

    대 박 세 일 중 입니다