使用android:process =“:remote”重新创建android应用程序对象

时间:2013-03-21 10:47:55

标签: android service process

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

我的问题是,当:remote进程启动时,它显然会重新创建Application个对象。

当我覆盖应用程序对象并在onCreate()方法中调用大量客户端内容时,我真的没有。但我希望服务代码与客户端驻留在同一个apk中。

我可以实现吗?在新进程启动时是否始终重新创建Application对象?

感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

  

我还想运行另一个进程

为什么呢?为用户增加了什么价值,以抵消额外的RAM,CPU和电池成本?很少有应用需要多个流程。

  

我的问题是,当':remote'进程启动时,它显然会重新创建Application对象

当然。每个流程都有自己的流程。

  

当我覆盖应用程序对象并在'onCreate()'方法中调用大量客户端内容时,我真的不这样做

然后摆脱android:process=":remote"。您的用户会感谢您。

  

但我希望服务代码与客户端驻留在同一个apk中。

什么服务?

  

当新进程启动时是否总是重新创建Application对象?

答案 1 :(得分: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;
}