Как вернуться к последнему действию при повторном открытии приложения после его закрытия (уничтожения)? [Дубликат]

Другим случаем, когда 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) {
   // ...
}

35
задан Gray 21 February 2011 в 20:13
поделиться

3 ответа

При запуске с помощью значка на главном экране 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
  • . Активность Dispatcher , очевидно, должна быть android.intent.action.MAIN action
47
ответ дан Josef Pfleger 27 August 2018 в 02:48
поделиться

Этот является поведением по умолчанию, и этот вопрос задавался несколько раз: Android: сохранить стек активности задачи после перезагрузки из HOME Android Запустить приложение из последнего Activity

Обратите внимание, что если вы запускаете приложение из Eclipse, это нарушает эту стандартную функциональность. Изменение конфигурации запуска для запуска никакой активности должно исправлять.

Однако, поскольку это поведение было исправлено в выпуске 0.9.6 плагина ADT для Eclipse за последние несколько недель , вам больше не нужно обходное решение:

Приложения, запущенные из ADT, теперь ведут себя так, как если бы они были нажаты на главном экране.

3
ответ дан Community 27 August 2018 в 02:48
поделиться

Это не так сложно. Вам просто нужно манипулировать манифестом.

AndroidManifest.xm

<activity
     android:name=".MainActivity"
     android:alwaysRetainTaskState="true"
     android:exported="true"
     .
     .
     .

Читайте о 'android: exported' & amp; 'android: alwaysRetainTaskState' здесь:

android: экспортировано

android: alwaysRetainTaskState

5
ответ дан Shayan_Aryan 27 August 2018 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: