1. 程式人生 > >android AlarmManager詳解,Alarm的設定和取消。

android AlarmManager詳解,Alarm的設定和取消。

設定alarm的話,大概需要用到如下幾步:

1.建立一個Intent

2.建立一個PendingIntent

3.得到ALARM_SERVICE的AlarmManager

4.使用AlarmManager的set api,假如是取消,那就使用cancel

android自帶的AP對於Alarm的管理是很巧妙的,例如Calendar,它基本上只會給系統設定一個alarm,等這個alarm結束之後,再設定下一個,這種模式很安全,也很有效,我認為這是一個值得學習的模式。

我之前一直有個疑問,設定的alarm,取消時,究竟要傳怎樣的PendingIntent系統才能知道我要取消的是哪一個

後來經過實驗,我發現大概有這樣幾個引數會起決定作用,在我上面講的四個步驟的第一步,Intent 的setData,setClass均能區別出,但是

putExtra卻是沒有用的。另外在PendingIntent.getBroadcast的第二個引數requestCode,查api,Google說這個引數沒用的,但是其實它也是可以區別出不同的alarm。

上程式碼:

  1. package com.ianc.lily;  
  2. import android.app.Activity;  
  3. import android.app.AlarmManager;  
  4. import android.app.PendingIntent;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. publicclass LaunchActivity extends Activity implements
     OnClickListener {  
  14.     staticfinal String LILY_TEST_INTENT = "com.ianc.lilytestintent";  
  15.     staticfinal String ID = "id";  
  16.     staticfinal String TIME = "alarm_time";  
  17.     int id;  
  18.     Button addBtn;  
  19.     Button cancelBtn;  
  20.     /** Called when the activity is first created. */
  21.     @Override
  22.     publicvoid onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         id = 1;  
  26.         addBtn = (Button) findViewById(R.id.addbtn);  
  27.         cancelBtn = (Button) findViewById(R.id.cancelbtn);  
  28.         addBtn.setOnClickListener(this);  
  29.         cancelBtn.setOnClickListener(this);  
  30.     }  
  31.     @Override
  32.     publicvoid onClick(View v) {  
  33.         if (v == addBtn){  
  34.             AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
  35.             Intent intent = new Intent(LILY_TEST_INTENT);  
  36.             intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));  
  37.             intent.setClass(this, LilyReceiver.class);  
  38.             intent.putExtra(ID, id);  
  39.             long atTimeInMillis = System.currentTimeMillis() + 5000;  
  40.             intent.putExtra(TIME, atTimeInMillis);  
  41. //          intent.putExtra(LABEL, label);
  42. //          intent.putExtra(TIME, atTimeInMillis);
  43.             PendingIntent sender = PendingIntent.getBroadcast(this0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
  44.             am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);  
  45.             Log.i("lily","add alarm");  
  46.         }  
  47.         elseif (v == cancelBtn){  
  48.             AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
  49.             Intent intent = new Intent(LILY_TEST_INTENT);  
  50.             intent.setClass(this, LilyReceiver.class);  
  51.             intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));  
  52. //          id = 2;
  53. //          Log.i("lily","id = 2");
  54. //          intent.putExtra(ID, id);
  55.             PendingIntent sender = PendingIntent.getBroadcast(this0, intent, PendingIntent.FLAG_NO_CREATE);  
  56.             if (sender != null){  
  57.                 Log.i("lily","cancel alarm");  
  58.                 am.cancel(sender);  
  59.             }else{  
  60.                 Log.i("lily","sender == null");  
  61.             }  
  62.         }  
  63.     }  
  64. }  

1.Intent中的setData使用的值,必須和cancel中intent裡面setData用的值一樣,否則點選cancel是沒法取消掉的,或者你不setData,那也是沒法取消的

2.Intent中的setClass使用的值也必須和cancel眾intent使用的一樣,不然也cancel不掉,不setClass也cancel不了

3.Intent中的putExtra是無效的,根本不起區別的作用

4.getBroadcast的第二個引數,一般的ap都是寫0,其實假如你前面的intent只有setAction過,那麼單純用reqeustCode也是可以區別不同的alarm的。

5.通常cancel之前可以先用PendingIntent.FLAG_NO_CREATE來判斷之前是不是設定了這個alarm,假如沒設定,那就不要去呼叫cancel

補充工程中的次要程式碼:

AndroidManifest.xml

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.ianc.lily"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7.         <activityandroid:name=".LaunchActivity"
  8.                   android:label="@string/app_name">
  9.             <intent-filter>
  10.                 <actionandroid:name="android.intent.action.MAIN"/>
  11.                 <categoryandroid:name="android.intent.category.LAUNCHER"/>
  12.             </intent-filter>
  13.         </activity>
  14.         <receiverandroid:name="LilyReceiver">
  15.             <intent-filter>
  16.                 <actionandroid:name="com.ianc.lilytestintent"/>
  17.                 <dataandroid:mimeType="vnd.android.cursor.item/calendar-alert"/>
  18.             </intent-filter>
  19.         </receiver>
  20.     </application>
  21. </manifest>
 

LilyReceiver.java

  1. package com.ianc.lily;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.util.Log;  
  6. import android.widget.Toast;  
  7. publicclass LilyReceiver extends BroadcastReceiver {  
  8.     @Override
  9.     publicvoid onReceive(Context context, Intent intent) {  
  10.         String action = intent.getAction();  
  11.         int id = intent.getIntExtra("id", -1);  
  12.         long alarmtime= intent.getLongExtra("alarm_time", -1);  
  13.         Log.i("lily","received action = "+action+", id = "+id+ ", alarmtime = "+alarmtime);  
  14.         Toast.makeText(context, "received action = "+action+", id = "+id, Toast.LENGTH_SHORT).show();  
  15.     }  
  16. }  
 

相關推薦

android AlarmManagerAlarm設定取消

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

android WebView常見漏洞安全原始碼(上)

  這篇部落格主要來介紹 WebView 的相關使用方法,常見的幾個漏洞,開發中可能遇到的坑和最後解決相應漏洞的原始碼,以及針對該原始碼的解析。   由於部落格內容長度,這次將分為上下兩篇,上篇詳解 WebView 的使用,下篇講述 WebView 的漏洞和

POI操作Excel讀取xlsxlsx格式的文件

shee xss split 類型 後綴 .sh lan xls lin package org.ian.webutil; import java.io.File; import java.io.FileInputStream; import java.io.FileN

Android系統之獲取圖片視訊的縮圖

從Android 2.2開始系統新增了一個縮圖ThumbnailUtils類,位於framework的android.media.ThumbnailUtils位置,可以幫助我們從mediaprovider中獲取系統中的視訊或圖片檔案的縮圖,該類提供了三種靜態方法可以直接呼

django開發之許可權管理(二)——許可權管理(許可權的設定中介軟體的使用者session獲取)

注意 每次開發的時候 都先要理清楚要做什麼?要實現怎麼樣的功能?要怎麼實現? 在 django中 一般分這幾步走:設計url,設計檢視函式,從資料庫中拿資料進行渲染 這裡其實是django的請求生命週期 1、請求生命週期 wsgi, 他就是socket服務端,用於

linux下.tar.gz.gz檔案zip壓縮unzip壓縮命令

.tar.gz和.gz檔案是兩種不同的檔案,需要區別對待,解壓命令當然也不同咯,下面來分享一下他們各自的解壓方法。1. .tar.gz檔案,這種檔案是tar檔案的壓縮檔案,可以使用tar命令進行解壓。例如:解壓:tar zxvf pythontab.tar.gztar -xj

Android Scroller實現仿QQ列表item側滑刪除功能

概述 Scroller,主要用於實現View的滾動。這個滾動主要是指平滑滾動 要想通過Scroller實現滑動,只要實現以下步驟即可: 建立一個Scroller物件,呼叫startScroll方法,然後呼叫invalidate()方法重新繪製View 重

AndroidAlarmManager以及利用PendingIntent設定鬧鐘

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

android介面開發:ViewPager的並用於仿微博滑動例項圖片滾動例項

1.ViewPager簡單使用 ViewPager是android擴充套件包android.support.v4 裡的一個繼承與ViewGroup元件,通過佈局管理器可以實現左右滑動來顯示不同的View。而這個View由PagerAdapter產生,用法類似於

android 開發 View _14 MotionEvent事件處理與實踐自定義滑動條View

MotionEvent MotionEvent物件是與使用者觸控相關的時間序列,該序列從使用者首次觸控式螢幕幕開始,經歷手指在螢幕表面的任何移動,直到手指離開螢幕時結束。手指的初次觸控(ACTION_DOWN操作),滑動(ACTION_MOVE操作)和擡起(ACTION

Android中的介面回撥回撥機制:以ActivityAdapter傳遞資料為例

首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該

pyhton之淺拷貝(copy)深拷貝(deepcopy)舉例說明

python copy deepcopy a = [1, 2, [‘a‘, ‘b‘]]a1 = ab = copy.copy(a)c = copy.deepcopy(a)a.append(3)a[2].append(‘c‘)print(a)print(a1)print(b)print(c) 結果:

如何在Centos6Centos7兩個版本上執行Cobbler無人值守安裝!

信息 cgroup 內容 manager 外網 oar 關聯 done 足夠 Cobbler介紹: Cobbler是一個Linux服務器快速網絡安裝的服務,而且在經過調整也可以支持網絡安裝windows。該工具使用python開發,小巧輕便(才15k行python代碼),可

Android開發之onTouchonClick

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

#圖文:從實際理論出發帶你瞭解Java中的多執行緒

這裡並沒有講什麼新東西,只是把多執行緒一些知識來個總結。大家懂得可以複習複習,還有些童鞋對多執行緒朦朧的可以拿這個做為入門~ 舉個栗子說明啥是多執行緒:玩遊戲,前面一堆怪,每個怪都是一個執行緒,你射了一槍,子彈飛出去了,這顆子彈也是一個執行緒。你開啟你的程序管理,看到你遊戲的後臺程序,這就是程序

N溝道MOS管P溝道MOS管

出處:P溝道mos管作為開關的條件(GS >GS(TH)) 1、P溝道mos管作為開關,柵源的閥值為-0.4V,當柵源的電壓差為-0.4V就會使DS導通,如果S為2.8V,G為1.8V,那麼GS=-1V,mos管導通,D為2.8V 如果S為2.8V,G為2.8V,VGSw 那麼mo

POI操作ExcelHSSFXSSF兩種方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

Android MVP+retrofit +rxjava+glide recyclerview使用 條目點選 長按點選三種管理器 分割線

首先是對應的依賴  implementation 'com.android.support:recyclerview-v7:26.1.0' 下面是對應的介面卡 裡面對應的 有點選的註釋 public class HomeAdaper extends RecyclerV

Python時間獲取Django獲取時間模板中獲取時間(navie時間aware時間)

# 1、Python獲取到的時間 import pytz from datetime import datetime now = datetime.now() # 這個時間為navie時間(自己不

Android RecyclerView RecyclerView的動畫實現(移除、新增、改變、移動)自定義動畫的實現

一丶新增刪除時候的重新整理問題 先上一下效果圖吧 1.為了方便起見我們還是先新增三個按鈕分別實現新增刪除和改變 2.在Adapter中寫呼叫方法並進行重新整理 public void remove(int position){ list.re