Android——Notification(自定义通知)

RemoteView类

      RemoteView描述一个view,而这个view是在另一个进程显示的。需要用布局解析器布局资源文件。并且提供了可以修改View内容的一些简单基础的操作。

      RemoteView是用来描述一个跨进程显示的view,Android的通知是全局的、跨进程的,由于自定义的Notification和显示Notification是两个不同的进程。因此,自定义的Notification必须通过RemoteView才能显示

public RemoteViews(String packageName,int layoutId)

作用:创建RemoteViews对象 

packageName : 当前组件所在包的包名

layoutId :布局资源索引值

示例:

RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notification);

notification.xml是自定义的布局文件

扫描二维码关注公众号,回复: 597101 查看本文章

步骤6:接上篇文章的第5步:

RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notification);
步骤7:设置通知的显示样式:
notification.contentView = contentView;
 

步骤8:发送通知 

mNotiManager.notify(R.id.btn_show,notification);
   案例:通知栏更新进度条。  
package com.example.test_notification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.Toast;

public class MainActivity2 extends Activity implements OnClickListener {
	NotificationManager mNotiManager;// 通知管理器
	Notification mNoti;// 通知
	Handler mHandler;// 处理消息
	private final int PROGRESS_MAX = 10;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main1);
		Button btnShow = (Button) findViewById(R.id.btn_show);
		btnShow.setOnClickListener(this);
		mNotiManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		mHandler = new Handler() {
			public void handleMessage(android.os.Message msg) {
				mNoti.contentView.setProgressBar(R.id.progressBar1,
						PROGRESS_MAX, msg.what, false);
				Log.i("TAG", "progress=" + msg.what);
				// 发送新的通知
				mNotiManager.notify(R.id.btn_show, mNoti);
				if (msg.what == PROGRESS_MAX) {
					Toast.makeText(MainActivity2.this, "下载完成,请查看安装",
							Toast.LENGTH_LONG).show();
				}
			};
		};
	}

	@Override
	public void onClick(View v) {
		try {
			switch (v.getId()) {
			case R.id.btn_show:
				showNotify();
				upgrade();
				break;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void upgrade() {
		new Thread() {
			@Override
			public void run() {
				for (int i = 0; i <= PROGRESS_MAX; i++) {
					mHandler.sendEmptyMessage(i);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

	private void showNotify() {
		try {
			// 创建通知对象
			mNoti = new Notification(R.drawable.icon, "又来通知了哈哈",
					System.currentTimeMillis());
			mNoti.defaults |= Notification.DEFAULT_LIGHTS;
			mNoti.defaults |= Notification.DEFAULT_VIBRATE;
			mNoti.vibrate =new long[]{0,100,200,300};
			Intent intent = new Intent(this, MainActivity2.class);
			// 设置随时更新(第四个参数)
			PendingIntent pIntent = PendingIntent.getActivity(this, 1, intent,
					PendingIntent.FLAG_UPDATE_CURRENT);
			// 设置通知不可删除
			mNoti.flags = Notification.FLAG_ONGOING_EVENT;
			mNoti.contentIntent = pIntent;
			// 定义闪光灯
			// 路灯显示300毫秒然后关闭一分钟。如果设备不支持制定的颜色,则会按照最近的颜色显示。
			mNoti.ledARGB = 0xff00ff00;
			mNoti.ledOnMS = 300;
			mNoti.ledOffMS = 1000;
			mNoti.flags |= Notification.FLAG_SHOW_LIGHTS;
			// 自定义通知中显示的布局
			RemoteViews contentView = new RemoteViews(getPackageName(),
					R.layout.dialog);
			// 设置通知的显示样式
			mNoti.contentView = contentView;
			// 设置当前的进度之为1,即整个进度值的10%
			mNoti.contentView.setProgressBar(R.id.progressBar1, PROGRESS_MAX,
					1, false);
			// 发送通知
			mNotiManager.notify(R.id.btn_show, mNoti);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

猜你喜欢

转载自lydia-fly.iteye.com/blog/2030099
今日推荐