2013-07-26 4 views
1

Моя проблема заключается в понимании правильного использования намерений. После поиска в Google и чтения всех документов и статей по этой теме я все еще не могу разобраться в моей проблеме. У меня есть два вида деятельности: «Поиск» и «ActivityWordInfo». Операция «Поиск» выполняет поиск слова в базе данных и отображает результаты поиска или предложения. После того, как пользователь произведет один из результатов поиска, запускается активность ActivityWordInfo и дублирует определение слова. Вот какая-то часть кода:Android Intent flags

Searchable:

 @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.search); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     // Get the intent, verify the action and get the query 
     if(savedInstanceState != null){ 
      //the application is being reloaded 
      query = savedInstanceState.getString("searchedWord"); 
      doMySearch(query); //does the search in the database 
     }else{ 
      Intent intent = getIntent(); 
      if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
       query = intent.getStringExtra(SearchManager.QUERY); 
       doMySearch(query); 
      } 
     } 
} 
@Override 
    public void onSaveInstanceState(Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putString("searchedWord", query); 
     //saves the searched word if this activity is killed 
    } 
@Override 
    public void onClick(View v) { //when one of the search results is clicked 
     int wordID = (Integer) v.getTag(); 
     Intent intent = new Intent(Searchable.this, ActivityWordInfo.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     Bundle b = new Bundle(); 
     b.putInt("key", wordID); 
     b.putInt("calling_activity", callingActivityId);  
     intent.putExtras(b); 
    startActivity(intent); 
    } 

ActivityWordInfo:

public void onCreate(Bundle savedInstanceState) { 
... 
Bundle b = getIntent().getExtras(); 
     current_word_id = b.getInt("key", 0); 
     callingActivityId = b.getInt("calling_activity", 0); 
@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      switch(callingActivityId){ 
      case 3: //which is the ID of Searchable activity 
       Intent intent3 = new Intent(ActivityWordInfo.this, Searchable.class); 
       intent3.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       startActivity(intent3); 
       break; 
      } 
      break; 
} 

Когда пользователь находится в ActivityWordInfo и переходит вверх, я ожидаю, чтобы перейти к Searchable деятельности, которая должна сохранили свое состояние экземпляра (список результатов должен быть еще там). Что на самом деле происходит: - Слово, введенное пользователем, присваивается переменной «запрос», а затем результаты и предложения отображаются в «Поиск» - пользователь нажимает одно из слов и создается «ActivityWordInfo» -then , когда пользователь перемещается вверх, вызывается функция onSaveInstanceState для активности «Searchable», затем она уничтожается и создается. В результате получается пустой макет :(

Я не могу понять, почему «Поиск» уничтожен, а затем создан! Это происходит только в Android 4.2, а не в более низких API (в 2.3.3 работало отлично, как я и ожидал). любая разница в жизненном цикле активности в Jellybean

Примечание:?. Я не могу использовать атрибут parentActivity в манифесте, так как ActivityWordInfo вызывается несколькими родителями

ответ

0

поведение «вверх» навигация изменяется между 2.3 и 4.0. Предлагаю вам ознакомиться с темой «Tasks and Back Stack» на developer.android.com.

+0

The pr oblem - это то, почему «Searchable» уничтожается, и сохраненный экземпляр теряется. Я думаю, проблема связана с флагом, который я использовал, но я все еще не могу понять, почему. Я использовал FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP, чтобы закончить ActivityWordInfo и запретить Searchable создавать новый экземпляр. Я не сейчас, если я прав, но это кажется логичным. – evis