android設定鬧鐘並不像ios那樣這麼簡單,做過android設定鬧鐘的開發者都知道裡面的坑有多深。下面記錄一下,我解決android鬧鐘設定的解決方案。api19開始alarmmanager的機制修改。
應用程式被kill掉後,設定的鬧鐘不響。
6.0以上進入doze模式會使jobscheduler停止工作。
手機設定重啟後,鬧鐘失效問題。
api19之前alarmmanager提供了三個設定鬧鐘的方法,由於業務需求鬧鐘只需要一次性,所以採用set(int type,long starttime,pendingintent pi);這個方法。
從api 19開始,alarmmanager的機制都是非準確傳遞,作業系統將會轉換鬧鐘,來最小化喚醒和電池使用。
由於之前的程式,沒有對api19以上的鬧鐘設定做處理,導致在4.4以上的手機設定鬧鐘無響應(應用程式沒有被殺死的情況也沒有鬧鐘)。
因些,設定鬧鐘需要根據api的版本進行分別處理設定。**如下:
alarmmanager am = (alarmmanager) getactivity()這樣,保證鬧鐘在應用程式沒有被kill掉的情況鬧鐘。.getsystemservice(context.alarm_service);
if (build.version.sdk_int >= build.version_codes.kitkat) else
@override為進一步保證鬧鐘服務的存活,同加上灰色保活(利用系統的漏洞啟動前台service)。public void oncreate()
**如下:
private void grayguard() else上面操作盡可能提高鬧鐘服務的存活。但是在5.0以上的手機,利用系統的自帶的clean功能的時候,還是會將鬧鐘服務徹底的乾掉。為了解決5.0以上的問題,這裡引入5.0以上的新特性 jobscheduler。//傳送喚醒廣播來促使掛掉的ui程序重新啟動起來
alarmmanager alarmmanager = (alarmmanager) getsystemservice(context.alarm_service);
intent alarmintent = new intent();
alarmintent.setaction(wakereceiver.gray_wake_action);
pendingintent operation = pendingintent.getbroadcast(this,
wake_request_code, alarmintent, pendingintent.flag_update_current);
if (build.version.sdk_int >= build.version_codes.kitkat) else
} /**
* 給 api >= 18 的平台上用的灰色保活手段
*/public static class daemoninnerservice extends service
@override
public int onstartcommand(intent intent, int flags, int startid)
@override
public ibinder onbind(intent intent)
@override
public void ondestroy()
}
關於5.0新增jobscheduler·api可以先閱讀這篇文章。here
在這裡利用5.0以上的jobscheduler建立乙個定時的任務,定時檢測鬧鐘服務是否存在,沒在存在則重新啟動鬧鐘服務。(這裡我設定每一分鐘檢測一次鬧鐘服務)
在進入應用程式的時候檢測當前系統是否是5.0以上,如果是則啟動jobscheduler這個服務。**如下:
if (build.version.sdk_int >= build.version_codes.lollipop)其中的builder.setpersisted(true); 方法是裝置重啟後,是否重新執行任務,在這測過是可以重新啟動任務的。}
上面的操作進一步保證了鬧鐘服務被kill掉後,重新啟動服務。但是在6.0以上引入了doze模式,當6.0以上的手機進入這個模式後,便會使jobscheduler停止工作。
為了讓jobscheduler可以在6.0以上進入doze模式工作,這裡針對6.0以上的doze模式做特殊的處理-忽略電池的優化。
在manifest.xml中加入許可權。
在設定鬧鐘的時候,判斷系統是否是6.0以上,如果是,則判斷是否忽略電池的優化。判斷是否忽略電池優化**如下:@targetapi(build.version_codes.m)public static boolean isignoringbatteryoptimizations(activity activity)else
}
/**在介面重寫onactivityresult方法來捕獲使用者的選擇。如,**如下:* 針對n以上的doze模式
* * @param activity
*/public static void isignorebatteryoption(activity activity)
} catch (exception e)
} }
@override當應用程式被kill掉,但是鬧鐘的服務沒有被kill掉的,這時候又設定了鬧鐘。這就意味著設定的鬧鐘沒有放到鬧鐘服務那裡。所以這種情況,設定的鬧鐘會失效。為了解決這種情況,利用aidl(鬧鐘服務在另乙個程序的需要程序間通訊)呼叫鬧鐘服務的重新設定鬧鐘方法重設鬧鐘。protected void onactivityresult(int requestcode, int resultcode, intent data)
}else if (resultcode == result_canceled)
}}
在應用程式的oncreat()方法啟動鬧鐘服務,然後再繫結鬧鐘服務。
private void initalarmservice()在ondestroy()方法,呼叫鬧鐘服務的重設鬧鐘方法。**如下://繫結鬧鐘服務
intent intent = new intent(this, daemonservice.class);
intent.setaction("android.intent.action.daemonservice");
bindservice(intent, mconnection, context.bind_auto_create);
}
@override這裡說明一下,當服務啟動並且被繫結的情況下,unbindservice是不會停止服務的。具體可以檢視這篇文章。hereprotected void ondestroy()
if (!alarm.equals(""))
} else
}unbindservice(mconnection); //解除繫結服務。
} catch (exception e)
}
以上並不代表所有的android手機的鬧鐘都可以用,這只是盡最大的可能保證大部分的手機。
Android 鬧鐘設定最新版
系統各種公升級,對鬧鐘設定也是個各種修改,前人送的福利大多數不能用了,只能自己整.public class alarmmanagerutil public static void cancelalarm context context,string action,int id 設定起床鈴 param...
android鬧鐘的製作
首先獲取鬧鐘管理者alarmmanager,通過button中的方法setalarmone 實現 1.獲取當前calendar系統時間 2.彈出時間對話方塊 3.確定好選擇的時間timepickerdialog,timepickerdialog時間選擇器 4.設定鬧鐘 5.當之間一到intent實現...
Android中關於鬧鐘提醒的解決方案
來看分析和講解之前,先看看效果吧,效果圖如下 設定介面 鬧鐘提醒介面 對於alarmmanager裡的方法我就不逐一介紹了,如果都介紹講完估計就天黑了。alarmmanager這個類提供對系統鬧鐘服務的訪問介面。在api 19 以前,alarmmanager的常用方法有三個 set int type...