清除最近使用的应用程序擦除应用程序内存,我的接收器停止工作

clear Recent apps wipe the apps memory and my receiver stopped working

MyApp 的 Receiver 在后台运行正常:

    public class MySmsReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("triggered sms");
        if(intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
          Toast.makeText(context, "message Received", Toast.LENGHT_SHORT).show();
    }
}

我的接收器清单文件是

        <receiver android:name=".MySmsReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />

        </intent-filter>
    </receiver>

文档说,如果我在清单文件中声明一个接收器,它应该始终有效。但就我而言,它不是...

但是每当我通过滑动来清除我最近使用的应用程序时,它就会停止工作。在我去 taskmanager 看到 MyApps forcestop 被禁用后,如下所示

我想通了一些应用程序,如 watsapp 和 fb 总是保存在内存中我说这个 bcoz 在刷完清除最近的应用程序后仍然任务管理器有如下 followig 状态

我怎样才能在我的应用程序中执行此操作.. 是什么让我的应用程序表现得像其他第三方应用程序(如 watspp 和 facebook)...我怎样才能使我的应用程序始终在内存中我问这个 然后只有我的接收器会一直工作。如果我错了,请给我一个解决方案...

我已经搜索了很多,但仍然找不到解决方案...我问错了吗?或者真的有办法做到吗?请有人帮助我......这让我一周!希望我在这里解释了我的问题,如果我不问我,我会立即回复你。

如果 "Force Stop" 按钮被禁用,则意味着在“概览”中将应用滑开会导致您的应用在此设备上被强制停止。在用户再次与您的应用交互之前,您将不会收到任何广播。

看起来这种情况在少数设备中发生 (例如:小米、荣耀设备、具有 SmartManager 功能的三星设备等) 当用户从中删除应用程序时应用程序被强制停止最近的任务。

这是因为厂商默认添加了任务管理器功能,强制停止应用程序进行memory/battery管理。但很少有像 Whatsapp、Facebook 这样的应用程序有效。这可能是因为他们会将最著名的应用程序列入白名单。

遵循 Android 开发人员文档/用户体验建议,此场景的可能解决方法,

基于小米MIUI的案例:

创建一个 UX 来与用户沟通,以启用对您的应用程序的 "AutoStart" 权限。基本上用户必须打开 "Security" 应用程序 -> 单击 "Permissions" -> 单击 "Autostart" -> 查找你的应用程序并启用它。我知道这很荒谬和痛苦,但没有其他直接的选择。

确认是不是小米之后再进行以上操作

String manufacturer = "xiaomi";
        if(manufacturer.equalsIgnoreCase(android.os.Build.MANUFACTURER)) {
            //this will open auto start screen where user can enable permission for your app
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
            startActivity(intent);
        }

注意:此过程对于 Honor 设备和三星设备可能有所不同,因为它因制造商而异。

另外,作为其他设备解决此问题的常规方法,是创建一个具有覆盖 onTaskRemoved 方法的粘性服务。 使用以下代码:

public class BackgroundService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //create a intent that you want to start again..
        Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
        super.onTaskRemoved(rootIntent);
    }
}

此处服务将在5秒后重新启动。您可以将其替换为您希望在从最近的应用程序中清除后重新开始的任何意图。

在某些华为设备(以及某些 LG 和小米设备)上,您需要将您的应用添加到允许 运行 在后台运行的应用列表中。如果不这样做,一旦您的应用程序停止(通过从最近的任务列表中滑动,或 Android 出于资源原因终止应用程序),它不会自动重新启动。

在华为设备上,该设置称为 "protected apps"。您不能以编程方式将您的应用程序添加到 "protected apps" 的列表中。您需要告诉用户他必须在安装您的应用程序后执行此操作。知名应用程序(如 Whatsapp、Facebook、Google 邮件)由制造商自动添加。

此行为在不同设备上可能不同,在不同版本的 Android 上也可能不同,如果设备是针对特定移动运营商的 "branded",则可能会有所不同,因为移动运营商也可以自己修改设置。

有关更多详细信息,请参阅

编辑:添加了这个:

此外,Android 破坏了 Android 4.4 (Kitkat) 中的 "swipe from recents" 行为,因此它会导致被刷过的应用出现问题。粘性服务不会重新启动,广播 Intent 不会传送。这里有一些关于解决方法的信息:In android 4.4, swiping app out of recent tasks permanently kills application with its service . Any idea why?

此外,您是否从 Google Play 商店安装了您的应用程序?从 Play 商店安装的应用程序与本地安装的应用程序(通过下载或通过 adb 或其他方式安装)的行为可能不同。