笔者上篇做了一个定时提醒的小应用,但是最后遗留了一个问题,那就是如果设置提醒的间隔时间过长,那么计时的service便会被android系统kill掉。(主要是由于android自带内存清理)

在进行了大量的查阅和测试后,笔者终于解决了该问题:

当然,在此也要稍微提一下,笔者只测试了,在以一小时为左右的时间内可以不被杀死,还没有测试2个小时以上的情况,更没有测试以天为单位的时间,具体测试如下:(item右下角是程序执行的时间)

![](https://box.kancloud.cn/2016-03-01_56d551ef823d5.jpg)

好了,进入正题,如何解决service会被kill的情况呢?

那就是设置**前台服务**,那什么是前台服务呢?

如果你希望服务可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台服务。前台服务和普通服务最大的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。

接下来就以墨迹天气为例,如下图:

![](https://box.kancloud.cn/2016-03-01_56d551efb0ece.jpg)

大家有没有想过,墨迹天气是如何能够在后台不断更新通知栏的中天气,并且不被kill掉的呢?

没错,就是用到了**前台服务**。好了,接下来就讲一下具体怎么使用。

首先看一下整个Service的代码:

~~~

public class LongRunningService extends Service {

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

//启用前台服务,主要是startForeground()

Notification notification = new Notification(R.drawable.queen2, "用电脑时间过长了!白痴!"

, System.currentTimeMillis());

notification.setLatestEventInfo(this, "快去休息!!!",

"一定保护眼睛,不然遗传给孩子,老婆跟别人跑啊。", null);

//设置通知默认效果

notification.flags = Notification.FLAG_SHOW_LIGHTS;

startForeground(1, notification);

AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

//读者可以修改此处的Minutes从而改变提醒间隔时间

//此处是设置每隔55分钟启动一次

//这是55分钟的毫秒数

int Minutes = 55 * 60 * 1000;

//SystemClock.elapsedRealtime()表示1970年1月1日0点至今所经历的时间

long triggerAtTime = SystemClock.elapsedRealtime() + Minutes;

//此处设置开启AlarmReceiver这个Service

Intent i = new Intent(this, AlarmReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

//ELAPSED_REALTIME_WAKEUP表示让定时任务的出发时间从系统开机算起,并且会唤醒CPU。

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

//在Service结束后关闭AlarmManager

AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

Intent i = new Intent(this, AlarmReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

manager.cancel(pi);

}

}

~~~

在笔者的代码中,最核心的部分如下:

~~~

//启用前台服务,主要是startForeground()

Notification notification = new Notification(R.drawable.queen2, "用电脑时间过长了!白痴!"

, System.currentTimeMillis());

notification.setLatestEventInfo(this, "快去休息!!!",

"一定保护眼睛,不然遗传给孩子,老婆跟别人跑啊。", null);

//设置通知默认效果

notification.flags = Notification.FLAG_SHOW_LIGHTS;

startForeground(1, notification);

~~~

此处和通知的使用特别像,但是并没有使用NotificationManager来讲通知显示出来,而是调用了startForeground()方法。调用startForeground()方法后就会让这个Service(在笔者的代码中是LongRunningService)变成一个前台服务了,并且会在系统状态栏显示出来。

可能有部分读者还是不太明白,那么便由笔者再仔细说一下。

在笔者的代码中,除了笔者所说的核心部分外,笔者主要实现了后台计时的功能。倘若笔者不使用前台服务,那么后台计时的服务很可能在运行了几十分钟甚至几分钟的时候就被android系统给回收了。

在设置前台服务后,LongRunningService这个服务成为了前台服务,那么其中实现的功能也是会被系统当做了前台任务运行,并且不会回收,于是便能一直运行了。

当然此方法也是需要慎用,倘若使用了,便会存在android系统不会去自动杀死的一个服务,如果该服务在一直执行,那么手机内存占用和手机耗电量都会自然增加,说不定也会降低用户体验哦。

android前台服务也被杀,android如何让后台服务service不被杀死(设置前台服务)相关推荐

  1. mysql安装服务和安装中常见问题install/Remove of the Service Denied与net start mysql服务启动失败解决方法

    mysql安装服务和安装中常见问题install/Remove of the Service Denied与net start mysql服务启动失败解决方法 参考文章: (1)mysql安装服务和安 ...

  2. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  3. Android 杀不掉的后台服务的一种实现

    有些应用程序需要后台的常驻服务,但没有任何处理时服务会被系统不定时的杀掉,特别是在内存不足时.同时服务也极容易被第三方软件释放内存时清理掉,今天同过一种实现方式来解决上述问题. 在上代码前,我们应该简 ...

  4. Android开发之如何保证Service不被杀掉(前台服务)

    序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运行,不管用户作出什么操作,都要保证service不被kill.参考了现今各种定制版的系统和安全厂商牛虻软件,如何能保证自 ...

  5. android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...

  6. android启动服务的生命周期,android Service启动运行服务 生命周期

    Service Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉, 可以使用它开发如监控之类的程序. 一.步骤 ...

  7. android中服务播放音乐,为什么我们需要Android中的服务?音乐播放也可以通过后台线程完成...

    采访中有人问我这个问题.我不确定这是否是问这个问题的合适论坛,因为它不涉及任何代码,而是对android概念的理解. 问题是"当所有事情都可以通过Android中的后台线程完成时,为什么我们 ...

  8. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  9. android 服务是什么问题,Android Studio 中的Service问题

    新手,在学习Service一开始就碰到了问题 是根据教程做的,在开启服务时闪退 MyService.java package com.example.administrator.myhhhhh; im ...

  10. 第89章、系统服务之SMS服务(从零开始学Android)

    每逢佳节,中国移动.电信.联通都是偷偷笑的日子,又不知道多少短信费用纳入囊中,尽管微信.QQ.飞信漫天飞,但仍然阻挡不了节日祝福短信的火爆,但群发实在没有意义,你是不是想来一个既个性而又群发呢? 譬如 ...

最新文章

  1. DOS调用21H存取中断向量
  2. Java学习小程序(10)三个等级的才字母游戏
  3. 光电数字直接式中高压电力电能表
  4. redis aof持久化遇到的Can't open the append-only file Permissi
  5. poj 3728(LCA + dp)
  6. java 前置通知_spring aop中的前置通知
  7. 在线看大会!就来云栖号!
  8. java局部变量简述
  9. 数据预处理与数据分类预测
  10. HP的“高端”磁带库!
  11. 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?
  12. Android自定义View之绘制圆形头像
  13. 在 python 中使用 Selenium 报错self.capabilities = response['value'] KeyError: 'value'的解决办法
  14. vertica MySQL_Vertica数据库简介
  15. 【软考四】软件知识产权基础知识(做题)
  16. Ruoyi的功能简单介绍
  17. 【附源码】计算机毕业设计SSM民宿客房管理系统
  18. Oracle 强制中止正在执行的SQL语句
  19. Word电子扫描仪 word文档转换为图片Pdf,Word文档扫描成Pdf,word文档加密 word转图片 word转pdf
  20. Hadoop详解手册.pdf

热门文章

  1. windows7打不开html文件格式,mht是什么文件?Win7打不开mht格式文件的解决办法
  2. 理解神经网络:神经元的概念
  3. 神经网络的数学原理(二):神经元与神经网络
  4. mzy git学习,分支冲突,以及冲突解决(五)
  5. android 电视 vob格式转换,Android手机、Android智能电视、Android平板电脑视频和音频转换器---佳佳安卓视频格式转换器...
  6. Win 7 安装office visio
  7. 如何在php设置背景颜色,html如何设置背景颜色?两种方法教会你
  8. 小米4c怎么添加语言怎么设置在哪个文件夹,小米4C怎么加密图片?私密文件夹使用方法...
  9. SAP 财务-统驭科目
  10. 贴吧自动签到脚本linux,【渣作】shell脚本百度贴吧签到器