版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cao126197103/article/details/77261631
在android 系统中一个应用默认有一个进程,但是我们可以通过配置实现多个进程。
在接入极光推送时因为极光pushserice配置一个进程,造成application运行两次 一般在application中进行应用初始化,初始化两次有可能会出问题。
解决办法有两个
1. 去掉多创建的进程
<!-- Required SDK 核心功能-->
<!-- 可配置android:process参数将PushService放在其他进程中 -->
<service
android:name="cn.jpush.android.service.PushService"
android:process=""
android:exported="false"
tools:node="replace">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" />
<action android:name="cn.jpush.android.intent.PushService" />
<action android:name="cn.jpush.android.intent.PUSH_TIME" />
</intent-filter>
</service>
2.在application个中判断是不是当前应用进程
//获取进程名字
private String getCurrentProcessName() {
String currentProcName = "";
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
currentProcName = processInfo.processName;
break;
}
}
return currentProcName;
}
String currentProcessName = getCurrentProcessName();
if (getPackageName().equals(currentProcessName)) {
onAppCreate();
}
在修改applicationId后,前面提到的IDE自动生成的类(譬如R、BuildConfig),包名不会被更新,仍然是AndroidManifest.xml中定义的包名,使用他们的类中的import语句也不需要更改,但在修改applicationId之后,查看运行时进程名,会变成新的applicationId。在程序内运行时调用Context.getPackageName(),得到的仍然是新的applicationId,所以可以根据获取的报名来判断是不是应用当前的进程