Android后台定时提醒功能实现

时间:2022-01-30 07:55:16

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

Android后台定时提醒功能实现

时间到之后有后台提醒:

Android后台定时提醒功能实现

Android后台定时提醒功能实现

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

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

mainactivity:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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给清理掉。

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