И так, постараюсь привести пример не разумного применения статиков и как мой ранее приведенный код может в этом помочь.
Есть активность.
[syntax=java]public class MainActivity extends ActionBarActivity {
public static String sStaticString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("MainActivity");
sStaticString = "Static Text";
}
public void onClick(View view) {
startActivity(new Intent(this, SecondActivity.class));
}
}[/syntax]Все предельно просто. При создании записывается значение в статик ссылку, по нажатию на кнопку запускается второе активити.
Вот разметка
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_gravity="center_horizontal"
android:onClick="onClick" />
</LinearLayout>[/syntax]
Второе активити
[syntax=java]public class SecondActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Static string length = " + MainActivity.sStaticString.length());
}
public void onClick(View view) {
Thread systemExitThread = new Thread() {
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
runOnUiThread(new Runnable() {
public void run() {
System.exit(0);
}
});
};
};
systemExitThread .start();
}
}[/syntax]Разметку новую делать не стал взял из главной ативити. По нажатию на кнопку запускается код по убиванию приложения через 5 секунд. Статик ссылка здесь используется для присваивания заголовка.
Это весь код. Теперь запускаем приложение, жмем на кнопку, открывается второе активити, жмем еще раз на кнопку во второй активности, и сворачиваем приложение. Ждем 5 секунд и разворачиваем. Итог - падение всего приложения.
И не надо говорить, что ошибка в примере глупая и нужно на null проверять. null в статике может быть запрятан так далеко, что сразу и не поймешь.
Кстати, всем советую делать такую проверку для все активити в своих приложениях. Так как ни кода не угадаешь как поведет себя приложение если система его убьет.
У меня количество неизвестных ошибок в баг репортах снизилось в разы, после того как я начал применять этот подход.
В заключение:
Если закомментировать строку: setTitle("Static string length = " + MainActivity.sStaticString.length());
ошибок не будет. И даже стек активностей сохранится. Если нажать кнопку назад, мы вернемся на главное активити. То есть, приложение ведет себя так, будто и не было убито.