欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android后台定时提醒功能实现

程序员文章站 2023-12-18 19:51:10
前提:考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,重度近视了可是会遗传给将来的孩子的呀,可能老婆都跟...

前提:考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,重度近视了可是会遗传给将来的孩子的呀,可能老婆都跟别人跑了。
于是,为了保护眼睛,便做了个如下的应用:
打开后效果:

Android后台定时提醒功能实现

时间到之后有后台提醒:

Android后台定时提醒功能实现

Android后台定时提醒功能实现

好了,接下来说一下做这样一个app主要涉及到的知识点:

service:使用service,便可以在程序即使后台运行的时候,也能够做出相应的提醒,并且不影响手机进行其他工作。
alarmmanager:此知识点主要是用来计时,具体的在代码的注释中写的很详细。
notification:此知识点就是用作通知的显示了,具体的可以参考另一篇文章:

mainactivity:

import android.app.activity; 
import android.content.intent; 
import android.os.bundle; 
import android.view.window; 
import android.widget.toast; 
 
public class mainactivity extends activity { 
 
 private intent intent; 
 @override 
 protected void oncreate(bundle savedinstancestate) { 
  super.oncreate(savedinstancestate); 
  //取消标题栏 
  requestwindowfeature(window.feature_no_title); 
  //由于主要是用于测试,并且便于新手理解,所以activity_main布局写的很简单 
  setcontentview(r.layout.activity_main); 
  intent = new intent(this, longrunningservice.class); 
  //开启关闭service 
  startservice(intent); 
 
  //设置一个toast来提醒使用者提醒的功能已经开始 
  toast.maketext(mainactivity.this,"提醒的功能已经开启,关闭界面则会取消提醒。",toast.length_long).show(); 
 } 
 
 @override 
 protected void ondestroy() { 
  super.ondestroy(); 
  //在activity被关闭后,关闭service 
  stopservice(intent); 
 } 
} 

longrunningservice:

import android.app.alarmmanager; 
import android.app.pendingintent; 
import android.app.service; 
import android.content.intent; 
import android.os.ibinder; 
import android.os.systemclock; 
 
public class longrunningservice extends service { 
 
 
 @override 
 public ibinder onbind(intent intent) { 
  return null; 
 } 
 
 @override 
 public int onstartcommand(intent intent, int flags, int startid) { 
 
  alarmmanager manager = (alarmmanager) getsystemservice(alarm_service); 
  //读者可以修改此处的minutes从而改变提醒间隔时间 
  //此处是设置每隔90分钟启动一次 
  //这是90分钟的毫秒数 
  int minutes = 90*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); 
 
 } 
} 

alarmreceiver:

import android.app.notification; 
import android.app.notificationmanager; 
import android.content.broadcastreceiver; 
import android.content.context; 
import android.content.intent; 
 
public class alarmreceiver extends broadcastreceiver { 
 
 @override 
 public void onreceive(context context, intent intent) { 
  //设置通知内容并在onreceive()这个函数执行时开启 
  notificationmanager manager = (notificationmanager) context.getsystemservice(context.notification_service); 
  notification notification=new notification(r.drawable.ic_launcher,"用电脑时间过长了!白痴!" 
  ,system.currenttimemillis()); 
  notification.setlatesteventinfo(context, "快去休息!!!", 
    "一定保护眼睛,不然遗传给孩子,老婆跟别人跑啊。", null); 
  notification.defaults = notification.default_all; 
  manager.notify(1, notification); 
 
 
  //再次开启longrunningservice这个服务,从而可以 
  intent i = new intent(context, longrunningservice.class); 
  context.startservice(i); 
 } 
 
 
} 

activity_main:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:padding="15dp" 
 android:orientation="vertical" 
 > 
 
 <textview 
  android:layout_marginbottom="20dp" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="护眼定时提醒" 
  android:textsize="30sp" 
  android:gravity="center_horizontal" 
  /> 
  
 
 <textview 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="提醒间隔时间:" 
  android:textsize="25sp" 
  /> 
 
 <textview 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="90分钟" 
  android:textsize="25sp" 
  /> 
 
 <textview 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="提醒音乐:" 
  android:textsize="25sp" 
  /> 
 <textview 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="系统默认音乐" 
  android:textsize="25sp" 
  /> 
</linearlayout> 

千万不要忘了在androidmanifest中注册service!
androidmanifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="com.example.servicebestpractice" 
 android:versioncode="1" 
 android:versionname="1.0" > 
 
 <uses-sdk 
  android:minsdkversion="14" 
  android:targetsdkversion="17" /> 
 
 <application 
  android:allowbackup="true" 
  android:icon="@drawable/ic_launcher" 
  android:label="@string/app_name" 
  android:theme="@style/apptheme" > 
  <activity 
   android:name="com.example.servicebestpractice.mainactivity" 
   android:label="@string/app_name" > 
   <intent-filter> 
    <action android:name="android.intent.action.main" /> 
 
    <category android:name="android.intent.category.launcher" /> 
   </intent-filter> 
  </activity> 
 
  <service android:name=".longrunningservice" > 
  </service> 
 
  <receiver android:name=".alarmreceiver" > 
  </receiver> 
 </application> 
 
</manifest> 

此处有个不得不提的注意点,笔者原来的代码是在activity开启的时候自动开启service,在activity摧毁的时候自动摧毁service,看上去好像可以运行,没有什么错误,并且在10分钟内的提醒基本都能够正常运行。
但是倘若在比较长的时间提醒的时候就会出现不提醒的问题了!为什么呢?

因为android为了优化内存,减少耗电,是会自动清理内存的,会把后台的service给清理掉。

以上就是本文的全部内容,希望对大家的学习有所帮助。

上一篇:

下一篇: