5

我在我的应用程序中使用 AIDL 服务。我还想运行另一个进程,所以我android:process=":remote"在清单中的服务声明中使用。

我的问题是,当: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 回答