Другим случаем, когда NullReferenceExceptions
может случиться, является (неправильное) использование оператора as
:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
Здесь Book
и Car
являются несовместимыми типами; a Car
не может быть преобразован / передан в Book
. Когда этот сбой завершается неудачно, as
возвращает null
. Используя mybook
после этого, вы вызываете NullReferenceException
.
В общем случае вы должны использовать cast или as
, как показано ниже:
Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:
ComicBook cb = (ComicBook)specificBook;
Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as
:
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
При запуске с помощью значка на главном экране Android всегда будет запускать действие с фильтром android.intent.action.MAIN
в вашем AndroidManifest.xml
, если приложение уже не запущено (в этом случае оно, очевидно, будет восстанавливать активность поверх стека).
Чтобы достичь описанного, вы можете просто сохранить последнее видимое действие в SharedPreferences
и иметь Dispatcher активность, которая запускает последнее действие в соответствии с предпочтениями.
Итак, в каждом действии, который вы хотите перезапустить автоматически:
@Override
protected void onPause() {
super.onPause();
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putString("lastActivity", getClass().getName());
editor.commit();
}
И активность Dispatcher аналогична следующей:
public class Dispatcher extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Class<?> activityClass;
try {
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
activityClass = Class.forName(
prefs.getString("lastActivity", Activity1.class.getName()));
} catch(ClassNotFoundException ex) {
activityClass = Activity1.class;
}
startActivity(new Intent(this, activityClass));
}
}
Замечания
onPause
android.intent.action.MAIN
action Этот является поведением по умолчанию, и этот вопрос задавался несколько раз: Android: сохранить стек активности задачи после перезагрузки из HOME Android Запустить приложение из последнего Activity
Обратите внимание, что если вы запускаете приложение из Eclipse, это нарушает эту стандартную функциональность. Изменение конфигурации запуска для запуска никакой активности должно исправлять.
Однако, поскольку это поведение было исправлено в выпуске 0.9.6 плагина ADT для Eclipse за последние несколько недель , вам больше не нужно обходное решение:
Приложения, запущенные из ADT, теперь ведут себя так, как если бы они были нажаты на главном экране.
blockquote>
Это не так сложно. Вам просто нужно манипулировать манифестом.
AndroidManifest.xm
<activity
android:name=".MainActivity"
android:alwaysRetainTaskState="true"
android:exported="true"
.
.
.
Читайте о 'android: exported' & amp; 'android: alwaysRetainTaskState' здесь: