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

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被禁用如下 我的应用程序在taskmanager中的截图

我想出了一些像watsapp和fb这样的应用程序,总是保留在内存中,在清除最近的应用程序之后,仍然说任务pipe理器具有如下的状态

fb状态在任务管理器中

在taskmanager中的watsapp状态

我怎样才能做到这一点到我的应用程序..什么会让我的应用程序像watspp和Facebook等其他第三方应用程序的行为…我如何使我的应用程序在内存中总是我问这个只有我的接收器将始终工作..如果我错了,那么给我一个解决scheme来做到这一点…

我一直在寻找这个很多,但我仍然无法find解决scheme…我问错了吗? 或者真的有办法做到这一点? 请有人帮我…这使我一个星期! 希望我在这里解释我的问题,如果我不问我,我会给你立即回应。

Solutions Collecting From Web of "清除最近的应用程序擦拭应用程序内存,我的接收器停止工作"

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

在华为设备上,该设置称为“受保护的应用”。 您无法以编程方式将您的应用程序添加到“受保护的应用程序”列表中。 你需要告诉用户,他必须在你安装你的应用程序之后做到这一点。 知名的应用程序(如WhatsApp,Facebook,Google Mail)由制造商自动添加。

这种行为在不同的设备上可能会有所不同,而且在不同的Android版本上可能会有所不同,如果设备对特定的移动运营商具有“品牌”,则可能会有所不同,因为移动运营商也可以自行修改设置。

请参阅华为手机上的“受保护的应用程序”设置,以及如何处理更多详细信息。

编辑:增加了这个:

此外,Android在Android 4.4(Kitkat)中打破了“从最近收到”的行为,所以它已经被刷过的应用程序出现问题。 粘滞服务不会延迟,广播Intent不能传送。 这里有一些有关解决方法的信息: 在Android 4.4中,将应用程序从近期任务中移出永久性地杀死应用程序。 任何想法为什么?

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

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

这是因为那些制造商默认添加了任务pipe理器function,强制停止内存/电池pipe理应用程序。 但像Whatsapp,Facebook这样的应用程序很less。 这可能是因为他们会将最着名的应用程序列入白名单。

按照Android开发者文档/用户体验build议,这种情况下可能的解决方法,

案例小米基于MIUI的设备:

创build一个UX与用户通信以启用对应用程序的“自动启动”权限。 基本上用户必须打开“安全”应用程序 – >点击“权限” – >点击“自动启动” – >寻找你的应用程序,并启用它。 我知道它的荒谬和痛苦,但没有其他直截了当的select。

在检查制造商是否为小米之后,进行上述操作

 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设备,三星设备可能与制造商非常特殊。

另外作为解决这个问题的其他设备的一个正常的方式,是创build一个粘性服务与覆盖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秒后重新开始。 您可以将其replace为任何想要在从最近的应用程序中清除后再次启动的意图。

如果“强制停止”button被禁用,则意味着在“概述”中将应用程序刷过,导致您的应用程序在此设备上被强制停止。 您将不会收到任何广播,直到用户再次与您的应用程序交互。