我在我的应用中使用AIDL服务。
我还想运行另一个进程,所以我在清单中的服务声明中使用android:process=":remote"
。
我的问题是,当:remote
进程启动时,它显然会重新创建Application
个对象。
当我覆盖应用程序对象并在onCreate()
方法中调用大量客户端内容时,我真的没有。但我希望服务代码与客户端驻留在同一个apk中。
我可以实现吗?在新进程启动时是否始终重新创建Application
对象?
感谢您的帮助。谢谢!
答案 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;
}