Android 使用Notification创建推送通知

本文详细介绍了Android系统中Notification的创建方法及常用设置选项,包括如何设置图标、文字、提示声音等,并提供了一个完整的示例代码,展示了如何发送带有自定义内容的通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:



创建方法

首先要获取一个NotificationManager管理对象

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

NotificationManager 是一个系统 Service,所以需要通过 getSystemService() 方法来获取

传入的Context.NOTIFICATION_SERVICE代表状态栏服务


再来获取一个具体的状态栏通知对象Notification,设置图片,文字、提示声音、震动参数等

Notification.Builder builder = new Notification.Builder(context);

常用方法


public Builder setSmallIcon(@DrawableRes int icon)
设置顶部状态栏(未被下拉)中的小图标

在有些机子上显示的小图标只显示了一部分,并不会自适应大小,可以把图片的大小改成32*32的小图标,并放在hdpi文件夹下


public Builder setTicker(CharSequence tickerText)
设置状态栏(未被下拉)的提示文字


public Builder setWhen(long when)

设置通知面板中显示的时间,通常传一个系统当前的时间戳进去


public Builder setLargeIcon(Bitmap b)
设置通知面板左边的大图标


public Builder setContentTitle(CharSequence title)
设置通知面板中第一栏标题的显示文本


public Builder setContentText(CharSequence text)
设置通知面板中第二栏内容的显示文本


public Builder setAutoCancel(boolean autoCancel)
设置为true时,用户点击后关闭,为false时点击不关闭,默认为false


public Builder setDefaults(int defaults)
设置系统默认的显示参数,在Notification中,默认的系统样式已经定义成参量类型了,我们只要使用就好

Notification.DEFAULT_ALL:铃声、闪光、震动均系统默认

Notification.DEFAULT_SOUND:系统默认铃声

Notification.DEFAULT_LIGHTS:系统默认闪光灯

Notification.DEFAULT_VIBRATE:系统默认震动


public Builder setOngoing(boolean ongoing)
设置是否需要把Notification放置在“正在运行”的栏目

常见问题

有时候我们发送推送时,新的推送会覆盖旧的推送

原因是由于调用NotificationManger.notify()方法时,id都是同一个导致的

public void notify(int id, Notification notification)

解决方法,要让每次调用的id都不相同,可以使用Notification对象的hashCode()值作为id参数,也可以换其它的,只要让每次发送的id不同就行

具体实现代码

/**
 * NotificationDemo页面
 * Created by zhuwentao on 2016-08-12.
 */
public class NotificationActivity extends AppCompatActivity {

    /** 发送通知 */
    private Button mSendBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notification_main);
        mSendBtn = (Button) findViewById(R.id.btn_notification_send);

        mSendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendNotification();
            }
        });
    }

    /**
     * 发送通知
     */
    public void sendNotification() {
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder builder = new Notification.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher); // 这里使用的系统默认图标,可自行更换
        builder.setTicker("您有一条新消息!");
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
        builder.setContentTitle("这是第一行标题栏");
        builder.setContentText("这里是第二行,用来显示主要内容");
        builder.setAutoCancel(true);
        
        // 点击后要执行的操作,打开MainActivity
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntents = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
        builder.setContentIntent(pendingIntents);
        
        // 启动Notification,getNotification()方法已经过时了,不推荐使用,使用build()方法替代
        notificationManager.notify(1, builder.build());
    }

}

使用PendingIntent如何启动多个Intent意图

一般我们只需要启动一个意图就好,使用PendingIntent.getActivity()方法是没问题的

但有时需求要我们启动一个Activity后,按返回键回到首页

这个时候就可以使用PendingIntent方法里面的getActivities()方法

public static PendingIntent getActivities(Context context, int requestCode,
        @NonNull Intent[] intents, @Flags int flags)
里面可以传入一个Intent数组

例如:

Intent intentOne = new Intent(context, OneActivity.class);
Intent intentTwo = new Intent(context, TwoActivity.class);
Intent[] intents = new Intent[2];
intents[0] = intentOne;
intents[1] = intentTwo;
在intents数组中的最后一个界面将会成为第一个被启动的界面,也就上例中intentTwo会成为点击后第一个启动的界面,在intentTwo界面按返回键再到intentOne界面

这里需要注意一个问题,Activity的启动模式问题

如果当前App是处在打开的状态,这时用户接到通知并点击,启动了新的页面,再按返回键就会出问题了,会出现重复加载之前页面

更改一下Intent的启动模式可以解决这样的问题,通过setFlags设置所有的Intent的启动模式为:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

例如:

/**
* 发送通知
*/
public void sendNotification() {
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE );
    Notification.Builder builder = new Notification.Builder( this);
    builder.setSmallIcon(R.mipmap. ic_launcher); // 这里使用的系统默认图标,可自行更换
    builder.setTicker("您有一条新消息!");
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap. ic_launcher));
    builder.setContentTitle("这是第一行标题栏");
    builder.setContentText("这里是第二行,用来显示主要内容");
    builder.setAutoCancel(true );

    // 点击后要执行的操作,启动多个意图
    Intent intentOne = new Intent(this, OneActivity.class);
    intentOne.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
    Intent intentTwo = new Intent(this, TwoActivity.class);
    intentTwo.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
    Intent[] intents = new Intent[2];
    intents[0] = intentOne;
    intents[1] = intentTwo;

    PendingIntent pendingIntents = PendingIntent.getActivities(this, 0, intents, PendingIntent.FLAG_ONE_SHOT);
    builder.setContentIntent(pendingIntents);

    // 启动 Notification
    notificationManager.notify(1, builder.getNotification());
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值