我可以想到两种方法:
选项1:
您可以创建一个服务,在前台扫描当前应用程序并查看它是否是您的活动。这是您可以使用的一些代码,我从另一个答案中获取:
有一种从 ActivityManager 服务获取正在运行的任务列表的简单方法。您可以请求在手机上运行的最大任务数,默认情况下,首先返回当前活动的任务。
topActivity
一旦你有了它,你可以通过从你的列表中请求来获得一个 ComponentName 对象。
这是一个例子。
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
// get the info from the currently running task
List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
Log.d("topActivity", "CURRENT Activity ::"
+ taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();
您的清单需要以下权限:
<uses-permission android:name="android.permission.GET_TASKS"/>
链接到答案:Android:如何获取当前的前台活动(来自服务)?
您可以每隔一秒或更短的时间调用一次,以检测您的应用是否仍处于活动状态。请注意,根据官方文档,它已被弃用,不建议用于此类事情:
getRunningTasks()
注意:此方法仅用于调试和呈现任务管理用户界面。这绝不应该用于应用程序中的核心逻辑,例如根据此处找到的信息来决定不同的行为。此类用途不受支持,将来可能会中断。例如,如果多个应用程序可以同时主动运行,则出于控制流的目的对此处数据的含义所做的假设将是不正确的。
选项 2:
第二个选项是创建一个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
你必须添加这个类,以便在你的应用程序启动时使用它。只需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 时,inisAppRunning
的值MyAppContext
将是立即再次。true
Activity
false
true
当您最终完成所有活动时,将不会调用任何方法,并且将onResume()
调用所有onPause()
方法,并且您知道您不再处于前台。isAppRunning
false
Activity
所以恢复,如果isAppRunning
你true
的应用程序在前台(启动会话跟踪),否则它就消失了(停止会话跟踪)。您可以创建一个Timer
类MyAppContext
来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 () { ... };
}
您应该timerRate
根据您希望在会话跟踪中获得的精度进行修改。