BlackBerry - Получить текущий идентификатор процесса
Я прочитал Blackberry - Как получить идентификатор процесса фонового приложения, но я не уверен, что правильно его понял. Следующий код получает идентификатор процесса переднего плана;
ApplicationManager.getApplicationManager().getForegroundProcessId()
У меня есть два процесса, которые выполняют один и тот же кусок кода для установления соединения. Я хочу зарегистрировать процесс, который выполнял вызовы, вместе со всеми моими обычными данными регистрации, чтобы получить лучшее представление о том, как работает поток.
Можно ли получить идентификатор для процесса, который в данный момент выполняет код? Один процесс находится на переднем плане (процесс пользовательского интерфейса), а другой - на заднем плане, но оба используют одну и ту же библиотеку соединений, совместно используемую через хранилище времени выполнения.
Заранее спасибо!
Гав
1 ответ
Итак, у вас есть три модуля: приложение, библиотека и сервис.
Вам нужно получить дескриптор по имени модуля, а затем получить идентификатор процесса.
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();
внутри библиотечных методов. Я думаю, что лучше реализовать ведение журнала внутри библиотеки.
Когда вы получили идентификатор процесса приложения из кода библиотеки, вы можете сравнить его с идентификаторами, найденными по имени модуля, и тогда вы узнаете, какой модуль использует код библиотеки.
UPDATE2
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();
}
}