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

时间:2016-12-22 07:17:34

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

如果它的背景是:

,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强制停止被禁用,如下screenshot of my app in taskmanager

我想出了一些应用程序,比如watsapp和fb总是保留在内存中我说这个bcoz在刷了清楚的最近的应用程序仍然任务管理器有如下所示的跟随状态

fb state in task manager

watsapp state in taskmanager

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

我一直在搜索这个问题而且我找不到解决办法......我错了吗?还是真的有办法做到这一点?请有人帮帮我...这让我一周!!!希望我在这里解释我的问题,如果我不问我,我会立即给你答复。

3 个答案:

答案 0 :(得分:17)

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

在华为设备上,该设置被称为&#34;受保护的应用程序&#34;。您无法以编程方式将您的应用添加到受保护的应用列表中#34;。您需要告诉用户他必须在您安装应用后执行此操作。制造商会自动添加知名应用程序(如Whatsapp,Facebook,Google Mail)。

此行为在不同的设备上可能会有所不同,并且在不同版本的Android上可能会有所不同,如果设备是&#34;品牌&#34;它可能会有所不同。对于特定的移动运营商而言,移动运营商也可以自行修改设置。

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

编辑:添加了这个:

此外,Android打破了&#34;轻扫&#34; Android 4.4(Kitkat)中的行为,因此它会导致刷卡的应用程序出现问题。粘性服务不会被重新启动,广播Intent也不会被传递。这里有一些关于解决方法的信息:In android 4.4, swiping app out of recent tasks permanently kills application with its service . Any idea why?

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

答案 1 :(得分:16)

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

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

根据Android Developer文档/ UX建议,此方案的可能解决方法

Case Xiaomi MIUI基于设备:

创建UX以与用户通信以启用&#34; AutoStart&#34;您的应用的权限。基本上用户必须打开&#34;安全&#34; app - &gt;点击&#34;权限&#34; - &GT;点击&#34;自动启动&#34; - &GT;寻找您的应用并启用它。我知道它的荒谬和痛苦,但没有其他直截了当的选择。

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

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秒后重新开始。您可以将其替换为从最近的应用程序中清除后要再次启动的任何意图。

答案 2 :(得分:0)

如果&#34;强制停止&#34;按钮被禁用它意味着在概述中滑动应用程序已导致您的应用程序在此设备上强制停止。在用户再次与您的应用互动之前,您不会收到任何广播。