我在我的应用程序中使用 AIDL 服务。我还想运行另一个进程,所以我android:process=":remote"
在清单中的服务声明中使用。
我的问题是,当:remote
进程启动时,它显然会重新创建Application
对象。
我真的不这样做,因为我覆盖了应用程序对象并在onCreate()
方法中调用了很多客户端的东西。然而,我希望服务代码与客户端驻留在同一个 apk 中。
我能做到吗?Application
新进程启动时是否总是重新创建对象?
感谢你的帮助。谢谢!
我也想运行另一个进程
为什么?这为用户增加了什么价值,以抵消额外的 RAM、CPU 和电池成本?很少有应用程序需要多个进程。
我的问题是,当 ':remote' 进程启动时,它显然会重新创建 Application 对象
当然。每个过程都有自己的。
我真的不这样做,因为我覆盖了应用程序对象并在“onCreate()”方法中调用了很多客户端的东西
然后摆脱android:process=":remote"
。您的用户会感谢您。
然而,我希望服务代码与客户端驻留在同一个 apk 中。
什么服务?
新进程启动时是否总是重新创建应用程序对象?
是的。
正如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;
}