2009-04-07 3 views
6

У меня два действия: mainActivity и childActivity. Всякий раз, когда пользователь нажимает кнопку в mainActivity, запускается childActivity. То, что я хочу сделать это:Android: Восстановление активной активности при возобновлении приложения

Когда активная деятельность является childActivity и пользователь нажимает на кнопку домой, а затем повторно запустить приложение, я хочу видеть childActivityвместоmainActivity который запущен.

У меня были некоторые предложения, которые действительно работают вокруг. Я пытался манипулировать onStart, onRestart, onResume, onStop, onDestroy событиями. Но они не полностью решили проблему. Там должен быть умный путь. Спасибо.

Edit:

Спасибо за ответ, Soonil. Случай, который вы сказали, происходит, когда действие вызывается из окна последних действий. (окно открывается, когда вы долго нажимаете кнопку «домой»). Этого не происходит, когда вы открываете его с главного экрана. (как открытие с начала) Я не думаю, что у моего кода есть определенная проблема для создания этой ошибки. Потому что я создал тестовый проект и попробовал автономный процесс перед отправкой вопроса и столкнулся с той же проблемой. Во всяком случае, вот тестовый код:

public class MainActivity extends Activity implements OnClickListener { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.setTitle("MainActivity"); 

     ((Button) findViewById(R.id.btnChildActivity)).setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     startActivity(new Intent(this, ChildActivity.class)); 
    } 

} 

public class ChildActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 
     this.setTitle("ChildActivity"); 

    } 
} 
+0

Просто проверил ваш пример без проблем. Последовательность, которую я взял: запустите приложение (теперь на экране MainActivity), нажмите кнопку (ChildActivity launchs), нажмите кнопку «домой» (теперь на главном экране), нажмите «Домой» и выберите «MainActivity» (в конечном итоге в ChildActivity), нажмите Назад (конец в MainActivity) – sooniln

+1

Хорошо. это то, чего я тоже ожидаю. Но как насчет запуска приложения с главного экрана? (не работает из недавнего меню приложения, когда вы долго нажимаете кнопку «домой», но на главном экране), я ожидаю увидеть мою ChildActivity. Однако; запускается MainActivity. Спасибо. –

+0

Извините, все тот же результат :(Нажмите кнопку приложения на главном экране (по MainActivity), нажмите кнопку (в ChildActivity), нажмите на дом (на главном экране), нажмите кнопку приложения на главном экране (в ChildActivity), нажмите MainActivity). Хотите ли вы, чтобы ваше приложение начало всегда на экране ChildActivity? – sooniln

ответ

3

EDIT: Найдено решение вашей проблемы несколько случайно сегодня! См. Это error report. Это точно объясняет вашу проблему. Причина, по которой я не мог воспроизвести проблему, - это то, что Eclipse не запускает приложение напрямую. Я использую Eclipse для установки приложения, а затем запускаю его сам.


Это поведение по умолчанию для приложений для Android, для этого не требуются специальные трюки. Я удивлен, что ваше приложение не демонстрирует это поведение. Каждое приложение Android поддерживает стек активности, буквально представляет собой стек действий LIFO. Эти действия могут быть сгруппированы в задачи, но 99% мирских приложений никогда не будут знать ничего о задачах в моем опыте.

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

Если ваше приложение не проявляет этого поведения, я подозреваю, что оно имеет какое-то отношение к тому, как вы начинаете mainActivity и childActivity и любые дополнительные флаги Intent, которые вы можете использовать. Есть ли вероятность опубликовать фрагменты кода о том, как вы начинаете mainActivity и childActivity?

+0

Вы правы. После того, как я подписал свое тестовое приложение и установил его в G1 и запустил, я увидел правильное поведение, которое я ожидаю увидеть. Следующее, что я собираюсь сделать, это очистить мой код от сохранения/восстановить состояния и повторить на моем устройстве. Большое спасибо за вашу помощь. :) –

+0

Soonil, я хочу задать вам не относящийся к делу вопрос. Используете ли вы автоматический сценарий для создания и экспорта своего приложения? Если да, то как вы это делаете? Я не мог понять экспорт специально для Android. Спасибо. –

+0

Я рассмотрел возможность использования ANT для построения, но в данный момент Eclipse делает все, что мне нужно. Я просто использую несколько скриптов, чтобы упростить подписание приложения. Вы можете найти довольно хорошее объяснение упрощенного процесса выпуска на http://developer.android.com/guide/publishing/app-signing.html – sooniln

-1

Я вернулся и протестирован с помощью аналогичного приложения, и даже когда процесс вытеснен из памяти, ChildActivity автоматически восстанавливается, как говорит Суонил. Вы видите это на эмуляторе или на самом устройстве?

Если запустить приложение и посмотреть LogCat, вы должны увидеть что-то вроде следующего после запуска вашего приложения, а затем откройте ChildActivity и нажмите кнопку Home, а затем начать свою деятельность еще раз:

Начиная активность: Намерение {действие = android.intent.action.MAIN categories = {android.intent.categroy.LAUNCHER} flags = ... comp = {com.yourpackagename.MainActivity}} Начать proc для активности yourpackagename.ChildActivity: pid = x uid = y gids = {} Показанная деятельность /.ChildActivity

Не могли бы вы вывести вывод logcat, когда вы не увидите поведение, которое вы ожидаете?

+0

AFAIK это неточно. Когда процесс убит и перезапускаются «Действия», стек активности сохраняется. Каждое действие должно сериализовать информацию только о ее собственном состоянии. Состояние общей активности стека поддерживается системой. (Я удалю свой downvote, если вы можете связать меня с доказательством) – sooniln

Смежные вопросы