Kas*_*sma 10 android android-activity
我有一个应用程序跟踪应用程序上的用户活动,包括时间等,现在,如果用户已打开应用程序,它将启动一个会话,直到该应用程序中的用户,他的会话将继续,他可以切换到多个活动.现在他同时切换到另一个应用程序,他的会话日志记录应该停止并写入文件
我尝试了什么
我创建了一个基本活动和On resume事件,如果计数器为零,我启动会话并递增计数器和On stop事件,我减少计数器,如果计数器为零,我停止会话
但这不会计算跟踪的实际问题,因为当用户切换到另一个应用程序时,android不会停止活动.
那么有没有办法实现这样的事情.
额外:
如果我们可以在屏幕上查看应用活动是否处于活动状态,那么可以使用事件来开始或结束会话.
我可以想到两种方法:
选项1:
您可以创建一个服务,在前台扫描当前应用程序并查看它是否是您的活动.这是你可以使用的一些代码,我从另一个答案中得到了它:
有一种从ActivityManager服务获取正在运行的任务列表的简单方法.您可以请求在手机上运行的最大任务数,默认情况下,首先返回当前活动的任务.
完成后,您可以通过从列表中请求topActivity来获取ComponentName对象.
这是一个例子.
Run Code Online (Sandbox Code Playgroud)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();
您的清单上需要以下权限:
Run Code Online (Sandbox Code Playgroud)<uses-permission android:name="android.permission.GET_TASKS"/>
链接答案:Android:如何获取当前前台活动(来自服务)?
您可以每隔一秒或更短时间调用此方法来检测您的应用是否仍处于活动状态.根据官方文档,请注意它已被弃用,不建议用于此类事物:
getRunningTasks()
注意:此方法仅用于调试和呈现任务管理用户界面.这绝不应该用于应用程序中的核心逻辑,例如根据此处的信息在不同的行为之间进行决策.不支持此类用途,并且将来可能会破坏.例如,如果多个应用程序可以同时主动运行,则出于控制流程的目的而对此处的数据含义进行的假设将是不正确的.
选项2:
第二个选项是创建一个topActivity
使用标志扩展的类,例如Application
,如果您的应用程序位于前台,则为true或false:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您isAppRunning
必须添加此类,以便在应用程序启动时使用它.只需添加AndroidManifest.xml
应用程序标记:
<application
android:name=".MyAppContext"
Run Code Online (Sandbox Code Playgroud)
现在,在您拥有的每个活动中,您应该覆盖android:name=".MyAppContext"
并将onResume()
标志设置为相应的值:
class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
((MyAppContext)getApplication()).setIsAppRunning(true);
}
@Override
protected void onPause() {
((MyAppContext)getApplication()).setIsAppRunning(false);
super.onPause();
}
}
Run Code Online (Sandbox Code Playgroud)
这样,每次启动一个Activity时,onPause()
in 的值isAppRunning
都是MyAppContext
,当你退出true
时它将是,Activity
但是如果另一个Activity打开(例如,如果按下后退按钮,那么你将返回上一个活动),那么该值将是马上false
又来了.
当你最终完成所有活动时,true
将不会调用任何方法,并且将调用所有onResume()
方法,因此onPause()
将会isAppRunning
知道您false
不再处于前台.
所以恢复,如果Activity
是isAppRunning
您的应用程序在前台(启动会话跟踪),否则就不见了(停止会话跟踪).您可以true
在Timer
类中创建一个MyAppContext
定期检查值,因此它将是:
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 () { ... };
}
Run Code Online (Sandbox Code Playgroud)
您应该isAppRunning
根据要在会话跟踪中获得的精度进行修改.
归档时间: |
|
查看次数: |
15462 次 |
最近记录: |