当我清除所有最新应用时,Android系统终止了我的服务

时间:2016-03-31 05:23:22

标签: android service

我已经在startforeground()使用了Service,但是当我清除所有最近的应用时,Android会一直杀死我的Service

以下是我的服务代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("Text")
            .setTicker("Text")
            .setContentText("Text")
            .setSmallIcon(R.drawable.icon)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
            .build();

    startForeground(100, notification);

    return START_STICKY;
}

我对这段代码有什么不对吗?

5 个答案:

答案 0 :(得分:18)

长时间运行的服务需要以下内容才能使其不太可能被终止:

  1. START_STICKY返回onStartCommand()。有了这个,系统将重新启动服务,即使必须停止资源限制。

  2. 当服务未绑定到任何UI组件(例如,活动)时,服务必须通过显示前景通知进入前台模式。前台服务不太可能被系统终止。

  3. 在清单文件的相应<service>标记中设置属性"stopWithTask"=false

  4. 另请注意,由于自定义,某些制造商的设备即使具有上述属性也会终止服务:

    1. 自定义任务管理器。
    2. 可以禁止非系统服务的节电功能。
    3. 某些应用程序服务确实需要保留在后台,并且必须积极地保持活力。虽然不建议使用此方法,但可以执行以下步骤:

      1. 添加服务启动触发器:例如“引导完成”和“网络连接”广播。

      2. 如果服务在意图中收到意图/广播FLAG_RECEIVER_FOREGROUND

      3. AlarmManager被调用时,manually schedule a pending intent for service重新开始START_STICKY does not work on Android KitKat极端度假。

      4. 另见,见:

        1. enter image description here

答案 1 :(得分:7)

Android系统可以在他们想要停止维持设备性能或功耗时随时停止服务。有很多情况下android系统可以停止你的服务,如电池电量不足,app长时间不处于活动状态,设备处于休眠模式,省电模式等。

我开发了一个技巧或黑客(你可以这么说)使用没有人可以阻止你的服务(Android系统,第三方应用程序,用户)。

注意:使用此功能,您的服务永远不会停止,也可能耗尽您的电池。

请按照以下步骤操作: -

1)在onStartCommand中返回START_STICKY。

2)然后修改服务中的onDestroy()和onTaskRemoved()方法,如下所示:

@Override
public void onDestroy() {
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show();


    Intent myIntent = new Intent(getApplicationContext(), YourService.class);

    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

    AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(System.currentTimeMillis());

    calendar.add(Calendar.SECOND, 10);

    alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

  Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();

}




@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);


        Intent myIntent = new Intent(getApplicationContext(), YourService.class);

        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0);

        AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();

        calendar.setTimeInMillis(System.currentTimeMillis());

        calendar.add(Calendar.SECOND, 10);

        alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

        Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show();


    }




@Override

    public int onStartCommand(Intent intent, int flags, int startId) {
     Toast.makeText(getApplicationContext(), "Service Starts", Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }

这里每当服务停止时(通过android系统或用户手动)我都会设置一个警报,并且每次使用PendindIntent都会在10秒内重启服务。

答案 2 :(得分:3)

您可以使用START_REDELIVER_INTENT代替START_STICKY

对这些的最简单的解释可能是,

START_STICKY - 告诉系统在有足够内存可用时,从低内存中恢复后,创建该服务的全新副本。在这里,您将丢失之前可能计算过的结果。

START_NOT_STICKY - 告诉系统即使有足够的内存也不要费心重启服务。

START_REDELIVER_INTENT - 告诉系统在崩溃后重新启动服务,并重新发送崩溃时出现的意图。

我希望这会对你有所帮助。感谢

答案 3 :(得分:1)

华为,Vivo,Oppo和小米限制后台服务。 另请参阅here

修改: 在这些品牌中,由于大量的自定义,默认情况下限制所有服务。您必须通过设置禁用应用程序的背景限制,或者可以通过激发意图向用户提示。 不幸的是,每个操作系统中“后台限制”设置的路径都不相同。

private static final Intent[] POWERMANAGER_INTENTS = {
new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
new Intent().setComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
new Intent().setComponent(new ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity"))
};


for (Intent intent : POWERMANAGER_INTENTS)
    if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
            // show dialog to ask user action
        break;
}

答案 4 :(得分:0)

请阅读此Click Here

一些设备有自定义的android,而不是真正的android测试会在你清除最近的应用程序时终止你的服务