需要类似的功能,找了很久,估计这个能让我实现。转一下。
https://blog.csdn.net/qq_34445403/article/details/78727477
考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,重度近视了可是会遗传给将来的孩子的呀,可能老婆都跟别人跑了。
于是,为了保护眼睛,便做了个如下的应用:
打开后效果:
好了,接下来说一下做这样一个APP主要涉及到的知识点:
Service:使用service,便可以在程序即使后台运行的时候,也能够做出相应的提醒,并且不影响手机进行其他工作。
AlarmManager:此知识点主要是用来计时,具体的在代码的注释中写的很详细。
notification:此知识点就是用作通知的显示了,具体的可以参考另一篇文章:
MainActivity:
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.Window;
importandroid.widget.Toast;
publicclassMainActivityextendsActivity{
privateIntent intent;
@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//取消标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//由于主要是用于测试,并且便于新手理解,所以activity_main布局写的很简单
setContentView(R.layout.activity_main);
intent =newIntent(this, LongRunningService.class);
//开启关闭Service
startService(intent);
//设置一个Toast来提醒使用者提醒的功能已经开始
Toast.makeText(MainActivity.this,"提醒的功能已经开启,关闭界面则会取消提醒。",Toast.LENGTH_LONG).show();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
//在Activity被关闭后,关闭Service
stopService(intent);
}
}
LongRunningService:
importandroid.app.AlarmManager;
importandroid.app.PendingIntent;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.IBinder;
importandroid.os.SystemClock;
publicclassLongRunningServiceextendsService{
@Override
publicIBinderonBind(Intent intent){
returnnull;
}
@Override
publicintonStartCommand(Intent intent,intflags,intstartId){
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
//读者可以修改此处的Minutes从而改变提醒间隔时间
//此处是设置每隔90分钟启动一次
//这是90分钟的毫秒数
intMinutes =90*60*1000;
//SystemClock.elapsedRealtime()表示1970年1月1日0点至今所经历的时间
longtriggerAtTime = SystemClock.elapsedRealtime() + Minutes;
//此处设置开启AlarmReceiver这个Service
Intent i =newIntent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0, i,0);
//ELAPSED_REALTIME_WAKEUP表示让定时任务的出发时间从系统开机算起,并且会唤醒CPU。
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
returnsuper.onStartCommand(intent, flags, startId);
}
@Override
publicvoidonDestroy(){
super.onDestroy();
//在Service结束后关闭AlarmManager
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i =newIntent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0, i,0);
manager.cancel(pi);
}
}
AlarmReceiver:
importandroid.app.Notification;
importandroid.app.NotificationManager;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
publicclassAlarmReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Context context, Intent intent){
//设置通知内容并在onReceive()这个函数执行时开启
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification=newNotification(R.drawable.ic_launcher,"用电脑时间过长了!白痴!"
,System.currentTimeMillis());
notification.setLatestEventInfo(context,"快去休息!!!",
"一定保护眼睛,不然遗传给孩子,老婆跟别人跑啊。",null);
notification.defaults = Notification.DEFAULT_ALL;
manager.notify(1, notification);
//再次开启LongRunningService这个服务,从而可以
Intent i =newIntent(context, LongRunningService.class);
context.startService(i);
}
}
activity_main:
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:
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>
</intent-filter>
</activity>
</service>
</receiver>
</application>
</manifest>
此处有个不得不提的注意点,笔者原来的代码是在Activity开启的时候自动开启Service,在Activity摧毁的时候自动摧毁Service,看上去好像可以运行,没有什么错误,并且在10分钟内的提醒基本都能够正常运行。
但是倘若在比较长的时间提醒的时候就会出现不提醒的问题了!为什么呢?
因为android为了优化内存,减少耗电,是会自动清理内存的,会把后台的Service给清理掉。
以上就是本文的全部内容,希望对大家的学习有所帮助。