Android Notification 的封装复用



Android Notification 的封装复用

在Android应用的开发中,我们难免会在很多地方都用到Notification。为了更加简单的使用以及避免在不同app上写一大串相同的代码,因此对Notification和NotificationManager类进行了封装。

直接边看代码边说吧~~

/** 
 * @ClassName: NotificationInterface 
 * @Description: Notification 接口
 * @author kaiqi.li 
 * @date 2015年1月5日 下午3:46:19  
 */
public interface NotificationInterface {
	public static final String TAG = NotificationInterface.class.getClass().getSimpleName();
	public NotificationCompat.Builder generateNotifacationBuilder(String title,String content, int iconId) ;

}
1、首先定义的是  NotificationInterface ,该接口中主要定义了  generateNotifacationBuilder函数由具体的Notification类实现


/** 
 * @ClassName: BasicNotificationBuild 
 * @Description: 默认的 NotificationBuilder
 * @author kaiqi.li 
 * @date 2015年1月5日 下午3:50:52  
 */
public class BasicNotificationBuilder implements NotificationInterface {

	private Context mContext ;
	private GetPendingIntent mCallback ;
	
	public BasicNotificationBuilder(Context context , GetPendingIntent callback){
		mContext = context ;
		mCallback = callback ;
	}
	
	/**
	 * 创建一个默认的NotificationBuilder
	 * 设置3个必填参数.setSmallIcon(iconId)
	 *		     .setContentTitle(title)
	 *			 .setContentText(content)
	 */
	@Override
	public Builder generateNotifacationBuilder(String title, String content, int iconId) {
		NotificationCompat.Builder builder = 
				new NotificationCompat.Builder(mContext)
				.setSmallIcon(iconId)
				.setContentTitle(title)
				.setContentText(content)
				.setAutoCancel(true)
				.setDefaults(Notification.DEFAULT_ALL)
		        .setContentIntent(mCallback.getPendingIntent()) ;
		
		return builder;
	}
	/**
	 * 
	* @ClassName: GetPendingIntent 
	* @Description: 回调接口,获取具体的PendingIntent以解决用户点击back键时返回到哪个界面的问题
	* 				根据不同的需求可以在getPendingIntent函数的实现中设置不同的PendingIntent
	* @author kaiqi.li 
	* @date 2015年1月5日 下午5:38:59
	 */
	public interface GetPendingIntent{
		public PendingIntent getPendingIntent() ;
	}

}
2、定义BasicNotificationBuilder类,详细解释的看注释。今后要是有拓展,比如说自定义Notification布局等,可以再定义相应的类(如CustomNotificationBuilder)实现
generateNotifacationBuilder接口就可以了。

<pre name="code" class="java">/** 
 * @ClassName: MyNotificationManager 
 * @Description: Notificatoin 管理器
 * @author kaiqi.li 
 * @date 2015年1月5日 下午4:05:50  
 */
public class MyNotificationManager {
	private NotificationInterface mNotificationInterface ;
	private static MyNotificationManager instanse ;
	private NotificationManager notificationManager = null ;
	private static final int START_ID = 1000;  
    private static final int RANGE = 50;  
    private int mCurrentId = START_ID;  
    
    private MyNotificationManager(){
    }
    
    public static MyNotificationManager getInstanse(){
    	if (instanse == null ) {
			synchronized (MyNotificationManager.class) {
				if (instanse == null) {
					instanse = new MyNotificationManager() ;
				}
			}
		}
    	return instanse ;
    }
    
    public NotificationInterface getNotificationInterface(){
    	return mNotificationInterface ;
    }
    public void  setNotificationInterface(NotificationInterface notificationInterface){
    	mNotificationInterface = notificationInterface;
    }
    
    /**@description 对外发送通知的接口
     * @param context
     * @param title  标题
     * @param content  内容
     * @param iconId  图标 id
     */
    public void sendNotification(Context context ,String title , String content ,int iconId){
    	buildAndDisplayNotification(context, title, content, iconId);
    }
    /**@description 创建通知
     * @param context
     * @param title  标题
     * @param content  内容
     * @param iconId  图标 id
     */
    private void buildAndDisplayNotification(Context context ,String title , String content ,int iconId){
    	if (mNotificationInterface != null) {
			Notification notification = mNotificationInterface.generateNotifacationBuilder(title, content, iconId).build();
			if (notification != null) {
				if (notificationManager == null) {
					notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
				}
				notificationManager.notify(generateNotification(), notification);
			}
		}
    }
    
    /**
     * @return Notification 的id
     */
    private int generateNotification() {  
        mCurrentId++;  
        if (mCurrentId >= START_ID + RANGE) {  
            mCurrentId = START_ID;  
        }  
        return mCurrentId;  
    }
    
}
3、 Notificatoin 管理器 ,负责统一发送和管理Notification,可以增加接口实现统一设置Notification的通知响应(如:震动,响铃,闪灯等)

 
<span style="font-family:Arial, Helvetica, sans-serif;">
</span>
以下是调用方式:
<pre name="code" class="java">
BasicNotificationBuilder builder = new BasicNotificationBuilder(context, new GetPendingIntent() {
			
			@Override
			public PendingIntent getPendingIntent() {
				Intent intent = new Intent(context , Test2.class);
				
				TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
				// 添加后台堆栈
				stackBuilder.addParentStack(Test2.class);
				// 添加Intent到栈顶
				stackBuilder.addNextIntent(intent);
				// 获得一个PendingIntent包含整个后台堆栈 containing the entire back stack
				PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
				return pendingIntent;
			}
		});
		MyNotificationManager.getInstanse().setNotificationInterface(builder);
		MyNotificationManager.getInstanse().sendNotification(context, "通知标题", "通知内容", R.drawable.icon);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值