본문 바로가기

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

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

강좌 작성환경
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이 사라진 것을 확인할 수 있습니다.