将应用程序从“最近”中刷出时,为什么我的服务停止了?

时间:2016-05-03 07:13:33

标签: android android-service android-broadcast

我在清单中声明我的服务:

<service
    android:name=".MyService"
    android:stopWithTask="false" />

MyService.java:

public class MyService extends Service {

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // doing stuff
        }
    };

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

    @Override
    public void onCreate() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);

        registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {
    // does not get called
        unregisterReceiver(receiver);
    }

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

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        // this method get called when i remove the task from recents
    }
}

当我从Recents中移出应用时,onTaskRemoved按预期运行,但BroadcastReceiver的{​​{1}}方法不再被调用。

据我所知,与onReceive动态注册的BroadcastReceiver生命周期与注册该对象的对象相关联。我认为正因为如此,如果我的registerReceiver仍在运行,则应该调用Service

我不确定onReceive是否已停止,或Service未注册。

无论哪种方式,如何在从最近删除任务时阻止它们停止?如果我不能,有没有办法立即重新启动它?

编辑:

我非常确定我的BroadcastReceiver仍然在运行,因为操作系统并没有尝试重新启动它(正如它因为Service而停止时会这样做),意味着问题是START_STICKY未注册。为什么? (BroadcastReceiver未被调用)

EDIT2:

发现问题。它是我正在测试的设备。我正在使用MIUI android ROM的小米Redmi Note 2。似乎从MIUI中的最近一次刷出时,操作系统会杀死整个过程(几乎就像任务杀手一样),而不仅仅是任务。 在我的其他设备上测试onDestroy在停止任务后立即重新启动,因为它应该(因为Service)。

1 个答案:

答案 0 :(得分:0)