android notification及TaskStackBuilder

  app开发中,通知栏通知是比较常见的需求,这里有一个体验细节。弹出通知,用户下拉通知栏,点击后进入app中对应页面,看完后想返回上一页,于是点击了左上角或者右上角的返回按钮(一般来说应该都有),如果用户是从桌面点击通知进入app的,那么app栈内就没有对应的页面,返回上一页就不能通过常规的销毁当前页面来实现,这时就需要使用TaskStackBuilder了.

  TaskStackBuilder,我的理解就是一个栈构建器,在xml里面给activity1配置一个parentActivityName=activity2,那么通过TaskStackBuilder启动activity1时,系统会先把activity2压入栈,然后再启动activity1,这时如果销毁activity1,activity2就会变为栈顶页面呈现在用户面前。这样就模拟出了历史页面效果,体验要比用户点击返回直接回到桌面要好.

public class NotificationUtil {

    /**
     * 展示通知
     */
    public static void showNotifiation(Context context, String title, String content, int nid, PushReceiverModel pushModel) {
        StaticMethod.debugEMSG("发送通知到通知栏");
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.push)
                        .setContentTitle(title)
                        .setContentText(content);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        Intent resultIntent;
        if (StaticVariable.rid != null && !StaticVariable.rid.equals("")) {
            if (StaticVariable.rid.equals("3")||StaticVariable.rid.equals("5")) {
                if (pushModel.getMessageType().equals(StaticConstant.系统通知)) {
                    resultIntent = new Intent(context, XSJL_SysytemMsgActivity.class);
                    stackBuilder.addParentStack(XSJL_SysytemMsgActivity.class);
                }else{
                    resultIntent = new Intent(context, XSJL_MsgBoxActivity.class);
                    stackBuilder.addParentStack(XSJL_MsgBoxActivity.class);
                }
            } else if (StaticVariable.rid.equals("6")||StaticVariable.rid.equals("7")) {
                if (pushModel.getMessageType().equals(StaticConstant.微信对话)) {
                    resultIntent = new Intent(context, WeChat_2_Activity.class);
                    resultIntent.putExtra("cid", pushModel.getUid());
                    resultIntent.putExtra("title", pushModel.getName());
                    stackBuilder.addParentStack(WeChat_2_Activity.class);
                } else if (pushModel.getMessageType().equals(StaticConstant.销售新用户)) {
                    resultIntent = new Intent(context, GJXQ_1_Activity.class);
                    if (StaticMethod.isNotNull(pushModel.getUid())) {
                        resultIntent.putExtra("cid", pushModel.getUid());
                    } else {
                        resultIntent.putExtra("cid", pushModel.getAdvid());
                    }
                    stackBuilder.addParentStack(GJXQ_1_Activity.class);
                } else if (pushModel.getMessageType().equals(StaticConstant.系统通知)) {
                    resultIntent = new Intent(context, XSGW_SysytemMsgActivity.class);
                    stackBuilder.addParentStack(XSGW_SysytemMsgActivity.class);
                } else if (pushModel.getMessageType().equals(StaticConstant.抢客户)) {
                    resultIntent = new Intent(context, MainActivity.class);
                } else {
                    resultIntent = new Intent(context, XSGW_TaskNotifyActivity.class);
                    stackBuilder.addParentStack(XSGW_TaskNotifyActivity.class);
                }
            } else {
                resultIntent = new Intent(context, LaunchActivity.class);
            }
        } else {
            resultIntent = new Intent(context, LaunchActivity.class);
        }
        if (stackBuilder.getIntentCount() > 0) {
            stackBuilder.editIntentAt(0).putExtra("aid", StaticVariable.aid);
            stackBuilder.editIntentAt(0).putExtra("uid", StaticVariable.uid);
        }

        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FLAG_ACTIVITY_NEW_TASK);

        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notification = mBuilder.build();
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        notification.defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE;
        long[] vibrate = {0, 100, 200, 300};
        notification.vibrate = vibrate;

        mNotificationManager.notify(nid, notification);
    }
}

  里面有一个比较容易搞混的地方,就是parentActivity。这里用XSJL_SysytemMsgActivity来举例.

  下面就是XSJL_SystemMsgActivity在AndroidManifest.xml里面的声明

<activity
            android:name=".page.base.xsjl.activity.XSJL_SysytemMsgActivity"
            android:parentActivityName=".page.base.xsjl.activity.MainActivity" />

  parentActivityName指定的就是当XSJL_SystemMsgActivity被销毁时,需要显示的历史页面.

  在代码里面这么写

resultIntent = new Intent(context, XSJL_SysytemMsgActivity.class);
//resultIntent.putExtra("cid", pushModel.getUid());给XSJL_SysytemMsgActivity页面传递启动参数
//stackBuilder.editIntentAt(0).putExtra("aid", StaticVariable.aid);给parent页面传递启动参数,
stackBuilder.addParentStack(XSJL_SysytemMsgActivity.class);

  

  关键部分就这些,剩下的就是照着官网例子写的。

stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FLAG_ACTIVITY_NEW_TASK);

获取到了PendingIntent,历史页面这一块就结束了,剩下的就是通知部分,没什么难点,抄代码改参数就ok了 
时间: 2024-10-15 22:57:22

android notification及TaskStackBuilder的相关文章

Android Notification通知详解

Android Notification通知详解 Notification: (一).简介: 显示在手机状态栏的通知.Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification. Android3.0增加了Notification.Builder类,该类可以轻松地创建Notification对象. (二).Notification.Builder类中提供的方法: builder.setAutoCancel();

Android Notification通知详细解释

Android Notification通知具体解释 Notification: (一).简单介绍: 显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification. Android3.0添加了Notification.Builder类.该类能够轻松地创建Notification对象. (二).Notification.Builder类中提供的方法: builder.setAutoCance

android Notification和NotificationManager的使用

Notification和NotificationManager 1.Broadcast Receiver组件没有提供可视化的界面来显示广播信息.这里我们可以使用Notification和NotificationManager来实现可视化的信息显示.通过使用它们我们可以显示广播信息的内容,图标 以及震动等信息. 2.使用Notification和NotificationManager也比较简单,一般获得系统级的服务NotificationManager,然后实例化Notification,设置其

android notification 传值关键

android notification 传值关键在 onNewIntent方法里获取 @Override protected void onCreate(Bundle savedInstanceState) { processIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { processIntent(intent); }; private void processIntent(Intent

Android NOtification 使用(震动 闪屏 铃声)

一. Notification 简介 在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以确认保存成功. * 如果应用程序在后台运行,需要用户的注意,应用程序应该创建一个通知,允许用户在他或她的回应提供便利 * 如果应用程序正在执行的工作,用户必须等待(如装载文件),应用程序应该显示进度或等待提醒. 针对这些情况, android 都提供了不同的提醒方式.主要包括下面几种: 1.Toas

3、android notification 详细用法

在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以确认保存成功. * 如果应用程序在后台运行,需要用户的注意,应用程序应该创建一个通知,允许用户在他或她的回应提供便利 * 如果应用程序正在执行的工作,用户必须等待(如装载文件),应用程序应该显示进度或等待提醒. 针对这些情况, android 都提供了不同的提醒方式.主要包括下面几种: 1. Toast Notification 是指出

Android Notification状态栏通知

没有添加额外的震动及声音效果,这里直接实现了通知的功能,看效果吧: MainActivity.java package com.example.notification; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Notification; import android.app.NotificationManag

android Notification 的使用(锁定通知栏)

最近一直在研究 android ,并一边研究一边做应用.其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题.经过研究实现了其功能,现把 Notification 的使用总结如下: Notification 的使用需要导入 3 个类 1 2 3 import android.app.PendingIntent; import android.app.NotificationManager; import android.app

android Notification分析——你可能遇到的各种问题

通知的使用网上有各种总结,csdn上也有很多总结非常到位,在此就不做重复的总结了,需要的同学可以自行搜索或者参考下面给出的链接.开始学习的时候认真的读了一些,现在功能开发完毕,把自己最近遇到的一些问题和心得分享给大家. 一.很难逃避de兼容问题 1.直接new Notification()这种方式已经过时,因此自己也没有去细究这种方式,直接使用的是new NotificationCompat.Builder(context).build()(这个在support v4包中,下面的内容全是以这种方