2015-06-14 17 views
2

在我的應用程序中,我有本地服務,它需要在單獨的進程中運行。在AndroidManifest.xml中指定爲確定通過哪個進程調用Application.onCreate()

<service android:name=".MyService" android:process=":myservice"></service> 

。我也應用程序對象的子類,並希望檢測它的onCreate方法時,它是通過普通啓動和通過myservice啓動時調用。我發現的唯一的工作液是由

https://stackoverflow.com/a/28907058/2289482

描述,但我不想讓設備上的所有正在運行的進程,並在它們之間迭代。我嘗試從Context中使用getApplicationInfo()。processName,但不幸的是它始終返回相同的String,而上面鏈接中的解決方案返回:myPackage,myPackage:myservice。我首先不需要processName,但是有一些很好的解決方案來確定何時通過普通啓動和何時通過myservice啓動來調用onCreate方法。也許可以通過在某處應用某種標籤或標籤來完成,但我沒有找到如何去做。

+0

鏈接的機制是什麼大家都在用。這隻會發生一次,當你的應用程序啓動。爲什麼你不能使用這種機制? –

+0

鏈接解決方案意味着我們遍歷設備上的所有正在運行的進程,以獲取有關當前進程的信息。普通應用程序不請求所有正在運行的進程 - 自定義ProcessManager或某個實用程序需要此功能。 – user2289482

回答

2

您可以使用此代碼來獲取你的進程名:

int myPid = android.os.Process.myPid(); // Get my Process ID 
    InputStreamReader reader = null; 
    try { 
     reader = new InputStreamReader(
       new FileInputStream("/proc/" + myPid + "/cmdline")); 
     StringBuilder processName = new StringBuilder(); 
     int c; 
     while ((c = reader.read()) > 0) { 
      processName.append((char) c); 
     } 
     // processName.toString() is my process name! 
     Log.v("XXX", "My process name is: " + processName.toString()); 
    } catch (Exception e) { 
     // ignore 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (Exception e) { 
       // Ignore 
      } 
     } 
    } 
+0

謝謝,這個解決方案正在爲我工​​作。它在某種程度上是低級的,但它肯定比迭代系統的所有正在運行的進程要好。 – user2289482

+0

[This answer](http://stackoverflow.com/a/21389402/238753)表示,如果用戶正在運行Xposed,則此方法無效。你有沒有在野外使用這種技術遇到任何問題? – Sam

+0

@Sam我們沒有任何問題使用這種技術,因爲我們確切地知道我們的用戶使用什麼設備,而且他們都沒有使用除標準Android以外的任何其他設備。 –

相關問題