这几天遇到一个比较纠结的bug,原因是集成了一个第三方推送的sdk,结果导致了所有的网络请求瘫痪了,也就是页面一直处于loading状态。经过几天的排查,终于发现原来是第三方的service是独立进程,会导致全局Application的OnCreate被多次调用,当第三方的服务启动或重启时,调用OnCreate,而我们自己的应用的服务是在这里启动和绑定的。所以我们的service绑定在了第三方推送的进程里了,与我们应用本身的进程断开了连接。
废话不多说了,解决方案如下,上代码:
- public void onCreate() {
-
- String processName = TestUtils.getProcessName(this, android.os.Process.myPid());
- if(processName != null){
- boolean defaultProcess = processName.equals("com.android.test");
- if(defaultProcess){
-
- initApp();
- }
- }
-
- super.onCreate();
- }
- public static String getProcessName(Context cxt, int pid) {
- ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
- if (runningApps == null) {
- return null;
- }
- for (RunningAppProcessInfo procInfo : runningApps) {
- if (procInfo.pid == pid) {
- return procInfo.processName;
- }
- }
- return null;
- }
解决方案就是在Application的OnCreate的方法里针对不同的进程做不同的初始化即可。
PS:不过很奇怪的第三方进程绑定service却连ServiceConnection的onServiceConnected方法都不调用了,调用栈只能看到是系统发起的,而原本这个方法是在onServiceConnected方法中调用的(等有时间再细看):