3

Blackberry - How to get the background application process idを読みましたが、正しく理解できていません。次のコードは、フォアグラウンド プロセス ID を取得します。

ApplicationManager.getApplicationManager().getForegroundProcessId()

接続を確立するために同じコードを実行する 2 つのプロセスがあります。フローがどのように機能しているかをよりよく理解するために、呼び出しを行ったプロセスと通常のすべてのログ データをログに記録したいと考えています。

現在コードを実行しているプロセスの ID を取得することは可能ですか? 1 つのプロセスはフォアグラウンド (UI プロセス) にあり、もう 1 つのプロセスはバックグラウンドにありますが、どちらもランタイム ストアを介して共有される同じ接続ライブラリを使用します。

前もって感謝します!

ガブ

4

1 に答える 1

4

つまり、アプリケーション、ライブラリ、サービスの3つのモジュールがあります。
モジュール名で記述子を取得してから、プロセス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
代替テキスト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();
    }
}
于 2009-12-11T13:12:19.803 に答える