pandre
pandre

Reputation: 6725

Remove app from recent apps programmatically

I know that Activities can be declared in manifest as being excluded from recents with android:excludeFromRecents: http://developer.android.com/guide/topics/manifest/activity-element.html#exclude

However, that's not what I'm looking for, I would like to know if there is a way to remove the app from recent apps programmatically

Upvotes: 65

Views: 69647

Answers (8)

Paras Palli
Paras Palli

Reputation: 194

I have achieved the same thing using Method Channels in Flutter

[Android Kotlin]

package com.example.yourapp

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.yourapp/removeRecents"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "removeFromRecents") {
                finishAndRemoveTask()
                result.success(null)
            } else {
                result.notImplemented()
            }
        }
    }
}

[Dart]

import 'package:flutter/services.dart';

class RemoveFromRecents {
  static const platform = MethodChannel('com.example.yourapp/removeRecents');

  Future<void> removeAppFromRecents() async {
    try {
      await platform.invokeMethod('removeFromRecents');
    } on PlatformException catch (e) {
      print("Failed to remove from recents: ${e.message}");
    }
  }
}

Upvotes: 0

Georgiy Chebotarev
Georgiy Chebotarev

Reputation: 3190

For my needs by user action I had to stop all application process from the foreground service. When I had used the setExcludeFromRecents the app just disapeared from recent app forever - I didn't want this result, so I used finishAndRemoveTask. There is an example of my code:

applicationContext.getSystemService(ActivityManager::class.java).appTasks.firstOrNull { task ->
        task.taskInfo.baseActivity?.packageName == applicationContext.packageName
    }?.finishAndRemoveTask()

Upvotes: 0

kabuko
kabuko

Reputation: 36302

Yes, generally when you want to have special properties for an Activity when starting it you supply special flags to the Intent. In this case FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS.

Updated:

If you need to hide the current already running activity, you might be able to use this flag in combination with FLAG_ACTIVITY_CLEAR_TOP which would send the new Intent to the existing Activity. You'll have to think and perhaps experiment with what happens as the user moves around your stack though and whether that will make your app re-appear in the recent apps.

Upvotes: 47

user3276567
user3276567

Reputation: 339

This can be done using the ActivityManager.AppTask functionality (starting in API 21)

    ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    if(am != null) {
        List<ActivityManager.AppTask> tasks = am.getAppTasks();
        if (tasks != null && tasks.size() > 0) {
            tasks.get(0).setExcludeFromRecents(true);
        }
    }

Upvotes: 27

Kanwarpreet Singh
Kanwarpreet Singh

Reputation: 2086

Call this when your activity is done and should be closed and the task should be completely removed as a part of finishing the root activity of the task.

finishAndRemoveTask();

Upvotes: 7

Vivek Barai
Vivek Barai

Reputation: 1358

Add these lines to the Activity from which you are exiting the application:

@Override
public void finish() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    }
    else {
        super.finish();
    }
}

Upvotes: 26

pandre
pandre

Reputation: 6725

After receiving the other answers, I managed to get to the following workaround: I have an Activity, let's call it XPTO, declared in manifest with

and basically, when I want app to disappear from the recents list, I finish all other activities, then start the XPTO, which basically kills the app (calling android.os.Process.killProcess(android.os.Process.myPid()); in its onResume()

If anyone has a better way of doing this, please share it

Upvotes: 2

Praful Bhatnagar
Praful Bhatnagar

Reputation: 7435

Following is the definition of the flag android:excludeFromRecents (which i know you have already seen):

Whether or not the task initiated by this activity should be excluded from the list of recently used applications ("recent apps"). That is, when this activity is the root activity of a new task, this attribute determines whether the task should not appear in the list of recent apps. "true" if the task should be excluded from the list; "false" if it should be included. The default value is "false".

so to remove the app from the list of recent app you can set this flag on the first activity in your application since that activity launches the the task for you application. If you have multiple tasks (unlikely for most apps) in your application then you need o set this flag for root activity of all the task.

Upvotes: 10

Related Questions