打开任务管理器,杀死应用,导致程序奔溃,报下面的错误:
经过测试是加入小米推送导致的。问小米推送的技术支持,说从callstack中看,是share sdk只允许在主进程注册,不允许在其它进程注册。而小米推送需要创建不同的进程。
application的onCreate方法是“进程“的入口,app创建的所有进程都会调用这个方法。所以创建小米推送进程时调用了application的onCreate方法,导致了这个错误。解决方案是像小米推送初始化一样,在sharesdk初始化时加一个判断。
究其原因,这涉及到多进程模式的运行机制。小米的pushservice要跑在一个新的进程中的时候,由于系统要创建新的进程同时分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程。因此,相当于系统又把这个应用重新启动了一遍,所以会创建新的Application。为了更加清晰地展示这一点,下面我们来做个测试,首先在application的onCreate方法中打印出当前进程的名字,然后连续启动三个同一个应用内但属于不同进程的activity,按照期望,Application 的 onCreate 应该执行三次并打印出三次进程名不同的log,代码如下所示。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.d("thh", "[MyApplication onCreate] application start, process name:"+getProcessName());
}
private String getProcessName(){
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo:
activityManager.getRunningAppProcesses()) {
if (runningAppProcessInfo.pid == android.os.Process.myPid()) {
return runningAppProcessInfo.processName;
}
}
return null;
}
}
运行后通过log可以看出,Application执行了三次onCreate,并且每次的进程名称和进程id都不一样,它们的进程名和我们为activity指定的android:process属性一致。这也就证实了在多进程模式中,不同进程的组件的确会拥有独立的虚拟机、Application 以及内存空间。
此外,使用多线程会造成如下方面的问题:
1. 静态成员和单例模式完全失效
2. 线程同步机制完全失效
3. SharedPreferences的可靠性下降
4. Application会多次创建
在以后的开发过程中要多加注意!