2012-07-31 60 views
3

我試圖限制一個應用程序家族,使用相同的活動(在所有共享庫項目中),這樣只有一個這樣的應用程序可以在一次運行。從overriden getApplication()返回一個共享靜態是否安全?

在我的第一輪努力學習如何去說,我才知道:

  1. 機器人:launchMode =「singleTask」不會做的伎倆。
  2. setVisible(true/false) inResume()/ onPause()分別是best way來判斷我的應用程序是否正在運行。但是,一旦第二個實例知道第一個實例正在運行,我該怎麼辦?

所以,我想通過始終通過重寫Activity.getApplication()並返回一個共享靜態返回相同的情況下欺騙系統:

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static MyApplication getApplication() 
    { 
     return s_instance; 
    } 
} 

(信用爲理念去@inazaruk

但是,就像前面提到的可見性解決方案一樣,我現在要做什麼呢?

系統本身是否使用getApplication()來確定是啓動一個新實例還是將它放到堆棧的前面?這安全嗎?

如果答案是「否」,我可以打電話Activity.finish()不要讓第二個活動不能啓動?如果是這樣,我在哪裏做?

  1. Right in Activity.onCreate()
  2. Activity.onResume()
  3. MyApplication()? (構造函數)
  4. 更好的地方嗎?
+1

我有點困惑。你說_a系列的應用程序_但是它們是如何打包的?在Android上,APK包含單個應用程序。該應用程序具有唯一的軟件包名稱和唯一的用戶標識,並在其自己的進程中運行。這意味着如果你在2個獨立的包中有2個應用程序,它們將在2個獨立的進程中運行,因此從'getApplication()'返回靜態實例不會對你有任何好處。請詳細說明並解釋這些應用程序如何相互關聯。 – 2012-08-01 16:47:49

+0

@DavidWasser你是絕對正確的。它們在兩個獨立的進程中運行,因此從getApplication()返回靜態實例對我沒有任何好處。對於應用程序包名稱不同,您也是對的,但這與此處不相關,因爲共享庫項目的包名稱是相同的。任何想法如何在**實時**(即不是通過緩慢的共享偏好,而是通過更快的RAM)在不同的過程中追蹤它?如果您發表評論作爲答案,我會接受它。 – ateiob 2012-08-01 20:55:44

回答

1

我有點困惑。你說一個應用程序家族,但它們是如何打包的?在Android上,APK包含單個應用程序。該應用程序具有唯一的軟件包名稱和唯一的用戶標識,並在其自己的進程中運行。這意味着如果你在2個獨立的包中有2個應用程序,它們將在2個獨立的進程中運行,因此從getApplication()返回靜態實例對你沒有任何好處。

下面是可能會爲你工作的想法:

使用該共享庫可以廣播包含運行爲額外應用程序的包名粘性意向的每個應用程序。

使用共享庫可以註冊一個監聽這個粘意圖,如果它得到一個它可以看看,看看是否應用程序(一個在額外)當前正在運行的每個應用程序。如果該應用程序正在運行,它可能會拒絕運行(或者警告用戶並詢問它是否應該運行,或者其他)。

這只是一個想法,我沒有真正嘗試過,但我認爲這可以做你想做的。

+0

奇妙的想法。謝謝!基準測試比共享偏好實施要快多少會很有趣。 – ateiob 2012-08-02 00:42:48

+0

瞭解了這一點之後,即使是一個粘性廣播也不是那麼好:http://stackoverflow.com/a/5457559/869501。回到原點。也許[getRunningAppProcesses()](http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses%28%29)是首選的折衷辦法,雖然「*此方法僅用於調試或構建面向用戶的流程管理用戶界面。「由於這些都是我自己的應用程序,我們假裝我正在構建」面向用戶的流程管理用戶界面「。 ;) – ateiob 2012-08-07 22:01:05

相關問題