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是自定义的布局文件
步骤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();
}
}
}