下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】Android中怎么設置鬧鐘
Android中怎么設置鬧鐘,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。API19以上AlarmManager機制的修改API19之前AlarmManager提供了三個設置鬧鐘的方法,由于業(yè)務需求鬧鐘只需要一次性,所以采用set(inttype,long
startTime,PendingIntentpi);這個方法。從API
19開始,AlarmManager的機制都是非準確傳遞,操作系統將會轉換鬧鐘,來最小化喚醒和電池使用。由于之前的程序,沒有對API19以上的鬧鐘設置做處理,導致在4.4以上的手機設置鬧鐘無響應(應用程序沒有被殺死的情況也沒有鬧鐘)。因些,設置鬧鐘需要根據API的版本進行分別處理設置。代碼如下:AlarmManager
am
=
(AlarmManager)
getActivity()
.getSystemService(Context.ALARM_SERVICE);
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.KITKAT)
{
am.setExact(AlarmManager.RTC_WAKEUP,
TimeUtils
.stringToLong(recordTime,
TimeUtils.NO_SECOND_FORMAT),
sender);
}else
{
am.set(AlarmManager.RTC_WAKEUP,
TimeUtils
.stringToLong(recordTime,
TimeUtils.NO_SECOND_FORMAT),
sender);
}這樣,保證鬧鐘在應用程序沒有被Kill掉的情況鬧鐘。應用程序被Kill掉時的處理應用程序被Kill掉后,設置的鬧鐘失效,這里利用守護進程以及灰色保活來保證后臺鬧鐘服務不被Kill掉。當應用程序以及鬧鐘服務被Kill掉,守護進程以及灰色?;顏碇匦聠郁[鐘服務,并且重新設置鬧鐘。關于守護進程的處理,這里采用開源的守護進程庫。Android-AppDaemon在鬧鐘服務的onCreat加入Android-AppDaemon這個開源的守護進程。代碼如下:@Override
public
void
onCreate()
{
super.onCreate();
Daemon.run(DaemonService.this,
DaemonService.class,
Daemon.INTERVAL_ONE_MINUTE);
startTimeTask();
grayGuard();
}為進一步保證鬧鐘服務的存活,同加上灰色?;?利用系統的漏洞啟動前臺Service)。代碼如下:private
void
grayGuard()
{
if
(Build.VERSION.SDK_INT
<
18)
{
//API
<
18
,此方法能有效隱藏Notification上的圖標
startForeground(GRAY_SERVICE_ID,
new
Notification());
}
else
{
Intent
innerIntent
=
new
Intent(this,
DaemonInnerService.class);
startService(innerIntent);
startForeground(GRAY_SERVICE_ID,
new
Notification());
}
//發(fā)送喚醒廣播來促使掛掉的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)
{
alarmManager.setWindow(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(),
ALARM_INTERVAL,
operation);
}else
{
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(),
ALARM_INTERVAL,
operation);
}
}
/**
*
給
API
>=
18
的平臺上用的灰色?;钍侄?/p>
*/
public
static
class
DaemonInnerService
extends
Service
{
@Override
public
void
onCreate()
{
Log.i(LOG_TAG,
"InnerService
->
onCreate");
super.onCreate();
}
@Override
public
int
onStartCommand(Intent
intent,
int
flags,
int
startId)
{
Log.i(LOG_TAG,
"InnerService
->
onStartCommand");
startForeground(GRAY_SERVICE_ID,
new
Notification());
//stopForeground(true);
stopSelf();
return
super.onStartCommand(intent,
flags,
startId);
}
@Override
public
IBinder
onBind(Intent
intent)
{
throw
new
UnsupportedOperationException("Not
yet
implemented");
}
@Override
public
void
onDestroy()
{
Log.i(LOG_TAG,
"InnerService
->
onDestroy");
super.onDestroy();
}
}上面操作盡可能提高鬧鐘服務的存活。但是在5.0以上的手機,利用系統的自帶的Clean功能的時候,還是會將鬧鐘服務徹底的干掉。為了解決5.0以上的問題,這里引入5.0以上的新特性
JobScheduler。5.0以上的JobScheduler關于5.0新增JobScheduler·API可以先閱讀這篇文章。here在這里利用5.0以上的JobScheduler創(chuàng)建一個定時的任務,定時檢測鬧鐘服務是否存在,沒在存在則重新啟動鬧鐘服務。(這里我設置每一分鐘檢測一次鬧鐘服務)在進入應用程序的時候檢測當前系統是否是5.0以上,如果是則啟動JobScheduler這個服務。代碼如下:if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.LOLLIPOP)
{
mJobScheduler
=
(JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder
builder
=
new
JobInfo.Builder(JOB_ID,
new
ComponentName(getPackageName(),
JobSchedulerService.class.getName()));
builder.setPeriodic(60
*
1000);
//每隔60秒運行一次
builder.setRequiresCharging(true);
builder.setPersisted(true);
//設置設備重啟后,是否重新執(zhí)行任務
builder.setRequiresDeviceIdle(true);
if
(mJobScheduler.schedule(builder.build())
<=
0)
{
//If
something
goes
wrong
}
}其中的builder.setPersisted(true);方法是設備重啟后,是否重新執(zhí)行任務,在這測過是可以重新啟動任務的。上面的操作進一步保證了鬧鐘服務被Kill掉后,重新啟動服務。但是在6.0以上引入了Doze模式,當6.0以上的手機進入這個模式后,便會使JobScheduler停止工作。6.0以上Doze模式的處理為了讓JobScheduler可以在6.0以上進入Doze模式工作,這里針對6.0以上的Doze模式做特殊的處理-忽略電池的優(yōu)化。在Manifest.xml中加入權限。<uses-permission
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>在設置鬧鐘的時候,判斷系統是否是6.0以上,如果是,則判斷是否忽略電池的優(yōu)化。判斷是否忽略電池優(yōu)化代碼如下:TargetApi(Build.VERSION_CODES.M)
public
static
boolean
isIgnoringBatteryOptimizations(Activity
activity){
String
packageName
=
activity.getPackageName();
PowerManager
pm
=
(PowerManager)
activity
.getSystemService(Context.POWER_SERVICE);
if
(pm.isIgnoringBatteryOptimizations(packageName))
{
return
true;
}else
{
return
false;
}
}如果沒有忽略電池優(yōu)化的時候,彈出提醒對話框,提示用戶進行忽略電池優(yōu)化操作。代碼如下:/**
*
針對N以上的Doze模式
*
*
@param
activity
*/
public
static
void
isIgnoreBatteryOption(Activity
activity)
{
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.M)
{
try
{
Intent
intent
=
new
Intent();
String
packageName
=
activity.getPackageName();
PowerManager
pm
=
(PowerManager)
activity.getSystemService(Context.POWER_SERVICE);
if
(!pm.isIgnoringBatteryOptimizations(packageName))
{
//
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:"
+
packageName));
activity.startActivityForResult(intent,
REQUEST_IGNORE_BATTERY_CODE);
}
}
catch
(Exception
e)
{
e.printStackTrace();
}
}
}在界面重寫onActivityResult方法來捕獲用戶的選擇。如,代碼如下:@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
if
(resultCode
==
RESULT_OK)
{
if
(requestCode
==
BatteryUtils.REQUEST_IGNORE_BATTERY_CODE){
//TODO
something
}
}else
if
(resultCode
==
RESULT_CANCELED){
if
(requestCode
==
BatteryUtils.REQUEST_IGNORE_BATTERY_CODE){
ToastUtils.show(getActivity(),
"請開啟忽略電池優(yōu)化~");
}
}
}補充當應用程序被Kill掉,但是鬧鐘的服務沒有被Kill掉的,這時候又設置了鬧鐘。這就意味著設置的鬧鐘沒有放到鬧鐘服務那里。所以這種情況,設置的鬧鐘會失效。為了解決這種情況,利用AIDL(鬧鐘服務在另一個進程的需要進程間通信)調用鬧鐘服務的重新設置鬧鐘方法重設鬧鐘。在應用程序的onCreat()方法啟動鬧鐘服務,然后再綁定鬧鐘服務。private
void
initAlarmService()
{
startService(new
Intent(this,
DaemonService.class));//啟動鬧鐘服務
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.LOLLIPOP)
{
//JobScheduler
...
}
//綁定鬧鐘服務
Intent
intent
=
new
Intent(this,
DaemonService.class);
intent.setAction("ent.action.DaemonService");
bindService(intent,
mConnection,
Context.BIND_AUTO_CREATE);
}在onDestroy()方法,調用鬧鐘服務的重設鬧鐘方法。代碼如下:@Override
protected
vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋交易終止合同范本
- 農村土地出售合同書樣本
- 停車場租賃合同協議書范文
- 2024養(yǎng)殖場土地承包合同
- 股票投資代持協議書
- 2024年彩鋼瓦安裝合同書
- 2024產權轉讓居間合同協議書
- 工程機械運輸合同模板
- 個人之間專利權轉讓協議范本
- 2024年按揭房屋歸女方離婚協議書
- 2024全球量子產業(yè)發(fā)展報告
- 場地移交安全管理協議書
- 醫(yī)院卒中中心建設各種制度、流程匯編
- 重慶市江北區(qū)2023-2024學年六年級下學期期末考試數學試題
- 軍隊文職聘用合同管理規(guī)定
- 2024年貴州省安順市西秀區(qū)小升初語文試卷
- 2024-2029年中國兒童牙冠行業(yè)市場現狀分析及競爭格局與投資發(fā)展研究報告
- 新時代鐵路發(fā)展面對面全文內容
- 人工智能與語文閱讀理解教學
- 科學素養(yǎng)培育及提升-知到答案、智慧樹答案
- 快遞主管崗位職責
評論
0/150
提交評論