views:

632

answers:

1

Hi all,

I read Blackberry - How to get the background application process id but I'm not sure I understand it correctly. The following code gets the foreground process id;

ApplicationManager.getApplicationManager().getForegroundProcessId()

I have two processes which execute the same piece of code to make a connection, I want to log the process which made the calls along with all my usual logging data to get a better idea of how the flow is working.

Is it possible to get the id for the process which is currently running the code? One process is in the foreground (UI process) and the other is in the background but both use the same connection library shared via the runtime store.

Thanks in advance!

Gav

+2  A: 

So you have three modules: application, library and service.
You need to get descriptor by module name, and then get process 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]);
}

Then, to log which module uses library, use

Application.getApplication().getProcessId();

inside library methods. I think its better to implement logging inside library.
When you got process id of application from library code, you can compare it with id's found by module name and then you will know what module uses library code.
UPDATE2
alt text
library module code:

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;
    }
}

application module code:

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);
    }
}

service module code:

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();
    }
}
Max Gontar
This is fantastic, thank you so much!
gav