android 双击退出,Notitfcation 通知

一、双击退出

原理:
当按下BACK键时,会被onKeyDown捕获
判断是BACK键,则执行exit方法
判断用户两次按键的时间差是否在一个预期值之内
是的话直接直接退出,不是的话提示用户再按一次后退键退出

在这里插入图片描述

    //设定一个long类型的数据
    long exitTime;
    //重新onkeyDown方法
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判断用户是否点击返回键
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            //判断用户两次按钮的世界是否在一个预期值之内,是退出,不是提示
            if (System.currentTimeMillis() - exitTime > 2000) {
                //提示语
                Toast.makeText(this, "再次点击退出", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
                //返回true时 表示已经处理该事件
                return true;
            }
        } else {
            //结束当前Activity
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }

二、 Notitfcation 通知

1,介绍

2,基本用法

①普通通知

普通通知

创建一个NotificationManager来对通知进行管理
通过调用Context.getSystemService(NOTIFICATION_SERVICE)方法获取到NotificationManager实例对象
创建通知构建者 设置属性 然后发送通知

//创建NotificationManager 通知管理器
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //创建通知构造者
        Notification.Builder builder = new Notification.Builder(this);
        //设置属性   setSamllIcon该属性必须设置
        builder.setSmallIcon(R.mipmap.ic_launcher); //必须设置
        builder.setContentTitle("我是标题");
        builder.setContentText("我是内容");
        //创建对象.发送的就是这个对象
        Notification build = builder.build();
        //发送通知 参数:通知的id 通知对象
        manager.notify(1, build);

②进度条通知

这里用进度条模拟下载安装过程

在这里插入图片描述

//进度条通知
    private void Notitfcation2() {
        //创建NotificationManager 通知管理器
        final NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        //创建构造者
        final Notification.Builder builder = new Notification.Builder(this);
        //设置属性   setSamllIcon该属性必须设置
        builder.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
        builder.setContentTitle("我是标题");
        //计时器
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            int progress;
            @Override
            public void run() {
                //模拟下载过程
                builder.setContentText("正在下载,当前进度" + progress);
                //设置进度条  参数:最大值 当前进度 是否模糊
                //builder.setProgress(100,50,true);
                builder.setProgress(100, progress, false);//确定的进度条
                progress += 20;
                manager.notify(6, builder.build());
                if (progress == 100) {
                    //模拟安装过程
                    builder.setContentText("正在安装");
                    builder.setProgress(0, 0, true);//安装模糊
                    manager.notify(6, builder.build());
                    try {
                        Thread.sleep(3000);//模拟安装过程
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //安装完成取消顶部通知 停止计时器
                    manager.cancel(6);
                    timer.cancel();
                }
            }
        }, 0, 1000);
    }

③交互通知(点击跳转页面)

在这里插入图片描述

//交互通知 (跳转页面)
    private void Notitfcation3() {
        //构造管理者
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //意图对象
        Intent intent = new Intent(this, Main2Activity.class);
        //当点击通知栏的信息时,才发送intent上下文 请求码,多个请求码不一样即可 intent flags 可写0;
        PendingIntent activity = PendingIntent.getActivity(this, 0, intent,0);
        Notification.Builder builder = new Notification.Builder(this);
        //设置属性
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentTitle("我是标题");
        builder.setContentText("我是内容");
        builder.setAutoCancel(true); //点击消息通知取消
        //设置意图对象
        builder.setContentIntent(activity);
        Notification notification = builder.build();
        //发送通知
        manager.notify(1,notification);
    }

3,属性

属性意思
setAutoCancel(boolean boolean)设置点击通知后自动清除通知
setContent(RemoteView view)设置自定义通知
setContentTitle(String string)设置通知的标题内容
setContentText(String string)设置通知的正文内容
setContentIntent(PendingIntent intent)设置点击通知后的跳转意图
setWhen(long when)设置通知被创建的时间
setSmallIcon(int icon)设置通知的小图标
setLargeIcon(Bitmap icon)设置通知的大图标(下拉系统状态栏时就能看见)
setPriority(int pri)设置通知的重要程度
setStyle(Style style)设置通知的样式(设置长文字、大图片等)
setVisibility(int defaults)设置默认
setLight(int argb, int onMs, int offMs)设置呼吸闪烁效果
setSound(Uri sound)设置通知音效
setVibrate(long[] pattern)设置震动效果,数组包含手机静止时长和震动时长

4,PendingIntent

说明

PendingIntent 是一种特殊的 Intent ,字面意思可以解释为延迟的 Intent ,用于在某个事件结束后执行特定的 Action 。从上面带 Action 的通知也能验证这一点,当用户点击通知时,才会执行。
PendingIntent 是 Android 系统管理并持有的用于描述和获取原始数据的对象的标志(引用)。也就是说,即便创建该PendingIntent对象的进程被杀死了,这个PendingItent对象在其他进程中还是可用的。
日常使用中的短信、闹钟等都用到了 PendingIntent

三、自定义通知

其实就是加载一个布局. 加载布局用到了 RemoteViews 代码中有详细注释.
RemoteViews设置的布局文件并不支持所有的View,以下是RemoteViews所支持的View:
布局
FrameLayout,LinearLayout,RelativeLayout,GridLayout
组件
Button,ImageView,ImageButton,TextView,ProgressBar,ListView,GridView,StackView,ViewStub,AdapterViewFlipper,ViewFlipper,AnalogClock,Chronometer

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/img"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/tv1"
        android:text="标题文本"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/tv2"
        android:text="内容文本"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
//自定义通知
    private void Notitfcation4() {
        //构造管理者
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //创建构造者
        Notification.Builder builder = new Notification.Builder(this);
        //设置普通通知属性(会被替换掉)
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentText("内容");
        builder.setContentTitle("头部");
        //RemoteViews是可以在别的进程(系统进程)中显示的View,并且提供了一组跨进程更新它界面的操作
        //所在包名  布局id
        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification);
        //设置属性
        //都是两个参数,第一个参数相当于findViewById,第二个是设置一个值.
        remoteViews.setTextViewText(R.id.tv1, "简简单单自定义");
        remoteViews.setTextViewText(R.id.tv2, "通知也可以自定义");
        remoteViews.setImageViewResource(R.id.img, R.mipmap.ic_launcher);
        //创建对象.发送的就是这个对象
        builder.setCustomContentView(remoteViews);
        Notification build = builder.build();
        //发送通知 参数:通知的id 通知对象
        manager.notify(1, build);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值