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(); } } }