2009-12-11 64 views
3

我讀Blackberry - How to get the background application process id,但我不確定我是否理解正確。以下代碼獲取前臺進程ID;黑莓 - 獲取當前進程ID

ApplicationManager.getApplicationManager().getForegroundProcessId() 

我有執行同一段代碼,以建立連接兩個過程,我要記錄這讓所有我平時記錄的數據一起調用的過程中得到的流量是怎樣一個更好的主意加工。

是否有可能獲得正在運行代碼的進程的ID?一個進程位於前臺(UI進程),另一個進程在後臺,但都使用通過運行時存儲共享的相同連接庫。

在此先感謝!

gav

回答

4

所以你有三個模塊:應用程序,庫和服務。
您需要通過模塊名稱獲取描述符,然後獲取進程ID。

UPDATE1

String moduleName = "application"; 
int handle = CodeModuleManager.getModuleHandle(moduleName); 
ApplicationDescriptor[] descriptors = CodeModuleManager 
.getApplicationDescriptors(handle); 
if (descriptors.length > 0 && descriptors[0] != null) { 
    ApplicationManager.getApplicationManager().getProcessId(descriptors[0]); 
} 

然後,要記錄的模塊使用的庫,使用

Application.getApplication().getProcessId(); 

庫方法的內部。我認爲它更好地實現庫內的日誌記錄。
當您從庫代碼中獲得應用程序的進程ID時,可以將其與通過模塊名稱查找到的ID進行比較,然後您將知道哪個模塊使用了庫代碼。
UPDATE2
alt text http://img138.imageshack.us/img138/23/eventlog.jpg
庫模塊代碼:

package library; 

import net.rim.device.api.system.Application; 
import net.rim.device.api.system.ApplicationDescriptor; 
import net.rim.device.api.system.ApplicationManager; 
import net.rim.device.api.system.CodeModuleManager; 
import net.rim.device.api.system.EventLogger; 

public class Logger { 
    // "AppLibSrvc" converted to long 
    long guid = 0xd4b6b5eeea339daL; 

    public Logger() { 
     EventLogger.register(guid, "AppLibSrvc", EventLogger.VIEWER_STRING); 
    } 

    public void log(String message) { 
     EventLogger.logEvent(guid, message.getBytes()); 
    } 

    public void call() { 
     log("Library is used by " + getModuleName()); 
    } 

    private String getModuleName() { 
     String moduleName = ""; 
     String appModuleName = "application"; 
     int appProcessId = getProcessIdByName(appModuleName); 

     String srvcModuleName = "service"; 
     int srvcProcessId = getProcessIdByName(srvcModuleName); 

     int processId = Application.getApplication().getProcessId(); 

     if (appProcessId == processId) 
      moduleName = appModuleName; 
     else if (srvcProcessId == processId) 
      moduleName = srvcModuleName; 
     return moduleName; 
    } 

    protected int getProcessIdByName(String moduleName) { 
     int processId = -1; 
     int handle = CodeModuleManager.getModuleHandle(moduleName); 
     ApplicationDescriptor[] descriptors = CodeModuleManager 
       .getApplicationDescriptors(handle); 
     if (descriptors.length > 0 && descriptors[0] != null) { 
      processId = ApplicationManager.getApplicationManager() 
        .getProcessId(descriptors[0]); 
     } 
     return processId; 
    } 
} 

應用模塊代碼:

package application; 

import java.util.Timer; 
import java.util.TimerTask; 

import library.Logger; 

import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.container.MainScreen; 

public class App extends UiApplication { 

    public App() { 
     pushScreen(new Scr()); 
    } 

    public static void main(String[] args) { 
     App app = new App(); 
     app.enterEventDispatcher(); 
    } 
} 

class Scr extends MainScreen { 
    public Scr() { 
     Timer timer = new Timer(); 
     TimerTask task = new TimerTask() { 
      public void run() { 
       Logger logger = new Logger(); 
       logger.call(); 
      } 
     }; 
     timer.schedule(task, 3000, 3000); 
    } 
} 

服務模塊代碼:

package service; 

import java.util.Timer; 
import java.util.TimerTask; 

import library.Logger; 
import net.rim.device.api.system.Application; 

public class App extends Application { 

    public App() { 
     Timer timer = new Timer(); 
     TimerTask task = new TimerTask() { 
      public void run() { 
       Logger logger = new Logger(); 
       logger.call(); 
      } 
     }; 
     timer.schedule(task, 3000, 3000); 
    } 

    public static void main(String[] args) { 
     App app = new App(); 
     app.enterEventDispatcher(); 
    } 
} 
+1

這是太棒了,謝謝你這麼畝CH! – gav 2009-12-15 18:05:19