通知是项目中经常会使用的,下面就来总结一下:
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链接