Notification.Builder를 정확히 사용하는 방법


100

noficitations (notification.setLatestEventInfo ())에 더 이상 사용되지 않는 메서드를 사용하고 있음을 발견했습니다.

Notification.Builder를 사용하라는 메시지가 표시됩니다.

  • 어떻게 사용하나요?

새 인스턴스를 만들려고하면 다음과 같은 메시지가 표시됩니다.

Notification.Builder cannot be resolved to a type

내가 눈치가 API 레벨 11에서 작업 (안드로이드 3.0).
mobiledev Alex

답변:


86

이것은 API 11에 있으므로 3.0 이전 버전으로 개발하는 경우 이전 API를 계속 사용해야합니다.

업데이트 : NotificationCompat.Builder 클래스가 지원 패키지에 추가되었으므로이를 사용하여 API 레벨 v4 이상을 지원할 수 있습니다.

http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html


감사. 왜 기능 페이지 자체에 언급하지 않는지 궁금합니다
Saariko

15
예 : 지원 중단 경고는 제 생각에는 조금 시기상조이지만 제가 무엇을 알고 있는지 알고 있습니다.
Femi

152

Notification.Builder API 11 또는 NotificationCompat.Builder API 1

이것은 사용 예입니다.

Intent notificationIntent = new Intent(ctx, YourClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
        YOUR_PI_REQ_CODE, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);

NotificationManager nm = (NotificationManager) ctx
        .getSystemService(Context.NOTIFICATION_SERVICE);

Resources res = ctx.getResources();
Notification.Builder builder = new Notification.Builder(ctx);

builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.some_img)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.some_big_img))
            .setTicker(res.getString(R.string.your_ticker))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.your_notif_title))
            .setContentText(res.getString(R.string.your_notif_text));
Notification n = builder.build();

nm.notify(YOUR_NOTIF_ID, n);

13
v4 지원 패키지에이를 수행하는 기술이 있습니다. NotificationCompat.Builder
stanlick

6
누군가가 Google에 Notification.Builder문서 페이지 에 심각한 오타가 있다고 말해야한다고 생각 합니다. 나는 그들이하는 말을하고 있었지만 말이되지 않았습니다. 나는 여기에 와서 그것이 다르다는 것을 봅니다. 문서에있는 실수를 알게 되었기 때문에 귀하의 답변에 감사드립니다.
Andy

5
문서 builder.getNotification()는 더 이상 사용되지 않는다고 말합니다 . 그것은 당신이 사용해야 말한다 builder.build().
mneri

26
NotificationBuilder.build ()에는 API 레벨 16 이상이 필요합니다. API 레벨 11과 15 사이의 모든 것은 NotificationBuilder.getNotification ()을 사용해야합니다.
Camille Sévigny

4
@MrTristan : 문서 작성로서 setSmallIcon(), setContentTitle()setContentText()최소 요구 사항은 다음과 같습니다.
caw

70

여기에 선택된 답변 외에도 Source TricksNotificationCompat.Builder클래스에 대한 샘플 코드가 있습니다 .

// Add app running notification  

    private void addNotification() {



    NotificationCompat.Builder builder =  
            new NotificationCompat.Builder(this)  
            .setSmallIcon(R.drawable.ic_launcher)  
            .setContentTitle("Notifications Example")  
            .setContentText("This is a test notification");  

    Intent notificationIntent = new Intent(this, MainActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);  
    builder.setContentIntent(contentIntent);  

    // Add as notification  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.notify(FM_NOTIFICATION_ID, builder.build());  
}  

// Remove notification  
private void removeNotification() {  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.cancel(FM_NOTIFICATION_ID);  
}  

5
실제로 작동했던 새로운 Compat 빌더를 사용하는 첫 번째 코드. 잘 했어!
James MV

1
저도 잘했습니다. 두 가지 참고 : 1) "ic_launcher"에 대한 32x32 아이콘을 만들어야합니다. 투명한 배경에 흰색 그리기 2) int에 대해 임의의 숫자를 정의해야합니다. FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8

1
당신이 너무 많이, 내 문제가 있었다 감사 : 내가 통지 2 시간에 클릭하면 이전 조각이 열려 있었고,이 라인 "PendingIntent.FLAG_UPDATE_CURRENT은"내 문제를 해결하고, 만들어 내 하루
Shruti

4

알림 빌더는 Android API 레벨 11 이상 (Android 3.0 이상)에만 적용됩니다.

따라서 Honeycomb 태블릿을 대상으로하지 않는 경우 알림 작성기를 사용하지 말고 다음 예제 와 같은 이전 알림 생성 방법을 따라야 합니다.


4
호환성 라이브러리를 사용할 수 있으므로 API 4 이상에서 사용할 수 있습니다.
Leandros

3

android-N 업데이트 (2016 년 3 월)

자세한 내용은 알림 업데이트 링크를 참조하십시오.

  • 직접 회신
  • 번들 알림
  • 사용자 정의보기

Android N을 사용하면 유사한 알림을 번들로 묶어 단일 알림으로 표시 할 수도 있습니다. 이를 가능하게하기 위해 Android N은 기존 NotificationCompat.Builder.setGroup()방법을 사용합니다 . 사용자는 각 알림을 확장하고 알림 창에서 개별적으로 각 알림에 대해 응답 및 해제와 같은 작업을 수행 할 수 있습니다.

이것은 NotificationCompat를 사용하여 알림을 보내는 간단한 서비스를 보여주는 기존 샘플입니다. 사용자가 읽지 않은 각 대화는 고유 한 알림으로 전송됩니다.

이 샘플은 Android N에서 사용할 수있는 새로운 알림 기능을 활용하도록 업데이트되었습니다.

샘플 코드 .


안녕하세요, downloader_library를 사용할 때 Android 6.0에서이 방법을 사용하는 방법을 알려 주시겠습니까? Eclipse SDK-25.1.7에 있습니다 || ADT 23.0.X 슬프게 || Google APK 확장 라이브러리 및 라이선스 라이브러리 모두 1.0
mfaisalhyder

2

알림을 빌드하는 데 문제가있었습니다 (Android 4.0 이상용으로 만 개발). 이 링크 는 내가 뭘 잘못하고 있는지 정확히 보여주고 다음과 같이 말합니다.

Required notification contents

A Notification object must contain the following:

A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()

기본적으로 나는 이것들 중 하나를 놓치고 있었다. 이 문제를 해결하기위한 기초로서, 최소한이 모든 것이 있는지 확인하십시오. 바라건대 이것은 다른 사람의 두통을 덜어 줄 것입니다.


따라서 "나중에 아이콘을 찾을 수 있습니다"라고 생각하면 알림을받을 수 없습니다. 이것에 대해 감사합니다;)
Nanne

1

누구에게나 도움이되는 경우를 대비하여 ... 새로운 오래된 API에 대해 테스트 할 때 지원 패키지를 사용하여 알림을 설정하는 데 많은 문제가있었습니다. 나는 그들이 최신 장치에서 작동하도록 할 수 있었지만 이전 장치에서 오류 테스트를 받게되었습니다. 마침내 나를 위해 일하게 된 것은 알림 기능과 관련된 모든 가져 오기를 삭제하는 것입니다. 특히 NotificationCompat 및 TaskStackBuilder. 처음에 내 코드를 설정하는 동안 지원 패키지가 아닌 최신 빌드에서 추가 된 가져 오기를 수행하는 것 같습니다. 그런 다음 나중에 이클립스에서 이러한 항목을 구현하려고 할 때 다시 가져 오라는 메시지가 표시되지 않았습니다. 이해가 되길 바라며 다른 사람에게 도움이되기를 바랍니다. :)


1

API 8에서도 작동합니다.이 코드를 사용할 수 있습니다.

 Notification n = 
   new Notification(R.drawable.yourownpicturehere, getString(R.string.noticeMe), 
System.currentTimeMillis());

PendingIntent i=PendingIntent.getActivity(this, 0,
             new Intent(this, NotifyActivity.class),
                               0);
n.setLatestEventInfo(getApplicationContext(), getString(R.string.title), getString(R.string.message), i);
n.number=++count;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.flags |= Notification.DEFAULT_SOUND;
n.flags |= Notification.DEFAULT_VIBRATE;
n.ledARGB = 0xff0000ff;
n.flags |= Notification.FLAG_SHOW_LIGHTS;

// Now invoke the Notification Service
String notifService = Context.NOTIFICATION_SERVICE;
NotificationManager mgr = 
   (NotificationManager) getSystemService(notifService);
mgr.notify(NOTIFICATION_ID, n);

아니면 내가 훌륭한 수행하는 것이 좋습니다 튜토리얼 이 약을


1

나는 사용했다

Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());

0
          // This is a working Notification
       private static final int NotificID=01;
   b= (Button) findViewById(R.id.btn);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Notification notification=new       Notification.Builder(MainActivity.this)
                    .setContentTitle("Notification Title")
                    .setContentText("Notification Description")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .build();
            NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            notification.flags |=Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(NotificID,notification);


        }
    });
}

0

자체 포함 된 예

이 답변 과 동일한 기술 이지만 :

  • 자체 포함 : 복사 붙여 넣기 및 컴파일 및 실행
  • 원하는만큼 알림을 생성하고 의도 및 알림 ID로 재생할 수있는 버튼

출처:

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Button button = new Button(this);
        button.setText("click me");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Notification notification = new Notification.Builder(Main.this)
                        /* Make app open when you click on the notification. */
                        .setContentIntent(PendingIntent.getActivity(
                                Main.this,
                                Main.this.i,
                                new Intent(Main.this, Main.class),
                                PendingIntent.FLAG_CANCEL_CURRENT))
                        .setContentTitle("title")
                        .setAutoCancel(true)
                        .setContentText(String.format("id = %d", Main.this.i))
                        // Starting on Android 5, only the alpha channel of the image matters.
                        // https://stackoverflow.com/a/35278871/895245
                        // `android.R.drawable` resources all seem suitable.
                        .setSmallIcon(android.R.drawable.star_on)
                        // Color of the background on which the alpha image wil drawn white.
                        .setColor(Color.RED)
                        .build();
                final NotificationManager notificationManager =
                        (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Main.this.i, notification);
                // If the same ID were used twice, the second notification would replace the first one. 
                //notificationManager.notify(0, notification);
                Main.this.i++;
            }
        });
        this.setContentView(button);
    }
}

Android 22에서 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.