android6.0 禁止某权限导致app崩溃问题。
崩溃后,后台仍残留上次最后展示的activity,如果用户此时点击该activity,app将重启,并首先进入该activity。
崩溃时导致不能及时保存数据,如果activity引用了已经被销毁的数据将再次崩溃。
如果我们希望重启时不再崩溃或者希望每次启动app都要从指定入口activity进入,怎么办?
在残留的activity启动时判断下,是否是正常流程进入当前activity的,如果不是,则跳转回指定入口activity。
由于发生崩溃的activity事先并不知道,所以需要对所有activity进行检测。我是使用了BaseActivity统一处理。
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
onCheck();
}
private void onCheck(){
EsApplication application = (EsApplication)getApplication();
try {
Class clazz = Class.forName("com.icbc.test.usbkey.activitiy.LoginActivity"); // 入口activity
if (application.getActivities().size() == 0 && !getClass().equals(clazz)){
// 不是正常启动流程,则重回入口activity进入
Intent intent = new Intent(this, clazz);
if (null != getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)){
startActivity(new Intent(this, clazz));
}else{
System.out.println("找不到指定的activity");
}
return ;
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println( "error : "+e.getLocalizedMessage());
}
application.addActivity(this); // 记录每个activity
}
private static final String TAG = EsApplication.class.getSimpleName();
// 这里主要记录首个activity即可,我用list主要是有别的用处。
private ArrayList
public void onCreate(){
}
public List
return mActivityList;
}
public void addActivity(Activity activity){
mActivityList.add(activity);
}
public void removeActivity(Activity activity){
mActivityList.remove(activity);
}
}