java - 如何跟踪应用程序启动
问题描述
如何跟踪用户启动的应用程序,我发现使用accessibilityService可以做到这一点,但我不喜欢这种方法。我在 Play Market 中看到应用程序会使用 PIN 码阻止其他应用程序,它们会以某种方式跟踪应用程序的启动,而我只允许他们查看应用程序统计信息
解决方案
尝试这个
第二个选项是创建一个使用标志扩展 Application 的类,例如 isAppRunning,根据您的应用程序是否在前台,该标志将是 true 或 false:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
}
然后在您的 AndroidManifest.xml 上,您必须添加此类,以便在您的应用程序启动时使用它。只需在 application 标签下添加 android:name=".MyAppContext" :
<application
android:name=".MyAppContext"
现在,在您拥有的每个活动中,您应该覆盖 onResume() 和 onPause() 并将标志设置为相应的值:
class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
((MyAppContext)getApplication()).setIsAppRunning(true);
}
@Override
protected void onPause() {
((MyAppContext)getApplication()).setIsAppRunning(false);
super.onPause();
}
}
这样,每次启动 Activity 时,MyAppContext 中 isAppRunning 的值为 true,当您退出 Activity 时,它将为 false,但如果打开另一个 Activity(例如,如果您按下后退按钮,那么您将返回到上一个活动) 该值将立即再次为真。
当您最终完成所有活动时,将不会调用任何 onResume() 方法,并且将调用所有 onPause() 方法,因此 isAppRunning 将为 false 并且您知道您的 Activity 不再处于前台。
所以恢复,如果 isAppRunning 为真,你的应用程序就在前台(启动会话跟踪),否则它就消失了(停止会话跟踪)。您可以在 MyAppContext 类中创建一个 Timer 来定期检查 isAppRunning 的值,因此它将是:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public final int timerRate = 500; // Execute timer task every 500mS
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
@Override
public void onCreate() {
super.onCreate();
Timer mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(isAppRunning) startSesionTracking();
else stopSesionTracking();
}
}, 0, REFRESH_TIME);
}
private void startSesionTracking () { ... };
private void stopSesionTracking () { ... };
}
推荐阅读
- c++ - 在 C++ 中使用 boost 与可执行文件交互
- flutter - 如何在android视图上单独显示flutter小部件,而不在android视图上显示整个'MyApp'?
- php - Dockerfile:错误:“docker-php-ext-install”不存在且扩展不存在
- c# - 如何为以下 Scenerio 编写 linq 查询
- html - 我想让这个页面响应我该怎么说
- powershell - 使用 PowerShell 脚本创建快捷方式
- html - 如何使用 php 中的表单数据生成 PDF 报告?
- c++ - 创建一个具有随机行数的二维数组。C++
- python - Python - asyncio - 协程返回错误
- react-native - React Native 中的两个 AsyncStorage 实例?