28

My application is in running mode[foreground] and user clicks on home button, which puts application to background[and still running]. I have alarm functionality in my application which fires up. I want is when my alarm goes off i want to bring my background running application in foreground and from last state in which it was.

 <application android:name="com.abc.android.state.management.MainEPGApp" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true" android:logo="@drawable/app_logo" > <activity android:name=".SplashScreen" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="nosensor" android:theme="@style/Theme.Sherlock" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Starter" android:configChanges="orientation|screenSize" android:screenOrientation="behind" android:launchMode="singleTop" android:uiOptions="none" android:windowSoftInputMode="adjustPan" /> </application> 
1
  • How are you detecting that home button is pressed ? Commented Oct 9, 2018 at 5:06

8 Answers 8

76
Intent intent = new Intent(context, MyRootActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); 

You should use your starting or root activity for MyRootActivity.

This will bring an existing task to the foreground without actually creating a new Activity. If your application is not running, it will create an instance of MyRootActivity and start it.

EDIT

I added Intent.FLAG_ACTIVITY_SINGLE_TOP to Intent to make it really work!

Second EDIT

There is another way to do this. You can simulate the "launching" of the app the same way that Android launches the app when the user selects it from the list of available apps. If the user starts an application that is already running, Android just brings the existing task to the foreground (which is what you want). Do it like this:

Intent intent = new Intent(context, SplashScreen.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting // the activity from a service intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); startActivity(intent); 
Sign up to request clarification or add additional context in comments.

29 Comments

Yes, it worked intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) did a trick, but i start root activity as new one, which do not preserve its state from which it left of. Actually i am working with 5 Fragment inside that Root activity. But your answer it starts of new root activity with 1st fragment initialized. Anyways that is another problem i have to resolve, But so far above answer works for me. Thanks
Post your manifest please. If you have an existing task in the background with the root activity still active (ie: not finished), it shouldn't create any new activities, just bring that task to the foreground.
Um...no. Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT is set by Android when it brings a background task to the foreground. You can set it if you want but it doesn't do anything. Also, launchMode="singleInstance" is intended for HOME-screen replacements only. Be aware that if your root activity now starts another activity, that activity will not be launched into the same task, but will be launched into a new task. If it is one of your application's activities you will have created mass confusion as you will now have 2 tasks which both have the same name and icon in the list of recents.
Just want to mention, in case any one else sees this, the solution in David's "Second EDIT" worked perfectly for me.
@FerranMaylinch see stackoverflow.com/a/29769255/769265 there is an issue pre-Android 4.4 that prevents this from working if you call startActivity() from an Activity Context.
|
11

A combination that works for me is to use:

Intent bringToForegroundIntent = new Intent(context, RootActivity.class); bringToForegroundIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(bringToForegroundIntent); 

If you check the logs on the device whenever you start an activity from a launcher icon this is the intent that gets passed to launch the app or move it back to foreground if e.g. user clicked the Home button.

1 Comment

No part in the accepted answer has worked for me, but this did exactly what I wanted - same behavior as clicking your app from the Recent apps.
11

I find a new way to bring app to foreground, It imitate click Icon to launch application.

 PackageManager packageManager = context.getPackageManager(); Intent intent = packageManager.getLaunchIntentForPackage(pkName); if (intent != null) { //模拟点击桌面图标的启动参数 intent.setPackage(null); // intent.setSourceBounds(new Rect(804,378, 1068, 657)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); context.startActivity(intent); } 

it work for me, But who can tell me why package must be null

1 Comment

For why the package is null, Set an explicit application package name that limits the components this Intent will resolve to. If left to the default value of null, all components in all applications will be considered. If non-null, the Intent can only match the components in the given application package.
10

You can use the below code to bring the application to front:

private void bringApplicationToFront() { Log.d(TAG, "====Bringging Application to Front===="); Intent notificationIntent = new Intent(this, MainActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); try { pendingIntent.send(); } catch (CanceledException e) { e.printStackTrace(); } } 

3 Comments

This only works if the application has one Activity. If the application has more than one Activity, and the user is not in the root Activity, this code will not bring the application to the foreground in the same state it was in, which is OP's requirement.
@David Wasser. No my launcher activity is splash screen and I am bringing the MainActivity in front and it is working fine. Your solution is not working so I place the code here. Actually the flow is something like that : I have a broadcast receiver in my main activity, and when it receives the broadcast and if my main activity in in background then I want main activity to bring to front.
My solution should work and I don't know why it doesn't. Maybe you can open a new question and we can see why it doesn't work. In general, your solution doesn't work if you don't know exactly what Activity the user is in. It only works if you know exactly that the user is in MainActivity. Your answer isn't a good general solution, although it may work in a specific case.
5

From my test, to mimic the Launcher behavior, the key is to:

intent.setPackage(null);

after

Intent intent = packageManager.getLaunchIntentForPackage(pkName);

Other methods in this thread doesn't work in my case.

Thanks to jiaqing's answer, I post this answer as I don't have the right to comment. I don't know the logic behind this either, I guess it's related with the task owner. Anyone knows, would be glad to know.

1 Comment

intent.setPackage(null); weardly also worked for me! This now resumes an existing activity from another app
4

Using the ActivityManager class you can bring a running task to front

void bringToFront(){ ActivityManager activtyManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> runningTaskInfos = activtyManager.getRunningTasks(3); for (ActivityManager.RunningTaskInfo runningTaskInfo : runningTaskInfos) { if (this.getPackageName().equals(runningTaskInfo.topActivity.getPackageName())) { activtyManager.moveTaskToFront(runningTaskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME); return; } } } 

1 Comment

'getRunningTasks(int)' is deprecated as of API 21: Android 5.0 (Lollipop)
1

For an alarm, you want to take a look at starting an Android Service

This service will be more resilient than your application which may be killed while in the background and can fire off an intent to bring your application to the front (or restart it if it was killed) when it is time for the alarm to go off.

1 Comment

Alarm functionality is running using AlarmManager and PendingIntent fired through application, which do not include any Android Service.
0
Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.