android的Notifications的例子demo

标签: android notifications demo | 发表时间:2012-08-01 20:13 | 作者:Carman
出处:http://www.cnblogs.com/

android的Notifications通知的原理和Demo

  在APP中经常会用到通知。这是个比较普遍的功能。比如网易新闻客户端,有什么重大新闻的话会在通知栏弹出一条通知。

  在做程序过程中我也遇到这个需求。每隔7天就自动弹出通知,提醒用户。在网上搜了搜,用了2天时间实现了。实现过程如下:

  一:通知要调用闹钟功能来实现,第一步设置闹钟

  /*参数1:context 参数2:唤醒的时间(毫秒格式)

   *功能:发出闹钟广播

  public static void setAlarmTime(Context context, long timeInMillis) {
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent("android.alarm.demo.action");
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
    int interval = 7*24*60*60*1000; //7天时间的毫秒形式
    am.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis,

    interval, sender);//参数2表示唤醒时间,参数2表示时间间隔。

  }

  要在需要的地方调用该方法,调用之后将调用时的时间存储起来,为什么,下面会说。

  存储代码:

  SharedPreferences alarmTime = context.getSharedPreferences(Constant.ALARM_TIME, 0);
  Editor editor = alarmTime.edit();
  editor.putLong("theFirstNotifyBeginTime",System.currentTimeMillis());
  editor.commit();

  二:接收步骤一中发出的BroadCast

  public class AlarmReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
  if ("android.alarm.demo.action".equals(intent.getAction())){

  //就在这里调用通知的操作
    NotifyUtil.addAppNotify(context); //我自己的通知的函数,见第三步
    SharedPreferences alarmTime = context.getSharedPreferences("alarm_time", 0);//为什么会有这个,接着往下看就行。
    Editor editor = alarmTime.edit();
    editor.putLong("lastNotifyTime",System.currentTimeMillis());
    editor.commit();
    return;
  }
}

}

  三:步骤二中要调用的通知函数。

  public class NotifyUtil {

    public static void addAppNotify(Context context){
    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification();
    notification.icon = R.drawable.icon_app_notify; //通知图标
    notification.tickerText = context.getResources().getString(R.string.app_tickerText); //通知的内容
    notification.defaults=Notification.DEFAULT_SOUND; //通知的铃声
    notification.audioStreamType= android.media.AudioManager.ADJUST_LOWER;
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    Intent intent = new Intent();
    intent.setComponent(new ComponentName("carman.execise","carman.execise.Main"));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    // 点击状态栏的图标出现的提示信息设置
    notification.setLatestEventInfo(context,context.getResources().getString(R.string.app_notify_title),
    context.getResources().getString(R.string.app_notify), pendingIntent);
    manager.notify(1, notification); //这个函数中第一个参数代表identifier.如果要同时弹出多条通知,每个通知的这个参数必须不同。

                   否则,后面的会覆盖前面的通知。
}
}

  以上步骤就可以实现通知功能,但是还缺一个重启的监听。否则,手机一重启所设置的闹钟就失效了。

  四:重启恢复闹钟,通过一个广播来实现

  因为重启之后所设置的闹钟就失效了,必须通过该广播重新计算好下次响的时间nextNotifyTime,并再次调用步骤一的方法。

  public class BootReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
    String action = intent.getAction();
    if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
    SharedPreferences alarmTime = context.getSharedPreferences("alarm_time", 0);  //存储数据的首选项
    long lastNotifyTime = alarmTime.getLong("lastNotifyTime",0);  //取得上次闹钟响的时间,也就是步骤二中存储的值
    long nextNotifyTime;
    if(lastNotifyTime == 0){
    long theFirstNotifyBeginTime = alarmTime.getLong("theFirstNotifyBeginTime",0); //若没弹出过通知,取得步骤一中存储的值
    nextNotifyTime = 7*24*60*60*1000 + theFirstNotifyBeginTime;
    }else{
    nextNotifyTime = 7*24*60*60*1000 + lastNotifyTime;
    }
    if(nextNotifyTime <= System.currentTimeMillis()){
    NotifyUtil.setAlarmTime(context,System.currentTimeMillis());
    }else{
    NotifyUtil.setAlarmTime(context,nextNotifyTime); //再次设置为闹钟
    }
  }
  }
  }

  五:这些做好了之后调试还是通不过,因为需要在androidManifest中注册下广播的接收器才行。如下:

  步骤二的接收器,监听闹钟

  <receiver android:name=".notifications.AlarmReceiver">
    <intent-filter>
      <action android:name="android.alarm.demo.action" />
  </intent-filter>
  </receiver>

  步骤四的接收器,监听重启
  <receiver android:name=".notifications.BootReceiver">
    <intent-filter>
      <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
  </receiver>

  黄色字体部分为闹钟重启监听的相关代码。

  可以转载,但请注明出处,谢谢!

  作者:Carman  2012-08-01  20:10:57

  邮箱:[email protected]

  

  

 

本文链接

相关 [android notifications demo] 推荐:

android的Notifications的例子demo

- - 博客园_首页
android的Notifications通知的原理和Demo.   在APP中经常会用到通知. 比如网易新闻客户端,有什么重大新闻的话会在通知栏弹出一条通知.   在做程序过程中我也遇到这个需求. 每隔7天就自动弹出通知,提醒用户. 在网上搜了搜,用了2天时间实现了.   一:通知要调用闹钟功能来实现,第一步设置闹钟.

Android Https请求详细demo

- - 移动开发 - ITeye博客
   Android Https详细请求全方案实现,包括HttpUrlConnection及HttpClient方式实现指定证书及信任所有的实现,不多说了,以下代码都经过详细测试,可以直接使用. * HttpUrlConnection 方式,支持指定load-der.crt证书验证,此种方式Android官方建议.

百度地图SDK for Android【Demo Place详情页】

- - CSDN博客移动开发推荐文章
        Place详情展示页面可以帮助开发者便捷的展示Poi详情信息,此外通过详情展示页面您还可以实现电话的拨打等功能. 今天将向大家介绍Place详情页的具体使用方法.         第一步,创建工程,并放置基础地图mapview控件(详细介绍请参考: 百度地图SDK for Android【Demo地图展示】 ).

android gps开发必备资料(含测试demo下载)

- - CSDN博客推荐文章
int year = ca.get(Calendar.YEAR);//获取年份. int month=ca.get(Calendar.MONTH);//获取月份. int day=ca.get(Calendar.DATE);//获取日. int minute=ca.get(Calendar.MINUTE);//分.

Android dlib人脸识别 dlib-android-app: Android app to demo dlib-android(https://github.com/tzutalin/dlib-android). Use the prebuilt shared-lib built from dlib-android

- -

Activiti工作流demo

- - CSDN博客综合推荐文章
继上篇《 Activiti工作流的环境配置》.        前几篇对Activiti工作流进行了介绍,并讲解了其环境配置. 本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货.        以HelloWorld程序为例.       首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功.

Y Combinator 举办 Demo Day

- Radar - 丕子
世界上最大的创业公司孵化器 Y Combinator 今天举办他们的 Demo Day,这次一共有 63 家创业公司参加演示,其中有 31 家愿意向媒体和投资人曝光自己,下面是这些创业公司的名字以及一句话描述:. Aisle50: 杂货版 Groupon. Interstate: 项目管理软件,可以跟客户分享开发路线图.

地形模拟演示Demo

- kongshanzhanglao - 博客园-首页原创精华区
地形渲染的首先是创建一个三角网络平面,然后调整平面顶点的y高度值,模拟地面的山丘和山谷,最后再绘制贴图效果. 本文首先介绍如何生成三角网络平面. 然后介绍如何通过高度图调整平面高度. 以及使用BlendMap和3种材质绘制贴图效果的方法. 最后演示如何调整摄像机位置和移动速度,在地面上行走. 一个m*n个顶点的平面由2*(m-1)*(n-1)个三角形组成.

IKAnalyzer和Ansj切词Demo

- - ITeye博客
        IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. String content = "Java编程思想(第4版)";.         Ansj中文分词这是一个ictclas的java实现.基本上重写了所有的数据结构和算法.词典是用的开源版的ictclas所提供的.切词Demo代码如下:.

一个 Demo 入门 Flutter

- - limboy's HQ
Flutter 是 Google 研发的一套移动端开发框架,也是 Google 正在研发的下一代操作系统 Fuchsia 的 App 开发框架(Web 和 Desktop 也都在进行积极的尝试),前几天刚发布了 1.0 正式版. 关于 Flutter 的原理和介绍可以参考美团的 这篇文章. 本文希望通过一个 Demo 来更深入地了解 Flutter 的布局、状态管理等细节.