1. 程式人生 > >AlarmManager詳解-----實現定時提醒

AlarmManager詳解-----實現定時提醒

各位好,又幾天沒見了,我是一個Android菜鳥,這幾天專案要做個定時提醒業務,在網上看了很多資料,大多數都是關於AlarmManager去實現(雖然我個人覺得用它去實現不夠強大,和健壯,但是沒辦法,短時間內我找不到更好的辦法,畢竟開發工作才2個月不到,Android開發的朋友如果有更好的方法請告訴我),這幾天由於事前很多,沒寫部落格對學的東西進行總結,每天下來都是空空的,感覺沒學到什麼東西,很是恐慌。今天特意抽出時間來總結下。

一.首先我們先對AlarmManager講解下

AlarmManager這個類實現系統警告服務,可以設定一個時間來完成指定的事情,只要在程式中設定了警報服務,就可以通過呼叫onReceive()方法執行你要做的事情,即使是待機狀態,也不會影響執行。

可以通過Context.getSystemService()方法來獲得該服務。

程式碼如下:

AlarmManager mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

1.公共方法

public void cancel 

取消報警

public void set(int type, long triggerAtTime, PendingIntent operation)

設定警報

public void setInexactRepeating (int type, long triggerAtTime, long interval, 
PendingIntent
 operation)

設定不精準重複週期

不精準重複週期:有很多類似的警報,類型範圍比較大的時候,這些警報就會合併為一個警報,這樣可以不用每次都執行警報,是一種節能型

引數的意思

public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)

設定精準重複週期

這裡有四個引數

第一個引數:即警報的型別,一般取值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP,如果為RTC表示為一個正常的定時器,如果是RTC_WAKEUP則除了有定時器外還可以有震動或者響鈴。另外就是RTC在手機睡眠的時候不發射警報,而RTC_WAKEUP則在睡眠的時候也會發射警報

第二個引數:第一次執行時要等待的時間,也就是執行延遲時間,單位是毫秒。例如:現在7點,你設定8點提醒,那麼就是7點到8點的時差

第三個引數:表示執行的時間間隔,單位是毫秒,也就是每過多久發射一次警報,一般都是以天為單位

第四個引數:一個PendingIntent物件,即到時間後要執行的操作

public void setTime (long millis)

設定系統時間,需要許可權(android.permission.SET_TIME

public void setTimeZone(String timeZone)

設定系統預設時區,需要許可權(android.permission.SET_TIME_ZONE

2.Type

AlarmManager.RTC                  硬體鬧鐘,不喚醒手機(也可能是其它裝置)休眠;當手機休眠時不發射鬧鐘。

AlarmManager.RTC_WAKEUP   硬體鬧鐘,當鬧鐘發躰時喚醒手機休眠;

AlarmManager.ELAPSED_REALTIME      真實時間流逝鬧鐘,不喚醒手機休眠;當手機休眠時不發射鬧鐘。

AlarmManager.ELAPSED_REALTIME_WAKEUP     真實時間流逝鬧鐘,當鬧鐘發躰時喚醒手機休眠;


3.PendingIntent 物件

在使用AlarmManager時一般都會用到PendingIntent,所以在這裡進行擴充套件

PendingIntent與Intent和相似,Intent是意圖的意思,想要做什麼,而PendingIntent相對於它來說,就是計劃將要做什麼

程式碼和類的結構:

1.新建兩個類,一個繼承Activity,一個繼承broadcastReceiver

程式碼詳細:

佈局檔案

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
     
<span style="white-space:pre">	</span><TimePicker android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button android:id="@+id/repeating_button"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/timePicker"
        android:text="設定重複鬧鈴" />

    <Button android:id="@+id/close_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="關閉"
            android:layout_below="@+id/repeating_button"
            android:layout_alignLeft="@+id/repeating_button" />

</RelativeLayout>
Activity程式碼
package com.example.Alarm;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;

import java.util.Calendar;
import java.util.TimeZone;

public class MyActivity extends Activity implements TimePicker.OnTimeChangedListener,View.OnClickListener{

    private TimePicker mTimePicker;
    private Button mButton;
    private Button close_Button;

    private int mHour = -1;
    private int mMinute = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化
        initView();
        // 獲取當前時間
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));

        if(mHour == -1 && mMinute == -1) {
            mHour = calendar.get(Calendar.HOUR_OF_DAY);
            mMinute = calendar.get(Calendar.MINUTE);
        }
        mTimePicker.setCurrentHour(mHour);
        mTimePicker.setCurrentMinute(mMinute);

        mTimePicker.setOnTimeChangedListener(this);
        mButton.setOnClickListener(this);
        close_Button.setOnClickListener(this);
    }
    private void initView(){
        mTimePicker = (TimePicker)findViewById(R.id.timePicker);
        mButton = (Button)findViewById(R.id.repeating_button);
        close_Button= (Button) findViewById(R.id.close_button);

    }

    @Override
    public void onTimeChanged( TimePicker timePicker, int hour, int minute) {
        mHour = hour;
        mMinute = minute;
    }
    private PendingIntent sender;
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.repeating_button:
                Intent intent = new Intent(MyActivity.this, AlarmBroadcastReceiver.class);
                sender = PendingIntent.getBroadcast(MyActivity.this, 0, intent, 0);

                long firstTime = SystemClock.elapsedRealtime();  	// 開機之後到現在的執行時間(包括睡眠時間)
                long systemTime = System.currentTimeMillis();      //當前時間點

                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 設定時區,避免時區誤差
                calendar.set(Calendar.MINUTE, mMinute);
                calendar.set(Calendar.HOUR_OF_DAY, mHour);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, 0);

                // 選擇的每天定時時間
                long selectTime = calendar.getTimeInMillis();

                // 如果當前時間大於設定的時間,那麼就從第二天的設定時間開始
                if(systemTime > selectTime) {
                    Toast.makeText(MyActivity.this, "設定的時間小於當前時間", Toast.LENGTH_SHORT).show();
                    calendar.add(Calendar.DAY_OF_MONTH, 1);
                    selectTime = calendar.getTimeInMillis();
                }

                // 計算現在時間到設定時間的時間差
                long time = selectTime - systemTime;
                firstTime += time;

                // 進行鬧鈴註冊
                AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
                manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                       5000, 24*60*60*1000,sender);
                Toast.makeText(MyActivity.this, "設定重複鬧鈴成功! ", Toast.LENGTH_LONG).show();
                break;
            case R.id.close_button:
                close();
                break;
        }
    }
    public  void close(){
        AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
        manager.cancel(sender);
        Toast.makeText(this,"關閉成功",Toast.LENGTH_LONG).show();
    }
}
broadcast程式碼
package com.example.Alarm;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AlarmBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //我這裡只是提醒,當然你可以做自己想要做的事
        Toast.makeText(context, "你設定的時間到了", Toast.LENGTH_LONG).show();
    }
}

以上是全部程式碼和解析,如有不對的地方還請指出,上面只是一個例子,瞭解之後可以實現不同的事情

(學習就是一個分享與探討,大家一起努力)




相關推薦

AlarmManager-----實現定時提醒

各位好,又幾天沒見了,我是一個Android菜鳥,這幾天專案要做個定時提醒業務,在網上看了很多資料,大多數都是關於AlarmManager去實現(雖然我個人覺得用它去實現不夠強大,和健壯,但是沒辦法,短時間內我找不到更好的辦法,畢竟開發工作才2個月不到,Android開發的

AlarmManager:android中的定時任務

1.概述 AlarmManager通常用途是用來開發手機鬧鐘,但是AlarmManager的用處並只是這個。AlarmManager其實是一個全域性定時器,它可以在指定時間或指定週期啟動其他元件,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設

quartz實現定時功能例項(servlet定時器配置方法)

<servlet>     <servlet-name>QuartzInitializer</servlet-name>     <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet<

java定時任務

導致 println 正常 延遲執行 first 指定 線程終止 ont 打印 在我們編程過程中如果需要執行一些簡單的定時任務,無須做復雜的控制,我們可以考慮使用JDK中的Timer定時任務來實現。下面LZ就其原理、實例以及Timer缺陷三個方面來解析java Timer定

webpack 外掛 html-webpack-plugin 的 實現html檔案自動生成

最近在學習webpack,接觸到的第一個外掛就是html-webpack-plugin,那麼今天就來詳解一下它的用法吧。 先來上一個例子: let htmlWebpackPlugin = require('html-webpack-plugin') const path

Android中AlarmManager以及利用PendingIntent設定鬧鐘

AlarmManager是提供一種訪問系統鬧鐘服務的方式,允許你去設定在將來的某個時間點去執行你的應用程式。當你的鬧鐘響起(時間到)時,在它上面註冊的一個意圖(Intent)將會被系統以廣播發出,然後自動啟動目標程式,如果它沒有正在執行。註冊的鬧鐘會被保留即使裝置處於休眠中

android AlarmManager,Alarm的設定和取消。

設定alarm的話,大概需要用到如下幾步: 1.建立一個Intent 2.建立一個PendingIntent 3.得到ALARM_SERVICE的AlarmManager 4.使用AlarmManager的set api,假如是取消,那就使用cancel an

java定時任務 (r)

在前面也提過scheduleAtFixedRate與schedule方法的側重點不同,schedule方法側重儲存間隔時間的穩定,而scheduleAtFixedRate方法更加側重於保持執行頻率的穩定。為什麼這麼說,原因如下。在schedule方法中會因為前一個任務的延遲而導致其後面的定時任務延時,而sch

SwipeListView 實現微信,QQ等滑動刪除效果

今天看別人專案,看到別人使用了SwipeListView,Google一把,果然github上的,也參考了csdn上的幾篇文章,然後自己寫了個例子,分享給大家。 效果圖: 嗯,看一眼SwipeListView的引數的設定: If you decide to u

SpringCloud微服務專案實戰 - API閘道器Gateway實現

前面講過zuul的閘道器實現,那為什麼今天又要講Spring Cloud Gateway呢?原因很簡單。就是Spring Cloud已經放棄Netflix Zuul了。現在Spring Cloud中引用的還是Zuul 1.x版本,而這個版本是基於過濾器的,是阻塞IO,不支援長連線。Zuul 2.x版本跟1.x

PHP實現執行定時任務的幾種思路

編輯 exists sched ebs conn 多系統 環境 提高效率 pac HP本身是沒有定時功能的,PHP也不能多線程。PHP的定時任務功能必須通過和其他工具結合才能實現,例如WordPress內置了wp-

PHP實現定時任務的五種方法

清理 toolbar 路徑 頁面 文檔 errors conf star 包含 定時運行任務對於一個網站來說,是一個比較重要的任務,比如定時發布文檔,定時清理垃圾信息等,現在的網站大多數都是采用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種A

springboot整合quartz定時實現定時任務

最近需要 做一個按照時間,定時初始化一些資訊的功能,研究了一下quartz,也簡單瞭解一下TimerTask,廢話不多說。 quartz和TimerTask的區別: timer是jdk自帶的(可想而知,肯定是不怎麼好用)。 Quartz可以通過cron表示式精確到特定時間執行,而T

Mysql:Java程式碼實現資料庫定時備份與還原

一、目的 使用java程式碼實現定時執行Mysql備份與還原。 二、思路 先寫好一個定時器,每隔多少時間執行一次備份 備份方法為,通過java向命令列寫入命令執行 首先在cmd中模擬備份,測試成功後 使用java程式碼實現資料備份功能

Android AlarmManager實現不間斷輪詢服務(定時提醒功能)

        在訊息的獲取上是選擇輪詢還是推送得根據實際的業務需要來技術選型,例如對訊息實時性比較高的需求,比如微博新通知或新聞等那就最好是用推送了。但如果只是一般的訊息檢測比如更新檢查,可能是半個小時或一個小時一次,那用輪詢也是一個不錯的選擇,因為不需要額外搭建推送伺服

AlarmManager+Notification實現定時通知提醒功能

AlarmManager簡介   AlarmManager實質是一個全域性的定時器,是Android中常用的一種系統級別的提示服務,在指定時間或週期性啟動其它元件(包括Activity,Service,BroadcastReceiver)。本文將講解一下如何使

PHP實現定時任務的幾種方式和

定時執行任務對於一個網站來說,是一個比較重要的任務,比如定時釋出文件,定時清理垃圾資訊等,現在的網站大多數都是採用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種AppServer的概念,而http協議是一個無狀態的協議,PHP只能被使用者觸

PHP實現執行定時任務的linux思路

由於公司需要定時對淘寶店家的資訊進行獲取並更新資料庫 所以需要定時執行任務。 PHP本身是沒有定時功能的,PHP也不能多執行緒。PHP的定時任務功能必須通過和其他工具結合才能實現,例如WordPress內建了wp-cron的功能,很厲害。本文,我們就來解析幾種常見的php

Linux系統使用--定時關機的實現以及crontab命令和檔案

一、前言 為了以後不用再半夜跑回實驗室關電腦,昨天中午花了兩個小時左右的時間搞了一下如何實現Linux系統的定時關機,結果沒搞出來。在老師的指點下得以解決,寫一部落格分享之。 另,發現現在網上的資料越發的不靠譜了,昨日查閱了那麼多資料都沒有解決問題。

心跳包定時實現(Timer和TimerTask

如果要執行一些簡單的定時器任務,無須做複雜的控制,也無須儲存狀態,那麼可以考慮使用JDK 入門級的定期器Timer來執行重複任務。一、原理JDK中,定時器任務的執行需要兩個基本的類:java.util.Timer;java.util.TimerTask;要執行一個定時任務,最