简介
本篇文章中通过Android获取手机顶部的Activity的方式,来达到监控手机应用使用情况的目的
技术背景
在自己的日常学习中,想要自动收集手机软件各个应用的使用时间,比如得到、极客时间、Keep、微信读书等
但在查找下,没有找到他们有对应的API开发接口,没有办法去获取
小米手机里面有手机应用使用情况,屏幕使用时间里面,数据看着挺好,挺合适的,但也不知道怎么获取
最后只能自己写一个原生的Android应用,通过获取手机顶层Activity的方式,每隔10秒上报服务器,并设置好Activity与应用名称的映射,来达到自己的手机应用使用统计目的
代码细节
完整代码GitHub上有:https://github.com/lw1243925457/self_growth_android
仅做代码参考,目前数据监控上传是有了,但界面这些还很粗糙,没有完善
使用这个功能需要注意下面的几点:
- 1.需要将监听设置为后台服务,避免切换成其他应用后频繁被kill掉
- 2.需要调用相关的权限设置,让用户开启相关的应用情况获取权限
- 3.剩下的就是应用监听代码的编写了
具体的代码如下:
应用监听-获取手机顶层Activity
我们需要新建一个后台服务,继承Service即可,然后开启一个定时器,每十秒获取一次顶层Activity,数据上传部分可忽略
代码如下:
public class MonitorActivityService extends Service {
private String beforeActivity;
private final ActivityRequest activityRequest = new ActivityRequest();
/*
* @param intent
* @param flags
* @param startId
* @return
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//处理任务
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressLint("CommitPrefEdits")
@Override
public void onCreate() {
super.onCreate();
Log.d("foreground", "onCreate");
//如果API在26以上即版本为O则调用startForefround()方法启动服务
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
setForegroundService();
}
}
/**
* 通过通知启动服务
*
* 10秒获取一次
*/
@androidx.annotation.RequiresApi(api = Build.VERSION_CODES.O)
public void setForegroundService()
{
//设定的通知渠道名称
String channelName = "test";
//设置通知的重要程度
int importance = NotificationManager.IMPORTANCE_LOW;
//构建通知渠道
NotificationChannel channel = new NotificationChannel("232", channelName, importance);
channel.setDescription("test");
//在创建的通知渠道上发送通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "232");
builder.setSmallIcon(R.drawable.ic_launcher_foreground) //设置通知图标
.setContentTitle("正在监控手机活动并上报")//设置通知标题
.setContentText("正在监控手机活动并上报")//设置通知内容
.setAutoCancel(true) /