转载请注明出处:http://blog.csdn.net/chengbao315/article/details/50997218

最近读书读到了安卓的服务组件(再次推荐偶像的书,郭霖《第一行代码》),读过之后,忽然有种想要编写安卓四大组件小案例的冲动。与大家分享的同时,也能考核自己的学习成果。那么今天就开始第一篇吧:《服务的最佳实践》再实践——定时关闭程序。

作为一名传统的程序猿,编程之前首先想到的是设计需求:仿照一些播放器软件,可以定时关闭应用程序,在界面中可以设置定时时间,退出界面后还可以在系统状态栏显示软件运行状态,后台继续运行程序,直到定时结束给出提示关闭软件。就比如下面这个网上随便找的软件:

看到这,许多跟我一样的菜鸟可能跃跃欲试了,但是想必老鸟们又对此不屑一顾了吧。。。小弟新手一枚,不足之处请各位前辈多多指教,大神不喜勿喷,呵呵哒了解了设计需求,软件的设计思路就比较清晰了,无非是几个子功能的组合:界面设置定时时间,前台服务启动,安卓Alarm机制定时,关闭软件和提示。

首先来实现设置定时时间界面,在Eclipse中新建一个Android项目,然后写布局文件,布局比较简单,只需要一个TextView控件和Spinner控件就可以,具体设计根据个人喜好随意,打开activity_main.xml,加入如下代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/test" /><Spinnerandroid:id="@+id/degrees"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView1"android:layout_below="@+id/textView1"android:entries="@array/degrees" /></RelativeLayout> 

接着需要添加下拉列表项,打开values文件夹下string.xml文件,加入下拉列表item内容,加入如下代码:

   <string-array name="degrees"><item>请选择</item><item>10s钟</item><item>20s钟</item><item>30s钟</item><item>60s钟</item></string-array>

以上代码即可实现通过下拉列表选择设置定时时间的功能。界面布局有了,接下来实现前台服务的基本功能。新建AlarmService类继承Service,这个类中会在重写onCreate()方法中设置服务为前台服务,并在onStartCommand()方法中启动Alarm计时,AlarmService.java代码如下:

package com.example.servicetest;import android.app.AlarmManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;public class AlarmService extends Service{//设置定时时间public static int timelong = 0;// 定时计数器public static int tickCount = 0;@Overridepublic IBinder onBind(Intent intent){return null;}@Overridepublic void onCreate(){super.onCreate();Notification notification = new Notification(R.drawable.ic_launcher,"启动定时服务", System.currentTimeMillis());Intent notificationIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent, 0);notification.setLatestEventInfo(this, "ServerTest_app", "定时关闭应用程序",pendingIntent);// 设置为前台服务startForeground(1, notification);}@Overridepublic int onStartCommand(Intent intent,int flags,int startId){AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);// 设置1秒定时long setTime = 1000 + SystemClock.elapsedRealtime();Intent i = new Intent(this,AlarmReceiver.class);PendingIntent p = PendingIntent.getBroadcast(this,0,i,0);//设置定时任务manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,setTime,p);return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy(){super.onDestroy();}
}

在onCreate()方法中,先创建了一个通知,将通知作为一个参数传递到startForeground()方法中,这个方法可以将Service变成一个前台服务。关于通知的使用方法可以阅读郭霖《第一行代码》第八章。在onStartCommand()方法中,首先获取一个AlarmManager实例,设置定时时间为1秒钟,并且获取一个广播的PendingIntent 作为参数,当定时任务触发时会广播给应用程序。其实安卓有多种方法可以实现定时任务,使用Alarm机制可以有效避免CPU休眠时造成定时器停止工作,大家可以参考原书郭霖《第一行代码》9.6章节《服务的最佳实践——后台执行的定时任务》中的解释。

接下来需要实现关闭软件和提示的功能了,新建AlarmReceiver类继承BroadcastReceiver,重写onReceive()方法,实现在定时前3秒钟通过Toast提示关闭软件,在定时结束时关闭软件,AlarmReceiver.java 代码如下:

package com.example.servicetest;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class AlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 小于定时时间,重新启动定时服务if (AlarmService.tickCount++ < AlarmService.timelong) {Intent start = new Intent(context, AlarmService.class);context.startService(start);} else {// 等于定时时间关闭服务,关闭程序Intent stop = new Intent(context, AlarmService.class);context.stopService(stop);System.exit(0);}// 前3秒给出提示if (AlarmService.tickCount == AlarmService.timelong - 3)Toast.makeText(context, "即将关闭程序", Toast.LENGTH_LONG).show();}
}

当1秒定时结束时,广播接收器会接收到服务的广播,在onReceive()方法中对tickCount进行累加,通过与定时时间的比较,做出相应的处理。这种方法可以有效实现需求的功能,但是如果长时间定时的话,1秒钟一启动服务感觉会比较浪费资源,但是小弟确实新手,暂时还没有更好的解决方法,以后会继续努力,也请有经验的大神指点指点。

文章写到这里,所有的功能模块都已经完成了,下面需要在主程序中对模块进行整理和调用了,打开MainActivity.java文件,加入如下代码:

package com.example.servicetest;import android.app.Activity;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.Toast;public class MainActivity extends Activity implements OnItemSelectedListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner sp = (Spinner) findViewById(R.id.degrees);sp.setOnItemSelectedListener(this);}@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {Intent i = new Intent(this, AlarmService.class);switch (arg2) {case 0:break;case 1:AlarmService.timelong = 10;this.startService(i);break;case 2:AlarmService.timelong = 20;this.startService(i);break;case 3:AlarmService.timelong = 30;this.startService(i);break;case 4:AlarmService.timelong = 60;this.startService(i);break;}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}
}

代码比较简单,需要实现接口 Spinner 的OnItemSelectedListener 接口即可,在重写onItemSelectd()方法,在方法中根据选择项设置定时时间,并启动前台服务。写到这如果你觉得结束了,那么你也就太粗心了,非常重要的地方你忘记了,打开AndroidManifest.xml文件,需要加入注册服务和广播的代码,不懂回去看书,代码如下:

        <service android:name=".AlarmService" ></service><receiver android:name=".AlarmReceiver" ></receiver>

这样,所有的问题都解决了,看下运行结果吧!

 

下载源码,点击这里!

《服务的最佳实践》再实践——定时关闭程序相关推荐

  1. 程序定时关闭器 - Windows下多功能自动定时关闭程序的软件工具

    有时您可能在程序处理复杂文档.渲染图形.下载大文件或系统升级时,无法避免地要让电脑开上几个小时.在这种情况下,一旦您的任务完成,自动结束所有活动并关闭系统的应用程序可能会非常有帮助. 程序定时关闭器是 ...

  2. windows server2008 定时关闭程序

    采用自带功能,写一个定时关闭的dos脚本即可. bat内容:taskkill  /F /IM QQ.EXE /T 参考: http://zhidao.baidu.com/link?url=8R74vd ...

  3. windows系统下定时关闭程序

    首先创建一个txt文件,写入 taskkill /f /im xxx.exe 其中xxx.exe是你要关闭的进程中运行的exe,可以ctrl+alt+del打开任务管理器,进到详细信息查看 然后把.t ...

  4. c++ 获取当前时间,并定时关闭程序,重新打开

    string getTime() {time_t timep;time(&timep);char tmp[64] = {0};//获取时间 时分秒strftime(tmp, sizeof(tm ...

  5. 计划任务-定时关闭、重启软件

    一.在控制面板->管理工具->任务计划程序 中[创建任务],[姓名]自定义("st"):[触发器]新建,选中"一次"设置好开始时间(18:59:50 ...

  6. 强制关闭计算机窗口,windows系统怎么取消关机时强制关闭程序提示窗口?

    在写经验时,因为要操作用户帐户,结果弄得系统所有设置都恢复到系统默认状态了,其它的就不说,说一下关机时,总会弹出一个"强制关闭程序的提示窗口",怎样把这个窗口关闭掉呢.找了一些资料 ...

  7. 为什么DDD是设计微服务的最佳实践

    在本人的前一篇文章<不要把微服务做成小单体>中,现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了.但是这不一定是正确的微服务,可能只是一个拆小的小单体 ...

  8. [转]在 Azure 云服务上设计大规模服务的最佳实践

    本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...

  9. 从Uber微服务看最佳实践如何炼成?

    免费加入知识星球.斐讯K3等你来 导读:Uber成长非常迅速,工程师团队快速扩充,据说Uber有2000名工程师,8000个代码仓库,部署了1000多个微服务.微服务架构是Uber应对技术团队快速增长 ...

最新文章

  1. 安利10款效率工具,打造windows超强生产力
  2. java开发微信公众平台(一)-- 服务器配置
  3. LeetCode之Count and Say
  4. java中spring的web支持nio,Spring WebClient NIO功能和问题域,与Spring Webflux一起使用
  5. Python《搞事情==蜂-鸟-图-片(二)》
  6. 英雄七十寿 无物下冷酒 横刀上闹市 直取数人头
  7. linux 连接存储,在Linux中连接和使用云存储的三种途径
  8. 线性表--数组实现+模板+迭代器
  9. oracle 如何添加数据文件,在Oracle数据库里插入excel文件数据的步骤
  10. request.getParameter、request.getParameterValues、request.getParameterMap用法
  11. POJ 2226 Muddy Fields(最小点覆盖)题解
  12. Jenkins的Windows Slave的配置
  13. GDI+处理带透明区域的png图片
  14. Linux内核分析与驱动编程-1
  15. (大概是最全的解决方法)使用bandicam录制视频导入pr后音画不同步问题
  16. 无线打印机 连接路由器连接到服务器,路由器连接打印机方法
  17. 第十五届全国大学生智能汽车竞赛华南赛区获奖信息
  18. 代码随想录第十八天 LeetCode513、112、113、106、105
  19. 我的生活(小兵,班长,连长....大将)
  20. PSINS工具箱15状态组合导航仿真程序(test_SINS_GPS_153)浅析-初始化设置

热门文章

  1. 剑指Offer----扩展:小东分苹果(京东)
  2. 多渔:第一桶金启示录
  3. oracle sqlldr 数据导入时报错:Field in data file exceeds maximum length完美解决
  4. 基于物联网的工业控制系统设计与实现
  5. 自由手写体字帖pdf_南构不律手写|回忆手写,自由浪漫的飘逸手写体
  6. 最新系统漏洞--Mr.Zhou Learnsite权限提升漏洞
  7. 徐家骏:华为十年感悟 1
  8. 网页如何与服务器连接到服务器,怎样把网页连接到云服务器上
  9. HTML5 canvas 平铺的几种方法
  10. Camera架构-软硬