【问题标题】:clear Recent apps wipe the apps memory and my receiver stopped working清除最近的应用程序擦除应用程序内存并且我的接收器停止工作
【发布时间】:2016-12-22 07:17:34
【问题描述】:

如果 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>

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

但每当我通过滑动清除我最近使用的应用程序时,它就会停止工作。在我去任务管理器并看到 MyApps forcestop 被禁用后,如下图

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

我如何在我的应用程序中执行此操作.. 是什么让我的应用程序表现得像其他第三方应用程序,如 watspp 和 facebook...我怎样才能让我的应用程序始终在内存中我问这个然后只有我的接收器将永远工作.. 如果我错了,那么给我一个解决方案来做到这一点......

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

【问题讨论】:

  • 您在哪个设备上测试过?某些设备在从最近的应用列表中清除时会强制停止应用,但一些热门应用除外。
  • 在模拟器和其他一些设备上试用。
  • 有时我在 Stackoverflow 上遇到了同样问题的一个线程。我正在寻找它,以便我会指向你那里。
  • 您可能想查看SO post 中给出的解决方案,看看是否有帮助。这个particular answer 提供了一些方法,您的应用可能还需要使您的接收器不太可能停止工作,例如从onStartCommand() 返回START_STICKY
  • @Mr.Popular 您可能想检查stackoverflow.com/questions/21550204/… 并使用 START_STICKY 继续运行,但如果设备实际上强制关闭应用程序,就像按下屏幕上的按钮一样,它不会启动再次,直到用户与之交互。 FB 和 whatsapp 可能会像其他人提到的那样得到特殊待遇。

标签: android service google-cloud-messaging broadcastreceiver taskmanager


【解决方案1】:

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

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

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

有关更多详细信息,请参阅"Protected Apps" setting on Huawei phones, and how to handle it

编辑:添加了这个:

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

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

【讨论】:

  • 我只在本地从系统安装了我的应用程序...是否有任何关于 Play 商店应用程序和本地应用程序的文档?
  • 不幸的是,这些都没有记录在任何地方:-(制造商做他们想做的事,我们其他人必须弄清楚。
  • 其他设备在 startsticky 和 ​​Honor 设备上运行良好,只会让受保护的应用程序始终在后台运行。所以在将我的应用程序作为受保护的应用程序之后,它就很好了..
  • @DavidWasser 先生,我的 lenovo k5 vibe 也遇到了同样的问题,请帮我解决这个问题。
【解决方案2】:

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

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

按照 Android 开发者文档/UX 建议,这种情况下可能的解决方法,

基于小米 MIUI 的设备案例:

创建一个用户体验来与用户交流,以启用您的应用的“自动启动”权限。基本上用户必须打开“安全”应用程序->单击“权限”->单击“自动启动”->查找您的应用程序并启用它。我知道这很荒谬和痛苦,但没有其他直接的选择。

确认厂商是否为小米后进行上述操作

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);
        }

注意: 对于荣耀设备和三星设备,此过程可能会有所不同,因为它非常特定于制造商。

同样为其他设备解决此问题的常规方法是创建一个带有覆盖 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 秒后重新启动。您可以将其替换为从最近的应用程序中清除后想要重新开始的任何意图。

【讨论】:

  • 谢谢,我正在努力,如果它解决了我的问题,我会接受这个答案。谢谢你帮了很多忙...
  • 您找到解决方案了吗? @Mr.Popular
  • xiaomi 设备中,当我从最近的任务中杀死应用程序时-> onTaskRemoved,onDestroy 未触发:(
  • @PhanVanLinh onTaskRemoved 在制造商使用专有任务管理器的设备中不起作用。 (例如:小米、荣耀等)。检查答案的第一部分,其中我为小米设备指定了一些非常具体的内容,这可能对您有所帮助。
  • @Govind 感谢您的精彩解释,对不起,我错过了您回答的第一部分
【解决方案3】:

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

【讨论】:

  • 但是 watsapp 并没有被强制停止……那是怎么回事
  • 如果你说它有一些特殊的权限,那么我怎样才能让我的应用程序来获得呢???
  • 添加到我猜该制造商的任何特殊应用程序列表中。但实际上,请在三星的远程测试实验室试一试,看看他们做了什么,并决定您是否可以在某些设备上容忍这种行为,并在必要时向用户发出警告消息。如果应用程序没有被强制停止,有一些方法可以让它继续运行,正如已经发布的一些链接中提到的那样。
  • 有一些方法可以保持它在一些已经发布的链接中提到>>如果你有任何帖子可以像我说的那样给出行为然后告诉我
  • 您是否有任何文件可以保证您的>>我猜想添加到该制造商的特殊应用程序列表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多