idea来源
这个idea是蔡小亦童鞋提出来的。她说看到一条报道说有人看手机看太久眼睛怎么怎么了,所以想弄个应用来监控屏幕使用时间。答应帮她做已经答应很久了,刚好这周没什么事了,于是就开始做。从开始找资料到写代码到美工到调试完成,只花了1天时间,不错不错~因为我觉得这个做得很粗糙别人不可能会怎么用,所以我就针对蔡小亦童鞋定制了流氓兔形象,哦哈哈是不是该感谢我~
预期目标
1、能记录屏幕使用时间
2、每天凌晨清空数据,重新记录
3、用户可以自定义警戒线,当使用时间超过警戒线则在通知栏提醒。
主要代码
1 package com.legend;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Date;
5
6 import android.app.Activity;
7 import android.content.Context;
8 import android.content.Intent;
9 import android.content.SharedPreferences;
10 import android.os.Bundle;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.EditText;
15 import android.widget.TextView;
16 import android.widget.Toast;
17
18 /**
19 * 目前先实现最小功能,只提取出总的屏幕亮的时间
20 * 通过广播来接收屏幕是否启动这个事件
21 * @author 林培东
22 */
23 public class MainActivity extends Activity
24 {
25 public TextView summary=null;
26 public TextView preset=null;
27 public EditText set=null;
28 public Button submit=null;
29
30 @Override
31 public void onCreate(Bundle savedInstanceState)
32 {
33 super.onCreate(savedInstanceState);
34 setContentView(R.layout.main);
35 startService(new Intent("com.legend.SERVICE_DEMO"));//启动服务
36
37 summary=(TextView)findViewById(R.id.summary);
38 preset=(TextView)findViewById(R.id.preset);
39 set=(EditText)findViewById(R.id.set);
40 submit=(Button)findViewById(R.id.submit);
41
42 //显示已使用屏幕时间
43 SharedPreferences sp=getSharedPreferences("actm", Context.MODE_PRIVATE);
44 int sum=(int)sp.getLong("sum", 0L)/1000;
45 int hour=sum/3600;
46 int minute=(sum-hour*3600)/60;
47 int second=sum%60;
48 //格式化输出日期
49 Date tmp=new Date();
50 tmp.setHours(hour);
51 tmp.setMinutes(minute);
52 tmp.setSeconds(second);
53 SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
54 String result=sdf.format(tmp);
55 summary.setText(result);//最终显示
56
57 //显示已保存的设置
58 int limit=sp.getInt("limit", 24*60);
59 preset.setText(" 当前设定的预警分钟数为"+Integer.toString(limit));
60
61 //点击确定后重新设置
62 submit.setOnClickListener(new OnClickListener()
63 {
64 @Override
65 public void onClick(View v)
66 {
67 String tmp=set.getText().toString();
68 if(tmp.equals(""))
69 Toast.makeText(MainActivity.this, "输入不能为空!", Toast.LENGTH_SHORT).show();
70 else
71 {
72 SharedPreferences sp=getSharedPreferences("actm", Context.MODE_PRIVATE);
73 SharedPreferences.Editor editor=sp.edit();
74 editor.putInt("limit", Integer.parseInt(tmp));
75 editor.commit();
76 Toast.makeText(MainActivity.this, "已设定!", Toast.LENGTH_SHORT).show();
77 preset.setText(" 当前设定的预警分钟数为"+Integer.parseInt(tmp));
78 }
79 }
80 });
81
82 }
83
84 }
1 package com.legend;
2
3 import java.util.Date;
4 import java.util.Timer;
5 import java.util.TimerTask;
6
7 import android.app.Notification;
8 import android.app.NotificationManager;
9 import android.app.PendingIntent;
10 import android.app.Service;
11 import android.content.BroadcastReceiver;
12 import android.content.Context;
13 import android.content.Intent;
14 import android.content.IntentFilter;
15 import android.content.SharedPreferences;
16 import android.os.IBinder;
17
18 /**
19 * 创建一个服务,该服务主要用来接收广播和创建定时器
20 * @author 林培东
21 */
22 public class LocalService extends Service
23 {
24 private static final int NOTIFY_ID=1234;//通知的唯一标识符
25
26 //主要功能,广播接收器
27 private final BroadcastReceiver receiver=new BroadcastReceiver()
28 {
29 @Override
30 public void onReceive(Context context, Intent intent)
31 {
32 SharedPreferences sp=getSharedPreferences("actm", Context.MODE_PRIVATE);
33 SharedPreferences.Editor editor=sp.edit();
34
35 if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
36 {
37 //保存屏幕启动时的毫秒数
38 editor.putLong("lasttime", new Date().getTime());
39 editor.commit();
40
41 //根据需要看是否需要在通知栏提醒
42 int sum=(int)sp.getLong("sum", 0L)/1000;
43 int limit=sp.getInt("limit", 1440)*60;
44 if(limit
2
7
8
15
16
23
24
29
30
36
37
42
43
1
2
6
7
8
9
12
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
项目分析
我遇到的第一个问题是:如何监控?
经过查资料,我发现当屏幕启用或者锁屏时,系统会分别发送ACTION_SCREEN_ON和ACTION_SCREEN_OFF这两个广播。我们只需要在接收这两个广播时记录时间就可以了。
注意:为了时程序退出后也能运行,必须使用Service。
注意:这两个广播是受保护的,只能在代码中注册。
下面是在Service中注册:
//添加过滤器并注册
final IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(receiver, filter);
在接收器receiver里,定义了onReceive()来处理这些数据,主要功能都在里面实现:
//主要功能,广播接收器
private final BroadcastReceiver receiver=new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
SharedPreferences sp=getSharedPreferences("actm", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
//保存屏幕启动时的毫秒数
editor.putLong("lasttime", new Date().getTime());
editor.commit();
//根据需要看是否需要在通知栏提醒
int sum=(int)sp.getLong("sum", 0L)/1000;
int limit=sp.getInt("limit", 1440)*60;
if(limit |