2012-04-06 3 views
8

У меня есть 2 мероприятия, каждый в отдельных приложениях. Activity1 имеет кнопку, пользователь может нажать и он вызывает вторую деятельность, используя намерение в onClick() метод:Android onActivityResult называется ранним

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2); 
startActivityForResult(myIntent, 600); 

Это правильно запускает деятельности2 из Activity1, но onActivityResult вызывается в Activity1 перед тем onCreate вызывается в деятельности2, вместо в onBackPressed(), где я установил намерение возвращения.

Вот onCreate метод деятельности2:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

Вот текущая версия onBackPressed метода деятельности2:

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("Stuff", someStuff); 

    if(getParent()==null){ 
     setResult(Activity.RESULT_OK, intent); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 
    finish(); 
    super.onBackPressed(); 
} 

Мой AndroidManifest.xml имеет следующий фильтр намерений для деятельности2:

<intent-filter> 
    <action android:name="android.intent.action.MAIN"/> 
    <category android:name="android.intent.category.LAUNCHER"/> 
</intent-filter> 

Я подтвердил, что мой launchMode - standard (а не singleTask и т. Д.), Как рекомендовано here, а мой код запроса не является отрицательным, как указано here. Я также пробовал android:launchMode="singleTop", но это тоже не было.

Я также попытался не называя finish() в onBackPressed() для деятельности2 как упомянуто here (также только с super.onBackPressed(), как было предложено here) и снова называть его, как предложил here.

Кроме того, я попытался прокомментировать линию intent.putExtra("Stuff", someStuff);, так как это вызвало ошибку для this person.

Любые идеи относительно того, что я могу делать неправильно?

ответ

9

Так вот окончательное решение, позаботилась об этом:

Я изменил намерение для Activity1 на следующее:

Intent myIntent = new Intent(); 
myIntent.setClassName("com.myProject", "com.myProject.Activity2"); 
startActivityForResult(myIntent, 600); 

По какой-то причине Android требуется полное имя для второго параметра в дополнение к названию пакета, заданному первым параметром. Теперь это работает! :)

+1

Благодарим вас за то, что вы вернулись и разместили свое решение. Я давно застрял в этой проблеме, и я тоже пробовал все решения, с которыми вы столкнулись в вашем вопросе, безрезультатно. Это зафиксировало это и сделало мой день намного лучше =) –

+0

Я использую startActivityForResult БЕЗ setClassName или полностью квалифицированные имена по всем моим проектам, и все они отлично работают, за исключением одного случая. Поэтому я попробовал ваше решение в этом случае, и это не имело никакого значения. – user316117

+0

2 часа !! Спасибо вам за то, что вы нашли решение. – Anthone

0

Не знаете, в чем проблема. То, как вы создаете намерение в Activity1, является нечетным; этот метод не предназначен для создания намерений, запускающих другое действие в одном приложении. Некоторые разработчики используют конструктор Intent (Context, Class <>). Я предпочитаю использовать Intent (действие String) с пользовательской строкой действия, определенной только в моем приложении (что проще кодировать правильно).

Также, фильтр намерений, указанный вами для Activity2, обычно используется для активности, которая запускается непосредственно с главного экрана.

Где код onCreate() для activity2? Где код для onBackPressed()? Можете ли вы доказать мне, что setResult() вызывается перед другим кодом в Activity2? Вы должны запускать действия в отладке. Убедитесь, что Activity2 получает намерение, которое, по вашему мнению, должно, затем проследите шаг за шагом инструкции, которые выполняются до setResult(). Вещь не, чтобы сделать это бросить решения в коде, прежде чем вы поймете, в чем заключается основная проблема.

Насколько я могу судить, Activity1 отправляет Intent, а затем вызывается onActivityResult. Пока ничего не доказано.

+0

Спасибо за комментарий - я добавил методы 'onCreate' и' onBackPressed' к вопросу. Я много раз запускал его отладку и использовал точки останова, которые я смог показать, что «onActivityResult» Activity1 вызывается при первом запуске Activity2 - до того, как Activity2 когда-либо вернется и не будет вызван снова, когда он вернется. – user1205577

+0

Я также попытался создать намерение с использованием 'Intent (context, Activity2.class)', но он жаловался, что он не может найти класс (возможно, потому, что он находится в другом приложении). Я попробовал несколько вариантов использования полного имени пути, и это тоже не было. – user1205577

1

Это произойдет, если флаг «singleInstance» установлен при запуске операции.

+0

Спасибо jbaylina, ваш ответ мне полезен – Swapnil

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