我能想到的做這件事的方法有兩種:
選項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: How can I get the current foreground activity (from a service)?
您可以致電此每隔一秒或更少,如果您的應用程序,以檢測仍然活躍。請注意,這是一個過時,不建議使用這樣的事情,根據官方文檔:
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
你必須添加這個類,所以它的時候會使用你的應用程開始。在你有你應該重寫onResume()
和onPause()
和標誌設置爲相應的值每一次活動
<application
android:name=".MyAppContext"
現在:每次
class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
((MyAppContext)getApplication()).setIsAppRunning(true);
}
@Override
protected void onPause() {
((MyAppContext)getApplication()).setIsAppRunning(false);
super.onPause();
}
}
在這種方式,您只需添加android:name=".MyAppContext"
應用程序標記下開始一個活動isAppRunning
在MyAppContext
的值將是true
,當你退出Activity
它將是false
但是如果另一個活動打開(例如,如果你按下後退按鈕,所以你正在返回之前的活動),該值將立即再次變爲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; // 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
。
所以使用onPause不會提供關於是否切換到另一個應用程序或其他活動的應用程序信息... – Kasma
不,這只是活動工作方式的一部分,它在活動不再焦點時運行。這種情況發生在用戶切換到另一個應用程序時,另一個應用程序需要前景焦點(我注意到,如果您向鍵盤上的字典中添加單詞,會發生這種情況),甚至當設備被用戶鎖定時,或者屏幕超時會鎖定設備。 – EvilGeniusJamie
但是如何跟蹤是否要進行其他活動...... – Kasma