【移动应用开发技术】Android中怎么设置闹钟_第1页
【移动应用开发技术】Android中怎么设置闹钟_第2页
【移动应用开发技术】Android中怎么设置闹钟_第3页
【移动应用开发技术】Android中怎么设置闹钟_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android中怎么设置闹钟

Android中怎么设置闹钟,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。API19以上AlarmManager机制的修改API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一次性,所以采用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());

}

//发送唤醒广播来促使挂掉的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

的平台上用的灰色保活手段

*/

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创建一个定时的任务,定时检测闹钟服务是否存在,没在存在则重新启动闹钟服务。(这里我设置每一分钟检测一次闹钟服务)在进入应用程序的时候检测当前系统是否是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);

//设置设备重启后,是否重新执行任务

builder.setRequiresDeviceIdle(true);

if

(mJobScheduler.schedule(builder.build())

<=

0)

{

//If

something

goes

wrong

}

}其中的builder.setPersisted(true);方法是设备重启后,是否重新执行任务,在这测过是可以重新启动任务的。上面的操作进一步保证了闹钟服务被Kill掉后,重新启动服务。但是在6.0以上引入了Doze模式,当6.0以上的手机进入这个模式后,便会使JobScheduler停止工作。6.0以上Doze模式的处理为了让JobScheduler可以在6.0以上进入Doze模式工作,这里针对6.0以上的Doze模式做特殊的处理-忽略电池的优化。在Manifest.xml中加入权限。<uses-permission

android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>在设置闹钟的时候,判断系统是否是6.0以上,如果是,则判断是否忽略电池的优化。判断是否忽略电池优化代码如下: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;

}

}如果没有忽略电池优化的时候,弹出提醒对话框,提示用户进行忽略电池优化操作。代码如下:/**

*

针对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(),

"请开启忽略电池优化~");

}

}

}补充当应用程序被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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论