【移動應用開發(fā)技術】Android中怎么設置鬧鐘_第1頁
【移動應用開發(fā)技術】Android中怎么設置鬧鐘_第2頁
【移動應用開發(fā)技術】Android中怎么設置鬧鐘_第3頁
【移動應用開發(fā)技術】Android中怎么設置鬧鐘_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論