Android 使用Notification创建推送通知

来源:互联网 发布:鞋子淘宝试用报告范文 编辑:程序博客网 时间:2024/04/30 19:09

效果图:



创建方法

首先要获取一个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());}



0 0
原创粉丝点击