Ответ 1
Итак, после приобретения устройства Samsung (S6) и возможности воспроизвести эту проблему, я придумал решение, описанное ниже.
Сама ошибка возникает из плавающей панели инструментов и режимов действий, которые были добавлены в Marshmallow. При выборе текста на устройстве зефира появляется нечто вроде этого:
Если пользователь затем переходит к другому действию (например, назад), не закрывая плавающую панель инструментов, приложение выходит из строя на устройствах Samsung. Это в основном пытается добавить плавучую панель инструментов к предстоящей активности.
Подробнее о плавающей панели: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection
Таким образом, решение состоит в том, чтобы управлять жизненным циклом режима действия и убедиться, что он заканчивается до начала любой новой активности. У меня есть базовый класс активности, который наследует все мои действия, поэтому имеет смысл добавить туда решение.
public class BaseActivity extends AppCompatActivity {
private ActionMode mActionMode;
/**
* Store action mode if it is started
* @param mode
*/
@Override
public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
mActionMode = mode;
}
/**
* When activity is paused, make sure action mode is ended properly.
* This check would feel better to have in onDestroy(), but that seems to be
* too late down the life cycle and the crash keeps on occurring. The drawback
* of this solution is that the action mode is finished when app is minimized etc.
*/
@Override
protected void onPause() {
super.onPause();
endActionMode();
}
/**
* Makes sure action mode is ended
*/
private void endActionMode() {
if (mActionMode != null) {
mActionMode.finish(); /** immediately calls {@link #onActionModeFinished(ActionMode)} */
}
}
/**
* Clear action mode every time it finishes.
* @param mode
*/
@Override
public void onActionModeFinished(ActionMode mode) {
super.onActionModeFinished(mode);
mActionMode = null;
}
}