Closing activities in android application - android

I m developing an android application.When I wish to close it,I need to close all the activities sequentially that I have opened earlier.Is there any code which closes the previously opened activity automatically when a new one is opened ?? And where it needs to be written ??

You can use finish() method before or after you intent to another activity.Like this
Intent toAnotherActivity = new Intent(this, YourActivity.class);
startActivity(toAnotherActivity);
finish();

In your AndroidManifest.xml file, just add android:noHistory="true" attribute for all your activities. for example
<activity
android:name=".ExampleActivity"
android:noHistory="true" />
Quote from http://developer.android.com/guide/topics/manifest/activity-element.html
android:noHistoryWhether or not the activity should be removed from the activity stack and finished (its finish() method called) when the user navigates away from it and it's no longer visible on screen — "true" if it should be finished, and "false" if not. The default value is "false".
A value of "true" means that the activity will not leave a historical trace. It will not remain in the activity stack for the task, so the user will not be able to return to it.
This attribute was introduced in API Level 3.

Related

Launch Mode Singletop not working with permisison dialog showing

I have an Activity with launch mode singleTop which shows permission dialog.
But when permission dialog is present and a new Intent comes for that activity , another instance is created .
onNewIntent() doesn't get called.
Any workaround for this?
Below is the manifest entry.
<activity
android:name=".auth.activity.AJRAuthActivity"
android:screenOrientation="portrait"
android:theme="#style/Theme.PageIndicatorDefaults"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize" />
The way I start this activity:
Intent loginIntent = new Intent(context, AJRAuthActivity.class);
context.startActivity(loginIntent);
Showing the permission dialog usually starts another Activity (a system Activity) on top of your Activity. In this case, your Activity will be paused (onPause() is called). At that point, your Activity is no longer the top Activity on the stack, so that another launch of the Activity will create another instance, even if "singleTop" launch mode and/or Intent.FLAG_ACTIVITY_SINGLE_TOP is specified.
See Request permission dialog pauses my activity
To get around this, you should ensure that you have all the permissions that you might need as early as possible, or rearchitect your application so that you don't have the problem of multiple instances.

More than one instance of activity due to intent

For an App I am developing, I override the back button to make it act like the home button so that the state of the main activity is preserved even when the app is exited. Now, I also send a notification to the user from time to time using a service. When this notification is pressed I want to open the main activity again. I noticed though that this creates a second instance of the app, which creates major problems. I am trying to make the main activity go to the front again, without calling oncreate again like so:
Intent to launch main activity again:
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
This doesn't work though. I still end up with two instances of my main activity. Does anybody know how to fix this?
By the way, I already have android:launchMode="singleInstance" in my manifest.
There's a way to force the OS to create only one instance of an activity and thats using the tag launchMode in the Manifest as shown below:
<activity android:name="YourActivity"
android:launchMode="singleInstance"/>
Hope this Helps...
Regards
Try adding this flag to the intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), works for me.

Start activity from the begin

I have activity A where authentication is done. After this user redirected to other activities say B,C,D. Suppose now the user is at Activity C and suddenly closes the application, next time when he launches the application it is displaying Activity C (the last activity run by user before exiting App) but,But i want to start Activity A (Authentication Purpose) when user relaunches application irrespective of where he closes the application.
Help Needed
You can remove an Activity from Stack by adding android:noHistory="true" attribute in AndroidManifest.xml
<activity android:name="CurrentActivity"
android:launchMode="singleInstance"
android:noHistory="true" />
or by code:
Intent intent = new Intent(CurrentActivity_A.this,CurrentActivity_C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.startActivity(intent);
Use android:noHistory="true" attribute to your activity tag in the manifest file. It makes sure that your Activity doesn't stay in the stack when it goes to background. Here's a full description. Hope this helps.

android - launchMode=singleTask and Notifications?

I know there's been a few posts for what I'm about to ask but I can't find any with the right answer.
From my understanding, if your main activity's (let's call it A) launchMode is set to singleTask, and A has initiated activity B then a click to the home button will destroy the history stack and re-launching the application will take you back to A and not B.
I have launchMode set to singleTask because I have a persistent notification and I don't want to have multiple instances of the main activity to appear whenever the user clicks on the notification.
Is there something I'm missing that would allow me to cater for both?
So I'm asking if there's a way I can ensure that whenever the user wishes to launch the app, from the notification or not, to take him back to the last (current) activity.
If I change launchMode to singleTop it works but I get multiple instances of the main activity whenever I launch it.
Thanks
Andreas
Have you tried setting launchMode to singleTop to all the activities in your app?? Because what i get from your query is that the main activity isn't singleTop, so that might lead to another instance of the main activity being called once the main activity is launched from the activity that was launched from the notification activity.
Or you can specify the launchMode as an attribute to the application tag itself in the manifest.
I use the following code to avoid multiple instances of the activity
Intent intent=new Intent(this,RICO.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
Changing manifest doesn't look appropriate to me
I'm having issues with both the approches.
The notification works flawless only in this condition:
- using the back button in the main activity (with the history containing only the that activity)
- not using the Home button
- not using the notification IF the activity you are calling is on top and active
In any other case, the notification cannot anymore call on the foreground the activity by using "new Intent(...)"
I've found the alchemical combination of manifest options and intent's flags for getting what I needed:
Intent intent= new Intent(this, YaampActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
using these options
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true"
inside the element.
Now I've a notification which spawns the main activity (if that activity is not already in the foreground) and its behavior is correct even if the activity is "closed" by pressing the home button and/or the back one.

Android AppWidget Configuration - Start in new task

I've searched and searched and searched for this!
So I've got an app widget and it has a configuration activity that I can open when pressing a button on the app. The scenario is:
Had the app opened.
Closed the app with the home button.
Selected to add my widget
I have configured the widget.
Placed on my home screen
Then open the configuration activity again with the button on the widget.
Cancel the new config by pressing back will put me back into the app.
When pressing back I want to just return home.
Basically what I'm asking is. How do I start the configuration activity in it's own task/stack?
I've looked into intent filters but I'm just not quite sure, or maybe it's something to do with the package it's in, or maybe it's just not possible!
I suppose it may have something to do with the intent I use to launch the config activity
Intent configIntent = new Intent(this, Configuration.class);
configIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
remoteView.setOnClickPendingIntent(R.id.config, PendingIntent.getActivity(this, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT));
Perhaps because I launch it with 'this' as the context, it will always start in my applications stack...
but the pending intent api is:
PendingIntent API 1
"Note that the activity will be started outside of the context of an existing activity"
So yeah I'll stop talking now as I just end up going in circles!
EDIT
So tried android:launchMode="singleInstance" in the manifest like was stated. This worked however it stops the 'startActivityForResult' behaviour working correctly. (which is the whole reason for a config activity) Get the error:
WARN/ActivityManager(59): Activity is launching as a new task, so cancelling activity result.
So still haven't found a solution.
Ok sorted it :-) needed:
android:taskAffinity=""
in the manifest, setting the task affinity to an empty string allows for the activity to start in it's own stack, as it is not 'affiliated' with the rest of the application.
UPDATE
I have changed the task affinity to:
android:taskAffinity="com.my.package.alternative.task"
as each time I launched the activity it was showing up multiple times in the 'history'. So it now starts in it's own stack but is shared with other instances of the same activity.
Also need to add the Flag Intent.FLAG_ACTIVITY_NO_HISTORY to your intent :-) this stops your getting your application multiple time's in the history when you 'press and hold' the home button.
UPDATE
I've noticed FLAG_ACTIVITY_NO_HISTORY wasn't doing what I wanted, I've removed it and added:
android:excludeFromRecents="true"
into the activity tag in the manifest as well. The activity now behaves like I want :-)
Got this answer from the following link trail:
Tasks & Back Stack |
Managing Tasks |
Affiliation Tag
Try to put android:launchMode="singleInstance" for an activity of the app in AndroidManifest.xml

Categories

Resources