Android设置Notification从网络中加载图片,解决点击无法消失的bug

Notification的构造函数中只支持使用资源文件的图片作为图片,但是如果我们想用网络中的图片怎么办呢。

我们知道,给Notification设置内容的时候调用的是setLatestEventInfo方法,当我们点击去看该方法的时候,所有的结果都一目了然了。

public void setLatestEventInfo(Context context,
            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {
        // TODO: rewrite this to use Builder
        RemoteViews contentView = new RemoteViews(context.getPackageName(),
                R.layout.notification_template_base);
        if (this.icon != 0) {
            contentView.setImageViewResource(R.id.icon, this.icon);
        }
        if (priority < PRIORITY_LOW) {
            contentView.setInt(R.id.icon,
                    "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
            contentView.setInt(R.id.status_bar_latest_event_content,
                    "setBackgroundResource", R.drawable.notification_bg_low);
        }
        if (contentTitle != null) {
            contentView.setTextViewText(R.id.title, contentTitle);
        }
        if (contentText != null) {
            contentView.setTextViewText(R.id.text, contentText);
        }
        if (this.when != 0) {
            contentView.setViewVisibility(R.id.time, View.VISIBLE);
            contentView.setLong(R.id.time, "setTime", when);
        }
        if (this.number != 0) {
            NumberFormat f = NumberFormat.getIntegerInstance();
            contentView.setTextViewText(R.id.info, f.format(this.number));
        }

        this.contentView = contentView;
        this.contentIntent = contentIntent;
    }

从上述代码中我们很明显能够看出来,Notification使用了一个RemoteViews的类来实现自己的布局,最后通过调用

  this.contentView = contentView;
  this.contentIntent = contentIntent;

这两个方法来实现界面布局和Intent的,那么我们可不可以自己写一个remoteView呢,废话。。。

看RemoteViews中的

public void setImageViewBitmap(int viewId, Bitmap bitmap) {
        setBitmap(viewId, "setImageBitmap", bitmap);
    }

这不就是我们想要的吗。。。。

我们只有一个目的,把图片换成网络中加载的图片,我们先把图片从网络中加载到本地,看代码:

public void set(final Context context, String urlStr, final Bundle bundle) {
		new AsyncTask<String, Void, Bitmap>() {
			@Override
			protected Bitmap doInBackground(String... params) {
				try {
					URL url = new URL(params[0]);
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					conn.setConnectTimeout(6000);// 设置超时
					conn.setDoInput(true);
					conn.setUseCaches(false);// 不缓存
					conn.connect();
					int code = conn.getResponseCode();
					Bitmap bitmap = null;
					if (code == 200) {
						InputStream is = conn.getInputStream();// 获得图片的数据流
						bitmap = BitmapFactory.decodeStream(is);
					}
					return bitmap;
				} catch (MalformedURLException e) {
					e.printStackTrace();
					return null;
				} catch (IOException e) {
					e.printStackTrace();
					return null;
				}
			}

			@Override
			protected void onPostExecute(Bitmap result) {
				super.onPostExecute(result);
				if (result != null) {
					openNitifNews(context, result, bundle);
				}
			}
		}.execute(urlStr);
	}

我们从网络中把图片加载到本地形成了bitmap,然后通过setImageViewBitmap把bitmap设置进去就oK了。

再来看看openNitifNews方法:

/**
	 * 处理推送的逻辑
	 *
	 * @param ct
	 * @param imgUrl
	 * @param bundle
	 */
	private void openNitifNews(Context ct, Bitmap bitmap, Bundle bundle) {
		Context context = ct.getApplicationContext();
		NewsBean bean = null;
		bean = (NewsBean) bundle.getSerializable("bean");
		if(bean == null)
		return;
		if (TextUtils.isEmpty(bean.getTitle())) {
			return;
		}
		if (TextUtils.isEmpty(bean.getDes())) {
			bean.setDes("  ");
		}
			NotificationManager nm = null;
		if (null == nm) {
			nm = (NotificationManager) context
					.getSystemService(Context.NOTIFICATION_SERVICE);
		}

		Notification notification = new Notification();
		// 采用默认声音
		notification.defaults |= Notification.DEFAULT_SOUND;
		// 使用默认的灯光
		notification.defaults |= Notification.DEFAULT_LIGHTS;
		// 通知被点击后,自动消失
		notification.flags |= Notification.FLAG_AUTO_CANCEL;
		notification.icon = R.drawable.ic_launcher;
		// 点击'Clear'时,无法清除通知
		// notification.flags |= Notification.FLAG_NO_CLEAR;
		// 点击清除按钮不会清除消息通知,可以用来表示在正在运行
		// notification.flags |= Notification.FLAG_ONGOING_EVENT;
		RemoteViews remoteView = new RemoteViews(context.getPackageName(),
				R.layout.notif_news);  //通过自己的布局来显示
		remoteView.setImageViewBitmap(R.id.iv_newspush_icon, bitmap);
		remoteView.setTextViewText(R.id.tv_newpush_title, bean.getTitle());
		remoteView.setTextViewText(R.id.tv_newpush_des, bean.getDes());

		Intent appIntent = new Intent(ct, NewsDetailsActivity.class);
		appIntent.putExtra("article_type", bean.getTypeId());
		appIntent.putExtra("News_ID", bean.getID());
		appIntent.putExtra("HEADTITLE", bean.getHeadTitle());
		PendingIntent contentIntent = PendingIntent.getActivity(ct, 0, appIntent,
				PendingIntent.FLAG_UPDATE_CURRENT);<span style="white-space:pre">	</span>
<span style="white-space:pre">		</span>// remoteView.setOnClickPendingIntent(R.id.ll_newpush_root,
<span style="white-space:pre">		</span>// contentIntent);  //如果在这里设置点击事件,不会消失,根据需求来。。

		notification.contentView = remoteView;
		notification.contentIntent = contentIntent; 

		nm.notify(MySmsReceiver.NEWSPUAH, notification);
	}

ok了,接着就是调用吧。。。

时间: 2024-11-06 03:36:05

Android设置Notification从网络中加载图片,解决点击无法消失的bug的相关文章

android优化从网络中加载图片速度。。

从网络中加载图片主要要注意两个方面的问题: 1.内存管理:图片占的内存很大,假如图片数量多,很容易让系统抛出out of memory的异常. 同时我们也要注意不同android版本中内存管理的区别. 2.性能:图片的加载速度,和加载图片时不影响UI的流畅性 尤其是在ViewPager,GridView 和ListView等等需要在短时间内加载大量图片时,上面两个问题就更加突出了... 要解决上面这个两个问题,我们要用到的技术 1.缩减加载的图片的bitmap 可以通过实现显示图片的view的大

android Listview 软引用SoftReference异步加载图片

首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以图片失真比较严重,对于对图片质量要求很高的应用,可以采用下面的方法 /** *按照图片路径加载 *@param path图片资源的存放路径 *@param scalSize缩小的倍数 *@return */ public static Bitmap loadResBitmap(String path

Android App 启动时显示正在加载图片(源码)

微信.QQ.天天动听等程序,在打开时显示了一张图片,然后跳转到相关界面.本文实现这个功能,其实很简单.... 新建两个Activity,LoadingActivity,MainActivity,将LoadingActivity设置为android.intent.action.MAIN.使用TimerTesk,或者Thread将LoadingActivity显示几秒后跳转到MainActivity界面. LoadingActivity: new Timer().schedule(new Timer

【Android】ListView、RecyclerView异步加载图片引起错位问题

今天在RecyclerView列表里遇到一个情况,它包含300条数据,每项包含一个图片,发现在首次载入时,由于本地没图,请求网络的时候:快速滑动导致了图片错位.闪烁的问题. 原理的话有一篇已经说的很清楚了,大家可以参考下 下面是讲讲实际使用中,是怎么解决错位的问题. 一般错位都是发生在耗时的http请求上面,因此,针对每次图片请求 发起前 1:先将图片预设为本地一个占位图片.(重要!很多错位情况在于复用了其他位置的图片缓存,而当前图片迟迟加载不出来,导致当前图片错位.所以解决之道是先用本地占位图

Android _关于fragment切换重新加载的解决分享给大家

在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment但是,这样会有一个问题 ,应该很多朋友都遇到过:每次切换的时候,Fragment都会重新实例化,也就是运行OnCreatVIew()方法那么如何让多个Fragment彼此切换时不重新实例化?正确的切换方式是add(),切换时hide(),add()另一个Fragment,再次切换时,只需hide()当前,show()另一个.//之前显示的fragment        private Fragment

IOS-SDWebImage根据网络状态加载图片

iOS开发-你真的会用SDWebImage? 2016-05-17 hosea_zhou 有意思啊 原创作者:hosea_zhou 原文地址:http://www.jianshu.com/p/dabc0c6d083e 猿吧 - 资源共享论坛: http://www.coderbar.cn 最近论坛里有最新的视频资料哦! SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高.但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage. 使用场景:自定义的UITabl

el-table中加载图片问题

<el-table-column label="头像" width="100"> <template scope="scope"> <img :src="scope.row.img" width="50" height="50" class="img"/> </template> </el-table-column

xcode 7.2 怎么在Playground 中加载图片

在Playground文件所在里的地方 如果忘记保存到哪里了 Show File Inspector 可以打开面板 上面有一个Full Path 就是文件路径 (点击右下角小箭头就会直接打开了) 右键点击name.playgournd 文件-> 显示包内容 这里如果没有Resources 这个文件夹 就创建一个 然后在里面添加的图片就可以用了 在 Image Asset 的面板上也可以看的到了 纯原创 转载请注明

异步线程加载图片工具类

/** * 异步线程加载图片工具类 * 使用说明: * BitmapManager bmpManager; * bmpManager = new BitmapManager(BitmapFactory.decodeResource(context.getResources(), R.drawable.loading)); * bmpManager.loadBitmap(imageURL, imageView); */ public class BitmapManager { private st