Метод setRequestedOrientation обычно перезапускает действие на любой версии Android выше, чем Kitkat.
Но в Kitkat, даже используя if, действие продолжает перезапускаться.
int orientation = getResources().getConfiguration().orientation;
// Doesn't work
if (orientation != ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
// Doesn't work
if (orientation != Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
РЕДАКТИРОВАТЬ 1 - StackTrace:
https://gist.github.com/sshnakamoto/11ef6179a561054e54ec4d41a03238f0
Извините, мой журнал слишком длинный, чтобы размещать его здесь. Я создал суть. Но по сути вы увидите цикл между методами onCreate () и onStart ().
РЕДАКТИРОВАТЬ 2 - ActivityCode:
public class TestActivity extends AppCompatActivity {
private static final String TAG = "TimerActivityCLONE";
private TextView textView;
private ConstraintLayout parentView;
private boolean isColorChanged;
private int textColor;
private int parentColor;
private Handler handler;
private Runnable runnable;
private Timer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: started ");
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: super called ");
setContentView(R.layout.activity_timer);
Log.d(TAG, "onCreate: setContentView called ");
/* Find on layout*/
parentView = findViewById(R.id.parent);
textView = findViewById(R.id.textView);
textColor = Color.WHITE;
parentColor = Color.BLACK;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
private void initTimer() {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
changeColors();
}
};
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
handler.post(runnable);
}
};
timer = new Timer();
timer.schedule(timerTask, 0, 1000);
}
private void changeColors() {
Log.d(TAG, "changeColors: size " + textView.getTextSize() / getResources().getDisplayMetrics().scaledDensity);
if (isColorChanged){
textView.setTextColor(parentColor);
parentView.setBackgroundColor(textColor);
isColorChanged = false;
} else {
textView.setTextColor(textColor);
parentView.setBackgroundColor(parentColor);
isColorChanged = true;
}
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
/* Start to show */
initTimer();
}
@Override
protected void onStop() {
super.onStop();
killTaskAndFinish();
}
@Override
public void onBackPressed() {
super.onBackPressed();
killTaskAndFinish();
}
private void killTaskAndFinish() {
/* Kill background Thread */
timer.cancel();
timer.purge();
handler.removeCallbacks(runnable);
/* Restore user screen orientation */
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
Я обнаружил ошибку, она возникает при вызове метода killTaskAndFinish () внутри onStop () из-за перезапуска метода ResquestedOrientation ().
Но почему этот цикл возникает только на Kitkat (эмуляторе?)? Тестирую Lollipop не получилось
Как это исправить?
Просто с помощью этого кода я не могу понять, что происходит, и не понимаю вопроса. Можете ли вы добавить stacktrace, записать, если они есть. И разместите больше кода, чтобы лучше понять, что вы хотите.
crammeur, у меня сейчас есть трассировка стека. Я опубликовал свой вопрос. Код активности я скоро опубликую
Я не знаю, почему происходит только на KikKat, но мне удалось исправить удаление использования обработчика. В моем случае понадобился только TimerTask.
Это исправляет эту ошибку и предотвращает утечки памяти.
@Override
protected void onStart() {
super.onStart();
timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
changeColors();
}
});
}
};
timer = new Timer();
timer.schedule(timerTask, 0, speed);
}
@Override
protected void onStop() {
super.onStop();
timerTask.cancel();
timer.cancel();
timer.purge();
}
Какой у Вас вопрос?