美文网首页安卓知识
Notification使用

Notification使用

作者: Daemon1993 | 来源:发表于2015-12-18 11:31 被阅读935次

    Notification一些基本用法 根据四个需求来

    • 普通的查看 跳转页面

    • 查看后返回某个固定页面的意图
      我们自己的APP的通知 查看之后回到我们APP的首页  或者联系几页返回

    • 新建一个Task 用来查看 返回上一个最近任务栈
      查看之后 回到之前正在进行的任务 效果上感觉这个和普通的没什么差别 这个就是新建一个task专门来处理查看通知的操作

    • 自定义View的Notification

    notification对象的构建

    低版本的就不说了 这里用Builder构造

    //notification的管理类
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    builder = new NotificationCompat.Builder(this);
    builder.setContentInfo("info");
    builder.setContentTitle("title");
    builder.setContentText("下载进度");
    builder.setSmallIcon(R.mipmap.collention);
    
    //构建 发出通知
    Notification notification = builder.build();
    notificationManager.notify(0, notification);
    

    1 普通的跳转 就是在构建notification对象的时候塞入一个Intent 这里叫PendingIntent 延迟意图

    Intent resultIntent1 = new Intent(this, Main2Activity.class);
    //这个用于下面的 在发送通知时判断是否存在 因为设置的是PendingIntent.FLAG_UPDATE_CURRENT   
    int requestCode1 = (int) SystemClock.uptimeMillis();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode1, resultIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
                changeIntent(pendingIntent);
    
    • PendingIntent.FLAG_UPDATE_CURRENT**这个参数一般有四种选择分别是:
      FLAG_CANCEL_CURRENT:如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。 FLAG_NO_CREATE:如果前一个PendingIntent已经不存在了,将不再构建它。
      FLAG_ONE_SHOT:表明这里构建的PendingIntent只能使用一次。
      FLAG_UPDATE_CURRENT:如果构建的PendingIntent已经存在,那么 系统将不会重复创建,只是把之前不同的传值替换掉。(所以这里如果值不变 是不是有变化的 以致于会出现一些问题 通常做法就是在构建PendingIntent的时候传入不一样的requestCode来改变 更新PendingIntent 一般都是用这个)

    使用代码如下 效果如图

    Intent resultIntent1 = new Intent(this, Main4Activity.class);
    int requestCode1 = (int) SystemClock.uptimeMillis();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode1, resultIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pendingIntent);
    Notification notification = builder.build();
    notificationManager.notify(0, notification);
    
    发现 在当前页面查看通知后返回还是在当前页面 退出程序之后 在主菜单查看通知 返回的是主菜单
    GIF.gif

    2 回退到固定的页面 这里做一些配置
    清单文件的配置 指明parentActivity 和TaskStackBuilder

    <activity
            android:name=".Main2Activity"
            android:excludeFromRecents="true"
            android:launchMode="singleTask"
            //指定当前Activity的返回的上一个页面
            android:parentActivityName=".MainActivity"
            android:taskAffinity="" >
    
            //兼容低版本
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        //配置同上
        <activity
            android:name=".Main3Activity"
            android:parentActivityName=".Main2Activity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".Main2Activity" />
        </activity>
    
    
    Intent resultIntent = new Intent(this, Main3Activity.class);
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
     stackBuilder.addParentStack(Main3Activity.class);
     stackBuilder.addNextIntent(resultIntent);
     int requestCode = (int) SystemClock.uptimeMillis();
     PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(requestCode,   PendingIntent.FLAG_UPDATE_CURRENT);
     builder.setContentIntent(resultPendingIntent );
    Notification notification = builder.build();
    notificationManager.notify(0, notification);
    

    效果图

    只要查看通知 返回顺序都是 指定要其parentActivity的页面

    GIF.gif

    3:新开任务栈 的方式
    效果就不看了 看看如何配置吧

          <activity
            android:name=".Main2Activity"
            //清除最近列表的记录
            android:excludeFromRecents="true"
            //新开任务栈 启动模式
            android:launchMode="singleTask"
            android:parentActivityName=".MainActivity"
            //这个要写 不然会有问题 不然没效果  我不太清楚这个有什么用 后续在了解
            android:taskAffinity="" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
    
    
      Intent notifyIntent = new Intent(this, Main2Activity.class);
      notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK);
      int requestCode2 = (int) SystemClock.uptimeMillis();
      PendingIntent pendIntent = PendingIntent.getActivity(this, requestCode2,
                        notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
      builder.setContentIntent(pendIntent );
      Notification notification = builder.build();
      notificationManager.notify(0, notification);
    

    4 自定义通知界面

         NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this);
                RemoteViews remoteView = new RemoteViews(getPackageName(),R.layout.remote);
                remoteView.setTextViewText(R.id.text, "DaemonLiu");
    
                remoteView.setImageViewResource(R.id.image, R.mipmap.collention);
    
                builder1.setSmallIcon(R.mipmap.collention);
                builder1.setContent(remoteView);
                Intent resultIntent4 = new Intent(this, Main4Activity.class);
                int requestCode4 = (int) SystemClock.uptimeMillis();
                PendingIntent pendingIntent4 = PendingIntent.getActivity(this, requestCode4, resultIntent4, PendingIntent.FLAG_UPDATE_CURRENT);
    
                remoteView.setOnClickPendingIntent(R.id.image,pendingIntent4);
    
                builder.setContentIntent(pendingIntent4);
                Notification notification = builder1.build();
                notificationManager.notify(1, notification);
    

    效果图 自定义通知页面 然后再image上面附加事件 点击后跳转

    GIF.gif

    在关于进度条的设置 上面第一张图有进度条 代码如下

    new Thread(new Runnable() {
            @Override
            public void run() {
                int incr;
                for (incr = 0; incr <= 100; incr += 5) {
                    // mBuilder.setProgress(100, incr, false);
                    builder.setProgress(100, incr, false);
                    builder.setContentText("下载进度"+incr+"%");
                    notificationManager.notify(0, builder.build());
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                    }
                }
                builder.setContentText("Download complete").setProgress(0, 0,
                        false);
                notificationManager.notify(0, builder.build());
            }
        }
                // Starts the thread by calling the run() method in its Runnable
        ).start();
    

    这里只是简单记录下notification的简单的使用 关于notification的更多详细介绍 4.0之后的 三种style形式等等 贴上一个地址 觉得写得挺详细的
    http://blog.csdn.net/xy_nyle/article/details/19853591

    相关文章

      网友评论

      本文标题:Notification使用

      本文链接:https://www.haomeiwen.com/subject/scgxhttx.html