屏幕锁定时警报管理器不起作用



我在实现应该定期运行的服务时遇到了一些困难。当屏幕打开时,即使该应用程序已从最近的任务中删除,该应用程序也能正常工作。但是当设备被锁定时,应用程序会停止,即使屏幕再次打开,服务也不会返回。我已经实现了一个带有SCREEN_ON操作的 WakefulBroadcastReceiver,但它仅在应用程序处于活动状态时才有效,当只有服务运行时不起作用。服务和 WakefulBroadcastReceiver 在我的 Android 清单中声明如下:

<service android:name=".FeedService" />
<receiver android:name=".AutoStart">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.SCREEN_ON" />
    </intent-filter>
</receiver>

我还向我的 AndroidManifest 文件添加了以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

这是我的WakefulBroadcastReceiver:

public class AutoStart extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Feed", "AutoStart.onReceive");
        context.startService(new Intent(context, FeedService.class));
    }
}

这是我的服务:

public class FeedService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("Feed", "FeedService.onStartCommand");
        stopSelf();
        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("Feed", "FeedService.onBind");
        return null;
    }
    @Override
    public void onDestroy() {
        // I want to restart this service again in 5 seconds
        AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarm.set(
                alarm.RTC_WAKEUP,
                System.currentTimeMillis() + (5000),
                PendingIntent.getService(this, 0, new Intent(this, FeedService.class), 0)
        );
    }
}

在我的主活动中,我从以下方面开始服务:

AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarm.set(
                alarm.RTC_WAKEUP,
                System.currentTimeMillis() + (5000),
                PendingIntent.getService(this, 0, new Intent(this, FeedService.class), 0)
        );

这对我的应用程序保持此服务运行至关重要,我不明白为什么它没有发生。有人可以解释我如何解决这个问题吗?

我找到了问题的答案。出于某种原因,即使我在清单文件中请求了WAKE_LOCK并在活动中注册了我的 BroadcastReceiver,我的应用程序也没有在屏幕锁定后继续处于活动状态的权限。我在设备上找到了一个选项,可以在受设置保护的应用程序中指定>该选项。所以我刚刚检查了这个选项 e 现在我的服务工作正常。我不知道从 Google Play 安装应用程序时是否自动选中此选项(我希望如此),但在我的情况下没有选中此选项。