android的Notifications的例子demo

來源:互聯網
上載者:User

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

  郵箱:carman_loneliness@163.com

  需要源碼可"評論"留下郵箱。

  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.