解决后台杀应用,小米推送再次初始化导致ShareSDK初始化报错,使应用崩溃

打开任务管理器,杀死应用,导致程序奔溃,报下面的错误:

经过测试是加入小米推送导致的。问小米推送的技术支持,说从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会多次创建

在以后的开发过程中要多加注意!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值