views:

467

answers:

3

So I have two Activities. The main is called Main, and the child one is called Child. When a button is clicked in the main activity it triggers the following piece of code:

Intent i = new Intent(Main.this, Child.class);
Main.this.startActivity(i);

That opens the Child activity.

As soon as I call finish() or press the back button within the child activity instead of going back to the main one, the app just closes. Can you give me a hint where the problem might be :(

P.S. By trial and error I found out that if edit AndroidManifest.xml and add

android:theme="@android:style/Theme.Dialog"

within the declaration of Child the back button and calling finish() behaves as expected: closes the child activity and brings the main into focus. The problem is that when I start typing in an EditText the screen starts flickering (rather bizzare). So I can't use it as a dialog. My main activity uses the camera, so that might be making problems. Although when the child activity is started, the onPause event is fired and it stops the camera until onResume is called.

Edit:

So I tried using startActivityForResult and added

Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show();

to the onPause and a similar one to the onResume methods. When the Child returns onResume doesn't get triggered. I even overrided onActivityResult and even that doesn't get triggered. :( So bizarre...

I think I found the problem but I can't solve it myself

When the Child activity is activated, onStop and immediately after that onDestroy are invoked within the Main activity. But why?!?

+1  A: 

According to http://developer.android.com/resources/faq/commontasks.html#opennewscreen what happens when you launch the new Activity is indeed different:
If the first Activity is still visible somehow (as you discovered, if it's shown as dialog for example), it will just receive onPause(); if it's not visible at all anymore, it will receive onStop() too.
But as the other said, if you're launching the second activity to get results from it, startActivityForResults seems more logical

(I'm new and learning formatting too, you may want to read the help by clicking on the orange question mark - use 4 spaces before code samples to indent them, apparently)

Joubarc
+1  A: 

You should be able to do the following:

Intent i = new Intent(this, Child.class);
startActivityForResult(i);

(You only need Main.this if you are invoking this from an inner class).

When you want to exit the child activity:

setResult(Result.OK);
finish();

This should cause onActivityResult to be invoked in your Main class, followed by OnResume.

If that doesn't work, you might try putting break points or print statements in the various onX methods, to see which are being called.

Mayra
Well, that's weird. onResume is never fired when I press finish() within my Child class. I used Toast to show notification every time onPause or onResume is triggered, and they do get triggered when I start up Main but onResume doesn't get invoked when Child returns :x
Martin Marinov
So you saw OnActivityResult called, but not onResume? I'm not sure that showing toasts is a good way to debug this. I've seen them have odd side effects. You might be better off with log statements or using the debugger.
Mayra
A: 

I used Dialog instead of an Activity and everything worked well so I'm leaving it like that.

Martin Marinov