Android——通知的基本用法

通知(Notification)是 Android系统中比较有特色的一个功能,当某个应用程序希望向 用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一 条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详 细内容。

创建通知的详细步骤:

  • 需要一个 NotificationManager来对通知进行管理,可以调用 Context的 getSystemService()方法获取到。getSystemService()方法接收一个字符串参数用于确定获取系 统的哪个服务,这里我们传入 Context.NOTIFICATION_SERVICE 即可。
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
  • 接下来需要使用一个Builder构造器来创建Notification对象。使用support库中提供的兼容API。support-v4库中提供了一个NotificationCompat类,使用这个类的构造器来创建Notification对象,就可以保证我们的程序在所有Android系统版本上都能正常工作。
 Notification notification=new NotificationCompat.Builder(this).build();

我们可以在最终的build()方法之前连缀任意多的设置方法来创建一个丰富的Notification对象

 Notification notification=new NotificationCompat.Builder(this)
                        .setContentTitle("This is content title")//指定通知的标题内容
                        .setContentText("This is content text")//指定通知的正文内容
                        .setWhen(System.currentTimeMillis())//指定通知被创建的时间
                        .setSmallIcon(R.mipmap.ic_launcher)//设置通知的小图标,注意只能用纯alpha图层进行设置,小图标会显示在系统状态栏上,就是在最上面小通知栏的图标
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//设置通知的大图标,当下拉系统状态栏时,就可以看到设置的大图标
                        .setContentIntent(pi)//点击通知时开启一个新活动
                        .setAutoCancel(true)//对通知进行取消
                        .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/luna.ogg")))//允许播放音频
                        .setVibrate(new long[]{0,1000,1000,1000})//振动毫秒为单位。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0的值表示手机静止的时长,下标为 1的值表示手机振动的时长,下标为 2的值又表示手机静止的时长,以此类推。
                        .setLights(Color.GREEN,1000,1000)//设置手机前的LED灯,第一个参数是颜色,第二个是亮起时长,第三个是暗区时长
                        //如果不想那么多繁琐的设置,可以直接使用通知的默认效果
                        //.setDefaults(NotificationCompat.DEFAULT_ALL)
                        .build();
  • 最后调用NotificationManager的notify()方法就可以让通知显示出来。notify()方法接受两个参数,第一个参数是id,要保证每个通知的指定id都是不同的,第二个参数是Notification对象,这里将我们刚刚创建好的Notification对象传入即可。
manager.notify(1,notification);

创建好通知后,我们还要实现通知添加点击效果

涉及一个新的概念——PendingIntent
PendingIntent从名字上看起来就和 Intent有些类似,它们之间也确实存在着不少共同点。 比如它们都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。 不同的是,Intent更加倾向于去立即执行某个动作,而 PendingIntent更加倾向于在某个合适 的时机去执行某个动作。所以,也可以把 PendingIntent简单地理解为延迟执行的 Intent。 PendingIntent的用法同样很简单,它主要提供了几个静态方法用于获取 PendingIntent的 实例,可以根据需求来选择是使用 getActivity()方法、getBroadcast()方法、还是 getService() 方法。这几个方法所接收的参数都是相同的,第一个参数依旧是 Context,不用多做解释。 第二个参数一般用不到,通常都是传入 0即可。第三个参数是一个 Intent对象,我们可以通 过这个对象构建出 PendingIntent的“意图”。第四个参数用于确定 PendingIntent的行为,有 FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_ CURRENT这四种值可选,通常传入0。

新建一个 NotificationTest项目,并修改 activity_main.xml中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/send_notice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send notice"/>

</LinearLayout>

布局文件非常简单,里面只有一个 Send notice按钮,用于发出一条通知。接下来修改 MainActivity中的代码,如下所示:

package com.example.notificationtest;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.send_notice);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.send_notice:
                Intent intent=new Intent(this,NotificationActivity.class);
                PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
                NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                Notification notification=new NotificationCompat.Builder(this)
                        .setContentTitle("This is content title")//指定通知的标题内容
                        .setContentText("This is content text")//指定通知的正文内容
                        .setWhen(System.currentTimeMillis())//指定通知被创建的时间
                        .setSmallIcon(R.mipmap.ic_launcher)//设置通知的小图标,注意只能用纯alpha图层进行设置,小图标会显示在系统状态栏上,就是在最上面小通知栏的图标
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))//设置通知的大图标,当下拉系统状态栏时,就可以看到设置的大图标
                        .setContentIntent(pi)//点击通知时开启一个新活动
                        .setAutoCancel(true)//对通知进行取消
                        .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/luna.ogg")))//允许播放音频
                        .setVibrate(new long[]{0,1000,1000,1000})//振动毫秒为单位。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0的值表示手机静止的时长,下标为 1的值表示手机振动的时长,下标为 2的值又表示手机静止的时长,以此类推。
                        .setLights(Color.GREEN,1000,1000)//设置手机前的LED灯,第一个参数是颜色,第二个是亮起时长,第三个是暗区时长
                        //如果不想那么多繁琐的设置,可以直接使用通知的默认效果
                        //.setDefaults(NotificationCompat.DEFAULT_ALL)
                        .build();
                manager.notify(1,notification);
                break;
        }
    }
}


在调用振动时,不要忘了要声明权限的。因此,我们还得编辑 AndroidManifest.xml 文件,加入如下声明:

 <uses-permission android:name="android.permission.VIBRATE" />

准备好另一个活动,这里新建布局文件 notification_layout.xml,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".NotificationActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="24sp"
        android:text="This is notification layout"/>
</RelativeLayout>

仅添加了一行文字,当点击通知时,就会进入该活动,显示文字。

取消通知方法

第一种方法:

Notification notification=new NotificationCompat.Builder(this)
                        .setAutoCancel(true)//对通知进行取消
                        .build();

第二种方法:

public class NotificationActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notification_layout);
        NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(1);
    }
}

可以看到,这里我们在 cancel()方法中传入了 1,这个 1是什么意思呢?还记得在创建通 知的时候给每条通知指定的 id吗?当时我们给这条通知设置的 id就是 1。因此,如果你想 要取消哪一条通知,就在 cancel()方法中传入该通知的 id就行了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值