2010-01-05 39 views
4

我有一個應用程序使用服務在應用程序運行時以及不運行時在後臺獲取數據。 當它沒有運行時,我想在有新數據時顯示通知,但不會在應用程序運行時顯示。如何確定我的應用程序何時運行?

如何確定我的服務中該應用程序是否正在運行?

回答

1

我想你想檢查某個活動是否顯示。如果這是真的,我會使用Activity.onCreate()方法在應用程序實例中設置一個標誌,即使用字段「uiRunning」擴展類Application,並在您的服務中檢查該字段。應該使用onDestroy()來取消標記屬性。不要忘了在Manifest.xml中也使用您的應用程序類

+0

有不需要使用應用程序子類 - 只需在服務中添加一個靜態變量,這些靜態變量由這些方法設置(或調用一個維護內部靜態狀態的靜態函數)。 與Application對象一樣,不保證Activity。onDestroy()將被殺死 - 如果系統需要進程的內存,它將簡單地終止進程,並且不會運行代碼。 – hackbod 2010-01-05 02:17:00

+0

我唯一的想法也是沿着這些路線。我希望有一個uiRunning方法。我可以在不同的時間運行不同的活動的應用程序,這將使保持標誌同步更復雜。 我想我應該設置/刪除onStart/onStop的國旗? – Wilken 2010-01-05 09:08:24

0

我同意使用onCreate()/ onDestroy()爲單個Activity應用程序,但具有多個活動的應用程序最好使用Application.onCreate()/ onTerminate()是爲了避免在切換活動時觸發uiRunning狀態。

+0

Application.onTerminate()永遠不會在正常的系統操作中被終止 - 當從後臺進程需要內存時,它會被終止。被殺死的 – hackbod 2010-01-05 02:14:12

+0

,你的意思叫? – Wilken 2010-01-05 09:08:59

+0

沒有它剛剛死亡,這只是爲了模擬..應用程序沒有通知它會被殺死。 – 2012-04-24 19:36:01

0

這很容易。您使用一個命名的互斥體。

把這個應用程序,你要檢查:

bool createdNew; 
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew); 
if (createdNew) 
{ 
    Console.WriteLine("App not running"); 
    mutex.Close(); 
} else { 
    Console.WriteLine("App is running"); 
} 
+0

這是.net代碼,不是嗎? 除此之外,我同意,互斥體也會這樣做。 – Wilken 2010-01-05 10:21:14

0

另一種選擇是實行:

bool createdNew; 
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew); 
if (createdNew) 
{ 
    var app = new YourProcess(); 
    app.run(); 
    mutex.Close(); 
} 

在檢查,以確保其他應用程序正在運行的應用程序將這個監聽器模式,並讓您的服務使用addListener()和removeListener()的服務接口上的方法來管理偵聽器列表。您的活動可以在連接到服務並將其自身刪除onStop()(即應用程序不再可見或完全關閉)後將其自身添加爲偵聽器。

在您的服務中,檢查聽衆的數量。如果沒有聽衆,那麼你知道你應該創建你的通知。

0

另一種完成的方法是將數據接收器分離到一個始終在後臺運行的「服務」。您可以讓應用程序綁定到服務並顯示服務所獲取的數據。

在後臺運行應用程序的問題是,Android會在應用程序變得太舊時終止應用程序。它最好有這樣的背景運行應用程序作爲服務,而不是活動。

0

我所做的是在我的服務中使用一個標誌,即根活動在onStart/onStop上設置和清除。這工作得很好。

0

這是我做到了,用的代碼,只需幾行工作完美:

在擴展App類:

public static boolean isAppInFront = false; 

在您的主要活動:

@Override 
public void onStart() { 
    super.onStart(); 
    MyApplication.isAppInFront = true; 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (isFinishing()) 
     MyApplication.isAppInFront = false; 
} 
相關問題