下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版小学六年级上册数学期末测试卷及参考答案(新)
- 五年级下册道德与法治第一单元《我们是一家人》测试卷含答案(b卷)
- 一年级上册数学应用题大全带答案(培优b卷)
- 人教版二年级上册数学期末测试卷带答案(培优b卷)
- 2022人教版六年级上册数学期末卷带答案(b卷)
- 人教版三年级下册数学期中测试卷及参考答案(综合卷)
- 2022小学三年级上册道德与法治-期末测试卷含完整答案(必刷)
- 2022年数学六年级上册期末考试试卷带答案(a卷)
- 2022小学三年级上册道德与法治-期末测试卷及参考答案(巩固)
- 谈探究性学习的若干策略 论文
- 新生儿先天性心脏病筛查、诊治考核试题及答案
- 无人机产业供应链管理实施方案
- 【基于灰色系统的房价分析与预测实证案例6600字(论文)】
- 四川省成都市金牛区2024届生物七年级第二学期期末学业质量监测试题含解析
- 山西省医疗服务项目收费
- 嵌入式智能宿舍课程设计
- 历年全国高考英语完形填空试题汇总及答案
- 2023年秋季国家开放大学-01513-网络应用服务管理期末考试题带答案
- 就业考试舆情应急处置预案
- Unit+5+What+an+Adventure!+Understanding+ideas+Climbing+Qomolangma+worth+the+risk+课件【知识精讲精研】外研版高中英语2019
- 人教版七年级下册英语常考作文整理含范文全套
评论
0/150
提交评论