我可以想到两种方法来完成它:
选项1:
您可以创建一个服务,扫描前台的当前应用程序并查看它是否是您的活动。以下是一些代码,您可以使用它,我从另一个答案中提取了它:
There's an easy way of getting a list of running tasks from the
ActivityManager service. You can request a maximum number of tasks
running on the phone, and by default, the currently active task is
returned first.
Once you have that you can get a ComponentName object by requesting
the topActivity
from your list.
Here's an example.
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
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();
You will need the following permission on your manifest:
<uses-permission android:name="android.permission.GET_TASKS"/>
回答链接:Android: 如何从服务中获取当前前台活动?
您可以每一秒或更短时间调用此功能以检测您的应用程序是否仍处于活动状态。请注意,根据官方文档,它已被弃用并不建议用于此类事情:
getRunningTasks()
注意:此方法仅旨在调试和呈现任务管理用户界面。这不应该用于应用程序的核心逻辑,例如根据此处找到的信息决定不同行为之间的区别。不支持此类使用,未来可能会出现错误。例如,如果多个应用程序可以同时运行,则根据此处数据的含义进行控制流程的假设将是错误的。
选项2:
第二个选项是创建一个扩展Application
的类,其中包含标志,例如isAppRunning
,根据您的应用程序是否在前台,该标志将为真或假:
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),
MyAppContext
中的
isAppRunning
的值将为
true
。当您退出该
Activity
时,它的值将变为
false
。但是,如果打开了另一个 Activity(例如,如果您按下返回按钮,则返回到上一个Activity),则该值将立即再次变为
true
。
最终,当您完成所有活动后,不会调用任何
onResume()
方法,而是会调用所有
onPause()
方法,因此
isAppRunning
将变为
false
,您就知道您的
Activity
不再处于前台。
因此,简要概括一下,如果
isAppRunning
为
true
,则表示应用程序在前台(开始会话跟踪),否则就不在前台(停止会话跟踪)。您可以在
MyAppContext
类中创建一个
Timer
来定期检查
isAppRunning
的值,如下所示:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public final int timerRate = 500;
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
。