Android鬧鐘設定的解決方案

2021-07-24 23:18:16 字數 3723 閱讀 9217

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()

.getsystemservice(context.alarm_service);

if (build.version.sdk_int >= build.version_codes.kitkat) else

這樣,保證鬧鐘在應用程式沒有被kill掉的情況鬧鐘。

@override

public void oncreate()

為進一步保證鬧鐘服務的存活,同加上灰色保活(利用系統的漏洞啟動前台service)。

**如下:

private void grayguard()  else 

//傳送喚醒廣播來促使掛掉的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以上的手機,利用系統的自帶的clean功能的時候,還是會將鬧鐘服務徹底的乾掉。為了解決5.0以上的問題,這裡引入5.0以上的新特性 jobscheduler。

關於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

}

/**

* 針對n以上的doze模式

* * @param activity

*/public static void isignorebatteryoption(activity activity)

} catch (exception e)

} }

在介面重寫onactivityresult方法來捕獲使用者的選擇。如,**如下:

@override

protected void onactivityresult(int requestcode, int resultcode, intent data)

}else if (resultcode == result_canceled)

}}

當應用程式被kill掉,但是鬧鐘的服務沒有被kill掉的,這時候又設定了鬧鐘。這就意味著設定的鬧鐘沒有放到鬧鐘服務那裡。所以這種情況,設定的鬧鐘會失效。為了解決這種情況,利用aidl(鬧鐘服務在另乙個程序的需要程序間通訊)呼叫鬧鐘服務的重新設定鬧鐘方法重設鬧鐘。

在應用程式的oncreat()方法啟動鬧鐘服務,然後再繫結鬧鐘服務。

private void initalarmservice() 

//繫結鬧鐘服務

intent intent = new intent(this, daemonservice.class);

intent.setaction("android.intent.action.daemonservice");

bindservice(intent, mconnection, context.bind_auto_create);

}

在ondestroy()方法,呼叫鬧鐘服務的重設鬧鐘方法。**如下:

@override

protected void ondestroy()

if (!alarm.equals(""))

} else

}unbindservice(mconnection); //解除繫結服務。

} catch (exception e)

}

這裡說明一下,當服務啟動並且被繫結的情況下,unbindservice是不會停止服務的。具體可以檢視這篇文章。here

以上並不代表所有的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...