一,写在前面

        这篇文章介绍Android中RemoteViews的基本使用,使用有这样的两个场景:通知栏,窗口小部件。下面会介绍如何实现向通知栏发送一个通知包括:系统默认样式的通知,自定义样式的通知;以及如何实现窗口小部件,并更新界面。值得一提的是,在开发一个应用的时候,若需要实现向通知栏发送通知,或窗口小部件,会发现我们无法直接通过findViewById来获取控件从而更新UI,因为这些界面根本就不在我们开发的应用里,应用里只有对应的xml文件。但是,可以通过使用RemoteViews来更新界面,内部实现原理是Binder机制,这样才能跨进程的处理UI。本篇文章不对RemoteViews的源码进行分析,只是涉及到RemoteViews的两个使用场景,后面会码一篇blog对RemoteViews进行源码角度的分析,敬请期待!

二,通知栏

       在手机接收到微信消息时,手指沿着手机屏幕往下滑动,在通知栏会收到一条通知,于是通知栏就展现在我们面前了。那么如何向通知栏发送一条通知呢?        代码如下:
package com.example.notificationdemo;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.RemoteViews;public class MainActivity extends Activity {private NotificationManager nm;public static int id = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);}public void clickButton(View v) {switch (v.getId()) {//发送默认样式的通知case R.id.btn1:Notification notification = new Notification();notification.icon = R.drawable.ttnkh;//通知到来时,在状态栏上显示有动画的文字(手机厂商定制手机后,可能不显示tickerText)notification.tickerText = "I am tickerText";//显示时间(手机厂商也可能会修改时间展示方式)notification.when = System.currentTimeMillis();//点击通知后,通知会消失(默认是不消失)notification.flags = Notification.FLAG_AUTO_CANCEL;Intent intent = new Intent(this, DemoActivity1.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);notification.setLatestEventInfo(this, "I am contentTitle", "I am contentText", pi);nm.notify(id, notification);break;//发送自定义样式通知case R.id.btn2:Notification n = new Notification();n.tickerText = "我是tickerText";n.when = System.currentTimeMillis();n.icon = R.drawable.ic_launcher;n.flags = Notification.FLAG_AUTO_CANCEL;//点击通知进入页面DemoActivity1PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, DemoActivity1.class), PendingIntent.FLAG_UPDATE_CURRENT);n.contentIntent = pendingIntent;RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.remote_view);PendingIntent click_pi = PendingIntent.getActivity(this, 0, new Intent(this, DemoActivity2.class), PendingIntent.FLAG_UPDATE_CURRENT);//点击图片进入页面DemoActivity2remoteViews.setOnClickPendingIntent(R.id.iv_remoteview, click_pi);n.contentView = remoteViews;nm.notify(id, n);break;default:break;}}}
        点击按钮R.id.btn1,R.id.btn2分别发送默认样式通知,发送自定义样式通知。xml布局文件就不再粘贴了,比较简单,这里主要分析点击两个按钮后如何发送通知的。
发送系统默认通知步骤:
        1,获取NotificationManager对象,一个系统服务;         2,创建Notification对象,这里是创建空参对象,有参亦可;         3,设置Notification一些字段的值,例如:icon,tickerText,when,flags;         4,调用notification.setLatestEventInfo(Context context,CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent);
点击按钮R.id.btn1,通知栏截图如下:
        步骤3中字段在代码中都有注释,比较好理解。这里主要说一下步骤4,:PendingInent,它是一个需要触发的intent,这是它和普通的intent的区别。PendingInent对象获取方式不同,触发执行的意图也不同,触发后的意图总体来说有三种:进入某一Activity,发送广播,启动服务,分别调用PendingIntent.getActivity(...),PendingIntent.getBroadcast(...),PendingIntent.getService(...)。调用notification.setLatestEventInfo方法,会传入一个PendingIntent,在点击了通知栏的通知后,会触摸相应的意图,可以进入一个Activity,或发送一个广播,或启动一个服务。如果想实现一个自定义样式的通知,怎么做了?
发送自定义样式的通知步骤:
       步骤1,2,3同发送系统默认通知步骤1,2,3;        4:获取一个PendingIntent对象,给Notification对象的contentIntent 字段设置值:n.contentIntent = pendingIntent;        5:创建RemoteViews对象,更新控件,设置控件点击后触发的意图;        6:给Notification对象的contentView字段设置值:n.contentView = remoteViews; 点击按钮R.id.btn2,通知栏截图如下:


       分析:步骤4,n.contentIntent = pendingIntent,是设置点击通知后触发的意图。 步骤5,RemoteViews构造方法中传入两个参数:包名,xml布局文件。这个xml布局文件对应如上通知中的界面,上面布局文件比较简单,客官忍忍,这不是本篇文章重点。
       需要注意的是:在点击通知后,进入的是页面DemoActivity1;点击图片后,进入页面DemoActivity2,它们分别对应不同的PendingIntent。

三,另外

       如果需要更新通知的界面,就需要操作RemoteViews,调用该对象的相关方法实现,这里不再一一讲解方法,查下API还是比较好理解的。但是要注意,RemoteViews并不能操作所有的View类型,支持的View类型如下: 布局:   LinearLayout,RelativeLayout,FrameLayout,GridLayout 控件:   AnalogClock,Button,Chronometer,ImageButton,ImageView,ProgressBar,TextView,ViewFlipper,ListView,GridView,StackView,                 AdapterViewFlipper  注:只支持这些View,不包括其子类,以及自定义的View。

四,最后

        RemoteViews在通知栏上的使用,就是实现一个自定义界面的通知。下篇文章将讨论RemoteViews的另一个使用场景-“窗口小部件”, RemoteViews的基本使用(下)之窗口小部件。
      这篇文章就分享到这里啦,有疑问可以留言,亦可纠错,亦可补充,互相学习...^_^

      





更多相关文章

  1. Android(安卓)EditText 输入完毕 点击空白区域键盘自动退出
  2. Android(安卓)SDK上手指南 3:用户交互
  3. Android各个版本的新特性
  4. Android中仿QQ聊天内容中提取电话号码,URL
  5. Android通知栏微技巧,那些你所没关注过的小细节
  6. Android进阶高手(五)之Android聊天室(4)---完结篇
  7. Android(安卓)无入侵解决按钮重复点击---onClick处理
  8. 第14天 Android(安卓)Touch事件学习 1 点击事件
  9. Android双屏驱动Service架构实现

随机推荐

  1. 在线安装ADT总是出现以下错误
  2. android如何编差分包升级
  3. Android实现邮箱验证功能
  4. 为android应用程序添加桌面快捷方式
  5. 获取来电号码
  6. android第二天学习
  7. 四极管: Android开发调试I2C设备驱动 i2cd
  8. Android反射调用goToSleep实现一键锁屏、
  9. Android(安卓)Bitmap相关[转]
  10. Android之Toast自定义动画