5

アプリで AIDL サービスを使用しています。また、別のプロセスで実行したいのでandroid:process=":remote"、マニフェストで in service 宣言を使用します。

私の問題は、:remoteプロセスが開始されると、明らかにApplicationオブジェクトが再作成されることです。

アプリケーションオブジェクトをオーバーライドし、メソッドで多くのクライアントのものを呼び出すので、私は本当にそうしませんonCreate()。それでも、サービス コードをクライアントと同じ apk に常駐させたいと考えています。

私はそれを達成できますか?新しいプロセスが開始されると、オブジェクトはApplication常に再作成されますか?

あなたの助けに感謝。ありがとう!

4

2 に答える 2

4

また、別のプロセスで実行したい

なんで?追加の RAM、CPU、およびバッテリーのコストを相殺するために、ユーザーにどのような価値が追加されますか? 複数のプロセスが必要なアプリはほとんどありません。

私の問題は、「:remote」プロセスが開始されると、明らかに Application オブジェクトが再作成されることです

もちろん。各プロセスは独自のものを取得します。

アプリケーションオブジェクトをオーバーライドし、「onCreate()」メソッドで多くのクライアントのものを呼び出すので、私は本当にそれをしません

次に、を取り除きandroid:process=":remote"ます。あなたのユーザーはあなたに感謝します。

それでも、サービス コードをクライアントと同じ apk に常駐させたいと考えています。

どんなサービス?

新しいプロセスが開始されると、アプリケーションオブジェクトは常に再作成されますか?

はい。

于 2013-03-21T11:59:19.320 に答える
2

CommonsWareで既に述べたように、各プロセスは独自のApplicationオブジェクトを取得します。

メソッドでは、Application.onCreate()メソッドがメイン プロセス内から呼び出されているか、リモート プロセス内から呼び出されているかを確認し、それに応じてさまざまなものを初期化できます。

@Override
public void onCreate()
{
    super.onCreate();

    if(isRemoteProcess(this))
    {
        // initialize remote process stuff here
    }
    else
    {
        // initialize main process stuff here
    }
}

private boolean isRemoteProcess(Context context)
{
    Context applicationContext = context.getApplicationContext();
    long myPid = (long) Process.myPid();
    List<RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) applicationContext.getSystemService("activity")).getRunningAppProcesses();
    if (runningAppProcesses != null && runningAppProcesses.size() != 0)
    {
        for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
        {
            if (((long) runningAppProcessInfo.pid) == myPid && "YOUR_PACKAGE_NAME:remote".equals(runningAppProcessInfo.processName))
            {
                return true;
            }
        }
    }
    return false;
}
于 2015-03-06T20:25:52.300 に答える