Notification——通知的简单使用与解析

通知是项目中经常会使用的,下面就来总结一下:

1,普通通知的简单使用;
2,系统默认效果;
3,自定义的效果;
4,跳转指定Activity通知栏;
5,自定义通知栏;

下面直接上代码:
Activity代码:

package com.btzh.mynotificationtest;

/**
 * Created by Lenovo on 2017/4/16.
 */

public interface IBaseActivity {
    public void showNotifaication();
    public void showNotifaication(String Title,String Text,int DrawableID);
    public void showNotification(String Title,String Text,int DrawableID,int NotionID);
    public void showActivityNotification(String Title,String Text,int DrawableID,int NotionID,String ActivityactionInflater);
    public void showCustomNotifation(int LayoutID,String Title, String Text, int DrawableID, int NotionID, String ActivityactionInflater);
    public void showCustomNotifation(String Title, String Text, int DrawableID, int NotionID, String ActivityactionInflater);
}

BaseActivity代码:

package com.btzh.mynotificationtest;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.widget.RemoteViews;

/**
 * Created by Lenovo on 2017/4/16.
 *
 */

public class BaseActivity extends Activity implements IBaseActivity {
    public NotificationManager manager = null;
    public Notification notification = null;
    public final int PUTONG_NOTICATION_ID = 1;
    public final int XITONG_NOTICATION_ID = PUTONG_NOTICATION_ID+1;
    public final int NO_XITONG_NOTICATION_ID = XITONG_NOTICATION_ID+1;
    public final int CUSTOM_NOTICATION_ID = NO_XITONG_NOTICATION_ID+1;
    public final int Activity_NOTICATION_ID = CUSTOM_NOTICATION_ID+1;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initButtonReceiver();
    }
    //普通通知栏
    @Override
    public void showNotifaication() {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.aa);
        manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        notification = new NotificationCompat.Builder(getBaseContext())
                .setContentTitle("通知测试!")
                .setContentText("我是通知测试的内容!")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.aa)
//                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.bb))
                .setLargeIcon(bitmap)
                .build();
        manager.notify(PUTONG_NOTICATION_ID,notification);
    }
    //系统默认通知栏
    @Override
    public void showNotifaication(String Title,String Text,int DrawableID) {
        manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        notification = new NotificationCompat.Builder(getBaseContext())
                .setContentTitle(Title)
                .setContentText(Text)
                .setSmallIcon(DrawableID)
                .setWhen(System.currentTimeMillis())
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),DrawableID))
                //通知默认设置
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .build();
        manager.notify(XITONG_NOTICATION_ID,notification);
    }
    /**
     *  自定义闪光灯通知铃声等时加权限
     *  <uses-permission android:name="android.permission.VIBRATE"/>
     */
    @Override
    public void showNotification(String Title, String Text, int DrawableID, int NotionID) {
        //获取系统的通知栏的管理器
        manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        //创建新的通知栏的对象
        notification = new NotificationCompat.Builder(getBaseContext())
                .setContentTitle(Title) //通知标题
                .setContentText(Text)//通知内容
                .setSmallIcon(DrawableID)//弹出通知的小图标
                .setWhen(System.currentTimeMillis()) //显示系统时间
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),DrawableID)) //设置大图标
                .setPriority(NotificationCompat.PRIORITY_MAX) //提示优先级最高级(一共四级,min,low,high,max)
                //设置提示音:包名+资源文件名
                .setSound(Uri.parse("android.resource://com.btzh.mynotificationtest/"+R.raw.invitation_msg))
                .setLights(Color.BLUE,1000,1000) //设置闪光灯
                .setAutoCancel(true) //点击自动取消,没有IntentActivty不起作用
                .build(); //创建
        manager.notify(NotionID,notification);//管理器打开通知栏
    }
    //跳转到Activity的通知栏
    @Override
    public void showActivityNotification(String Title, String Text, int DrawableID, int NotionID, String ActivityactionInflater) {
        Intent intent = new Intent(ActivityactionInflater);
        PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(),0,intent,0);
        manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        notification = new NotificationCompat.Builder(getBaseContext())
                .setContentTitle(Title)
                .setContentText(Text)
                .setSmallIcon(DrawableID)
                .setWhen(System.currentTimeMillis())
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),DrawableID))
                .setAutoCancel(true)//点击后自动消失
                .setContentIntent(pendingIntent) //跳转的intent
                .setDefaults(NotificationCompat.DEFAULT_ALL)//默认系统设置
                .setPriority(NotificationCompat.PRIORITY_MAX)//最高优先级
                .build();
        manager.notify(NotionID,notification);
    }

    //自定义通知栏
    @Override
    public void showCustomNotifation(int LayoutID, String Title, String Text, int DrawableID,
                                     int NotionID, String ActivityactionInflater) {
        RemoteViews remoteViews = new RemoteViews(getPackageName(),LayoutID);


    }
    //自定义通知栏(通知栏中荣耀手机安卓7.0字体颜色默认为透明色,要设置字体颜色)
    @Override
    public void showCustomNotifation(String Title, String Text, int DrawableID, int NotionID, String ActivityactionInflater) {
        //获取系统服务
        manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        //创建自定义的通知界面布局
        RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.custom_layout);
        //通过ID设置相应内容
        remoteViews.setImageViewResource(R.id.image_view,DrawableID);
        remoteViews.setTextViewText(R.id.text_title,Title);
        remoteViews.setTextViewText(R.id.text_content,Text);
        //通过广播来接受相应消息
        Intent btnIntent = new Intent("Button");
        btnIntent.putExtra("ButtonID","enter");
        btnIntent.putExtra("NotionID",NotionID);
        btnIntent.putExtra("Activity",ActivityactionInflater);
        PendingIntent intententer = PendingIntent.getBroadcast(getBaseContext(),
                CUSTOM_NOTICATION_ID,btnIntent,PendingIntent.FLAG_UPDATE_CURRENT
        );
        remoteViews.setOnClickPendingIntent(R.id.enter,intententer);
        btnIntent.putExtra("ButtonID","cancle");
        PendingIntent intentcancle = PendingIntent.getBroadcast(getBaseContext(),
                Activity_NOTICATION_ID,btnIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.cancle,intentcancle);
        notification = new NotificationCompat.Builder(getBaseContext())
//                .setCustomBigContentView(remoteViews)
                .setContent(remoteViews)
                //这句话一定要加上不加上通知栏不会显示(sdk4.2.2,华为)
                .setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))
                .setSmallIcon(DrawableID)
                .setAutoCancel(true)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .build();
        //大图标通知栏,api大于16才引入,其中remoteViews中仅支持图片和文字,按钮不支持
        //当用按钮时一定注意通知栏的界面适配问题
        //其中当设置大视图时,大视图并没有自动显示出来,而是需要下拉一下才会显示出来
        //其中NotificationCompat用的是V4包中的为了解决各种api的支持问题,不知是否与他有关
//        if (android.os.Build.VERSION.SDK_INT >= 16){
//            notification.bigContentView = remoteViews;
//        }
        manager.notify(CUSTOM_NOTICATION_ID,notification);
    }

    public PendingIntent getDefalutIntent(int flags){
        PendingIntent pendingIntent= PendingIntent.getActivity(this, 100, new Intent(), flags);
        return pendingIntent;
    }
    public MyBrocast bReceiver = null;
    /**通知栏点击广播接收 */
    public void initButtonReceiver(){
        bReceiver = new MyBrocast();
        IntentFilter intentFilter = new IntentFilter("Button");
        registerReceiver(bReceiver, intentFilter);
    }

    private class MyBrocast extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if ("Button".equals(action)){
                String btnID = intent.getStringExtra("ButtonID");
                String ActivityAction = intent.getStringExtra("Activity");
                if ("enter".equals(btnID)){
                    Intent intent1 = new Intent(ActivityAction);
                    startActivity(intent1);
                    manager.cancel(CUSTOM_NOTICATION_ID);
                }else {
                    manager.cancel(CUSTOM_NOTICATION_ID);
                }

            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(bReceiver);
    }
}

MainActivity代码就不用贴出来了吧,就是几个按钮而已

自定义Layout布局:

<?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">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:background="@drawable/aa"
            android:id="@+id/image_view"
            android:layout_margin="5dp"
            android:layout_width="60dp"
            android:layout_height="60dp" />
        <LinearLayout
            android:layout_toRightOf="@id/image_view"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:textColor="@android:color/black"
                android:id="@+id/text_title"
                android:layout_margin="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:textColor="@android:color/black"
                android:id="@+id/text_content"
                android:layout_margin="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:gravity="center"
                    android:layout_weight="1"
                    android:background="@color/colorAccent"
                    android:text="进入"
                    android:id="@+id/enter"
                    android:textSize="18sp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:gravity="center"
                    android:layout_weight="1"
                    android:layout_marginLeft="20dp"
                    android:background="@color/colorPrimaryDark"
                    android:text="取消"
                    android:id="@+id/cancle"
                    android:textSize="18sp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            </LinearLayout>

        </LinearLayout>
    </RelativeLayout>

</LinearLayout>

其他的布局非常简单,就不贴出来了,其中需要注意的地方,还有注释已经在代码中标识的非常清楚了!
下面DEMO链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值