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。
上程式碼:
- package com.ianc.lily;
- import android.app.Activity;
- import android.app.AlarmManager;
-
import android.app.PendingIntent;
- import android.content.Context;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
-
publicclass LaunchActivity extends Activity implements
- staticfinal String LILY_TEST_INTENT = "com.ianc.lilytestintent";
- staticfinal String ID = "id";
- staticfinal String TIME = "alarm_time";
- int id;
- Button addBtn;
- Button cancelBtn;
- /** Called when the activity is first created. */
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- id = 1;
- addBtn = (Button) findViewById(R.id.addbtn);
- cancelBtn = (Button) findViewById(R.id.cancelbtn);
- addBtn.setOnClickListener(this);
- cancelBtn.setOnClickListener(this);
- }
- @Override
- publicvoid onClick(View v) {
- if (v == addBtn){
- AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(LILY_TEST_INTENT);
- intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));
- intent.setClass(this, LilyReceiver.class);
- intent.putExtra(ID, id);
- long atTimeInMillis = System.currentTimeMillis() + 5000;
- intent.putExtra(TIME, atTimeInMillis);
- // intent.putExtra(LABEL, label);
- // intent.putExtra(TIME, atTimeInMillis);
- PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
- am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);
- Log.i("lily","add alarm");
- }
- elseif (v == cancelBtn){
- AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(LILY_TEST_INTENT);
- intent.setClass(this, LilyReceiver.class);
- intent.setData(Uri.parse("content://calendar/calendar_alerts/1"));
- // id = 2;
- // Log.i("lily","id = 2");
- // intent.putExtra(ID, id);
- PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_NO_CREATE);
- if (sender != null){
- Log.i("lily","cancel alarm");
- am.cancel(sender);
- }else{
- Log.i("lily","sender == null");
- }
- }
- }
- }
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
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.ianc.lily"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".LaunchActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <receiverandroid:name="LilyReceiver">
- <intent-filter>
- <actionandroid:name="com.ianc.lilytestintent"/>
- <dataandroid:mimeType="vnd.android.cursor.item/calendar-alert"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
LilyReceiver.java
- package com.ianc.lily;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.util.Log;
- import android.widget.Toast;
- publicclass LilyReceiver extends BroadcastReceiver {
- @Override
- publicvoid onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- int id = intent.getIntExtra("id", -1);
- long alarmtime= intent.getLongExtra("alarm_time", -1);
- Log.i("lily","received action = "+action+", id = "+id+ ", alarmtime = "+alarmtime);
- Toast.makeText(context, "received action = "+action+", id = "+id, Toast.LENGTH_SHORT).show();
- }
- }
相關推薦
android AlarmManager詳解,Alarm的設定和取消。
設定alarm的話,大概需要用到如下幾步: 1.建立一個Intent 2.建立一個PendingIntent 3.得到ALARM_SERVICE的AlarmManager 4.使用AlarmManager的set api,假如是取消,那就使用cancel an
android WebView詳解,常見漏洞詳解和安全原始碼(上)
這篇部落格主要來介紹 WebView 的相關使用方法,常見的幾個漏洞,開發中可能遇到的坑和最後解決相應漏洞的原始碼,以及針對該原始碼的解析。 由於部落格內容長度,這次將分為上下兩篇,上篇詳解 WebView 的使用,下篇講述 WebView 的漏洞和
POI操作Excel詳解,讀取xls和xlsx格式的文件
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 重
Android中AlarmManager詳解以及利用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中的介面回撥詳解,回撥機制:以Activity和Adapter傳遞資料為例。
首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了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) 結果:
詳解如何在Centos6和Centos7兩個版本上,執行Cobbler無人值守安裝!
信息 cgroup 內容 manager 外網 oar 關聯 done 足夠 Cobbler介紹: Cobbler是一個Linux服務器快速網絡安裝的服務,而且在經過調整也可以支持網絡安裝windows。該工具使用python開發,小巧輕便(才15k行python代碼),可
Android開發詳解之onTouch和onClick詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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操作Excel詳解,HSSF和XSSF兩種方式
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