我在实现应该定期运行的服务时遇到了一些困难。当屏幕打开时,即使该应用程序已从最近的任务中删除,该应用程序也能正常工作。但是当设备被锁定时,应用程序会停止,即使屏幕再次打开,服务也不会返回。我已经实现了一个带有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 安装应用程序时是否自动选中此选项(我希望如此),但在我的情况下没有选中此选项。