My app has two activities. Activity A is the main activity and it has
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
in the manifest. I do not set any android:launchMode for A. Activity A launches Activity B. I press home button in activity B and return to Android menu. If I press my app icon in Android menu, would it launch new instance of activity A or return back to B?
I can see it returns back to activity B and I do not understand why. As I did not set android:launchMode, it should launch new instance of A every time I press icon, shouldn't it?
Activity B launches because when you press your Home button, the application is not "closed", but merely sent to the background. Such is the workflow of Android. If you want to finish Activity B when it is sent to the background, you can call this.finish() in an overridden onPause() function in Activity B.
For more information on managing the Activity lifecycle, check out this very useful tutorial: http://developer.android.com/training/basics/activity-lifecycle/index.html
Related
the flow is like below.
MainActivity -> Second Activity
Press home key then device main screen shown.
Enter to app box and click the application icon.
I expect the second activity should be launched but main activity launched.
is there any way that I control it -?!
The default Android behaviour when you press the home button is that the current activity is pushed onto the stack, unless you called finish() in your activity. Whenever you open your application it will launch the activity that's on top of your stack.
I'ts based on your system memory. If you don't have enough memory to keep your activity backgrounded then Android will kill your activity and its state to recoup some memory. I'm thinking that perhaps your phone (or emulated device) is running short of memory.
Check if you are using for that activity, any android:noHistory="true" within your App's manifest. Try removing it.
You filtered your main activity by
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
so it should get launched when you click on the icon in your launcher. I think you should handle your pages with fragments to have the behavior you want.
boolean isSentToBackground = false;
public void onResume(){
if(isSentToBackground) {
finish();
}
}
public void onPause(){
isSentToBackground = true;
}
I have looking for the some suggestions for back to last opened activity when launch from app icon. But still has some side effects to handle.
LauncherActivity is the entry activity which listen for
<activity
android:name="com.app.ui.LauncherActivity"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="nosensor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Then there is another second activity and third activity.
My scenario is as below:
1. LauncherActivity -> SecondActivity
2. SecondActivity -> ThirdActivity (When launching ThirdAcitivity, SecondActivity will finish itself)
So when at ThirdActivity, user click home key.
If the app is opened from recentTask, then the last opened ThirdActivity will be shown. This is the behavior what i want.
But when the app is opened from the app icon shortcut, then it take to the LauncherActivity. But i want it to be the same behavior as recentTask. If the last opened ThirdActivity is not being destroyed, then it should show this one instead of LauncherActivity.
However if the app force stop and then restart or ThirdActivity is being destroyed, then no need to go back to ThirdActivity. Back to LauncherActivity is ok.
I have been looking for solution. The suggestion of saving last activity to sharedPreference is not good for my case.
I would like to know how to achieve like launch from recent task. Is any one can guide me. Thanks a lot.
In your Launcher activity onCreate() method, write this:
if (!isTaskRoot()
&& getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
&& getIntent().getAction() != null
&& getIntent().getAction().equals(Intent.ACTION_MAIN)) {
finish();
return;
}
isTaskRoot() is true when there are no activities in activity stack. In your case, if another activity (Third activity in your case) is there in Activity stack, above code will finish the launching activity and will bring Third Activity to screen.
You can handle this by having three fragments in one activity. Let's that activity be your LaunchActivity, then it has LAUNCHER intent-filter and always opens when you click app icon. If you had three fragments in that activity then the last fragment is opening just like when you open your app from recent tasks.
You could also remove launchMode="singleTask". Most apps don't need it.
I have the following activity structure in my application
A simple "splash screen" activity is started when the application is fired up (let's call it "Splash"). This activity starts the main activity when the user presses a button (I will call it "Main").
Main can in turn start two activities from the menu. The first activity presents a simple form (let's call this one "Form"), the second is a MapActivity that presents a map (it is called "Map").
Main, Form, and Map are declared exactly the same in the manifest:
<activity android:name="fully qualified activity class"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation"
>
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
When Main is active and I start Form and press "back", Main comes up again. Pressing "back" again brings up "Splash". Nothing strange here.
Now comes the strange part: when I am in Main, start Map, and press "back", Main comes up as expected. But pressing "back" again just restarts Main. A second press on "back" is needed to bring me back to Splash!
So it seems that starting the Map activity somehow results in Main ending up on the activity stack twice while starting the Form activity does not!
Both Form and Map are started like this:
startActivity(new Intent(this, MyActivity.class));
I don not catch the back key in any activity.
Any clues on what is going on or how to debug this?
I think I have seen this behavior before in one of my projects. Try setting the launchMode property of your launcher activity ( in your case Splash ) to - android:launchMode="singleTask" in the manifest file.
This should help clarify: http://developer.android.com/guide/topics/fundamentals.html#acttask
I have an application with 2 activities, LogonAct and MainAct. LogonAct is a logon activity which I want to force the user to go through each time they return to the application. I've set android:clearTaskOnLaunch="true" on LogonAct.
When I first start the app I go through this sequence of screens,
Home -> LogonAct -> MainAct -> Home
I then follow this sequence,
LogonAct -> Back -> MainAct
Why is it bringing me back to MainAct? Shouldn't that activity haven been closed since LogonAct has android:clearTaskOnLaunch="true". I expected to be brought back to Home when I hit the Back button from LogonAct.
Relevant snippets from AndroidManifest.xml,
<activity android:name=".LogonAct"
android:clearTaskOnLaunch="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainAct">
<meta-data android:name="android.app.default_searchable"
android:value=".SearchResults" />
</activity>
I'm using 1.5.
Any help appreciated.
You can do following:
1. set clearTaskOnLaunch = "true" in AndroidManifest, in declaration of main activity
2. in activity that must close:
#Override
public void onBackPressed(){
moveTaskToBack(true);
}
so if user presses back - it comes back to homescreen
if user launches aplication again - task stack clears and he comes to root main activity
The docs for android:clearTaskOnLaunch mention that this attribute applies "whenever [the Activity] is re-launched from the home screen".
However, in your case you're pressing the Home button to return to the Home screen, rather than pressing the Back button. This means your application isn't actually relaunched because the MainAct was not "finished". That only happens when you press Back (or if Android kills the task to save resources etc.).
As you only have two activities in your application, you could set the android:noHistory attribute on MainAct, thus ensuring that users can never return to it and must pass through the LogonAct.
As an aside, it seems a bit annoying to force users to re-login every time they navigate away from the app (for example when they receive a phone call).
You could retain a session token with timeout in your app's persistent storage, or hold a network connection open using a service if that's how your app works — but of course that's up to you and your requirements. :)
I'm having trouble with my activities when they go in the background. I have two activities, A and B. Only A can launch B (manifest copied below). This is what I do:
Launch the app from the app drawer (activity A)
There's a button on A to launch B, B now is displayed.
Hit the Home key, my app is now in the background.
Go to the app drawer again, hit my app icon.
Instead of resuming at ActivityB, Activity A is launched again. Why?
If I hit the Back key now, I get shown the old ActivityB. What?
This is very confusing. It's like Android knows my app is running, and puts a new instance of A on top of the old B instance running. I'd just expect that the application gets paused in-place, and whenever the user hits the app icon again, it just picks up where it left off (in this case, just show B again!) Below is the manifest, and the activity classes for this test are completely empty (except A which has a button to launch B).
<activity android:name=".ActivityA"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityB"
android:label="#string/app_name">
<intent-filter>
<!--
<action android:name="android.intent.action.VIEW" />
-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
If I had to take a guess because inside your app drawer is your .apk reference for your Program A. Regardless if B is already launched, the INTENT of the application when selected is to launch Program A.
I have only read a little on Android, so I can not say with 100% certainty, but that is my guess.
I hope this helps.
EDIT:
Holding down the Home key on the Android phone, shows the list of background apps, can you do the same inside of the emulator and see if Program B pops up? Or same problem occurs?
After reading things around Google, I came across this here is a little snippet:
All the activities in a task move together as a unit. The entire task (the entire activity stack) can be brought to the foreground or sent to the background. Suppose, for instance, that the current task has four activities in its stack — three under the current activity. The user presses the HOME key, goes to the application launcher, and selects a new application (actually, a new task). The current task goes into the background and the root activity for the new task is displayed. Then, after a short period, the user goes back to the home screen and again selects the previous application (the previous task). That task, with all four activities in the stack, comes forward. When the user presses the BACK key, the screen does not display the activity the user just left (the root activity of the previous task). Rather, the activity on the top of the stack is removed and the previous activity in the same task is displayed.
I hope this points you in the right direction
I'm experiencing this bug:
http://code.google.com/p/android/issues/detail?id=2373#makechanges
Thanks for your help, this has been so confusing.
Have you set the following property in your activity's xml definition?
android:launchMode="singleTop"