Перезапуск моего приложения из того же состояния не удался, упс :( - PullRequest
2 голосов
/ 16 декабря 2011

То, что я пытаюсь сказать здесь, это проблема, с которой я сталкиваюсь, чтобы повторно запустить мое приложение из того же состояния, в котором оно было оставлено ранее.Я провел много исследований и разработок по этому вопросу и прошел через вопросы, размещенные в stackoverflow. Поэтому, пожалуйста, не нужно говорить, что это дубликат.

Я попытался поместить эти параметры
objIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
при запуске упражнения.Также я попробовал это,

objIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 

И, наконец, я попробовал этот метод также

    objIntent.setAction(Intent.ACTION_MAIN);
    objIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

Но ни один из них, кажется, не работает для меня.

Сценарий идет так, где это терпит неудачу.

  1. Я запускаю свое приложение, перехожу к какому-либо действию, начиная с начального действия, скажем, от A до B

  2. Теперь я нажму кнопку телефона на моем домашнем телефонеи выполнить некоторые действия, такие как нажатие на фотографию и т. д.

  3. Снова пытаюсь запустить приложение с домашнего экрана.

Упс!Теперь мое приложение не сохранило свое состояние, оно запускается из исходного состояния.

Примечание:

  1. Однако это не так во всехслучаи.иногда говорят, что примерно 1 или 2 раза из 10 или 15 раз он запускается из того же состояния, в котором он был ранее.

  2. Еще одно сомнение, которое у меня есть, мне нужно установить это для всех намерений?Скажем, у меня есть более 10 позиций Intent, т. Е. Начало деятельности.Нужно ли добавлять этот кусок кода во все эти места?Я включил это для 2 или 3 случаев

Обновление:

Это работает в режиме отладки, но когда дело доходит доточка apk создать, это не удается.Однако, если я попытаюсь несколько раз, это даст мне требуемый результат, и после этого он будет вести себя так, как ожидалось.Я ломаю голову, чтобы понять, почему так происходит.

У кого-нибудь есть ответ на этот вопрос?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Поддерживать активность в фоновом режиме не в ваших руках.Когда вы нажимаете кнопку «Домой», ваша текущая активность переходит в фоновый режим и может быть в любой момент прервана (будет вызываться onDestroy ()) в зависимости от потребности в памяти других запускаемых вами приложений.

Чем большеприложения, которые вы запускаете, тем больше шансов убить фоновое приложение.

0 голосов
/ 20 декабря 2011

Да, наконец, это возможно !! Благодаря форуму Google. Я сослался на это https://github.com/cleverua/android_startup_activity.

То, что я сделал в соответствии с этим, это создание активности при запуске. Внутри этого метода oncreate проверьте наличие специального метода с именем needStartApp () или чего-то другого в соответствии с вашим соглашением. Получите информацию о запущенных задачах и сравните ее с именем пакета нашего приложения. И если это правда, начните свою начальную деятельность. Отдых все идет хорошо.

Вот дополнительная активность, которую вы должны добавить,

public class StartupActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (needStartApp()) {
        Intent i = new Intent(StartupActivity.this, MainActivity.class);
        startActivity(i);
    }

    finish();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // this prevents StartupActivity recreation on Configuration changes 
    // (device orientation changes or hardware keyboard open/close).
    // just do nothing on these changes:
    super.onConfigurationChanged(null);
}

private boolean needStartApp() {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningTaskInfo> tasksInfo = am.getRunningTasks(1024);

    if (!tasksInfo.isEmpty()) {
        final String ourAppPackageName = getPackageName();
        RunningTaskInfo taskInfo;
        final int size = tasksInfo.size();
        for (int i = 0; i < size; i++) {
            taskInfo = tasksInfo.get(i);
            if (ourAppPackageName.equals(taskInfo.baseActivity.getPackageName())) {
                // continue application start only if there is the only Activity in the task
                // (BTW in this case this is the StartupActivity)
                return taskInfo.numActivities == 1;
            }
        }
    } 

    return true;
   }
 }

В конце не забудьте добавить это разрешение в манифест

    <uses-permission android:name="android.permission.GET_TASKS" />

«ОС Android действительно хороша, но не идеальна».

0 голосов
/ 19 декабря 2011

Если вы хотите «перезапустить» ваше приложение в том же состоянии, в котором его оставил пользователь, вы должны сохранить все состояние вашего приложения в методе onSaveInstanceState(Bundle) и восстановить его в методе onRestoreInstanceState (Bundle savedInstanceState). Как и Саураб, упомянутый в предыдущем ответе, вы не можете контролировать, когда ваше приложение может быть убито.

Вы можете использовать один из нескольких способов «сохранить» свое состояние - SharedPreferences и SQLite DB являются выдающимися.

...