我在实施应该定期运行的服务时遇到一些困难。 当屏幕打开时,即使应用程序已从最近的任务中删除,该应用程序也能正常运行。但是当设备被锁定时,应用程序会停止,即使屏幕再次打开,服务也不会返回。 我已经实现了一个带有SCREEN_ON操作的WakefulBroadcastReceiver,但它仅在应用程序处于活动状态时才起作用,当只有一个服务正在运行时它不起作用。 服务和WakefulBroadcastReceiver在我的AndroidManifest中声明如下:
<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)
);
}
}
在我的MainActivity中,我使用以下命令启动服务:
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(
alarm.RTC_WAKEUP,
System.currentTimeMillis() + (5000),
PendingIntent.getService(this, 0, new Intent(this, FeedService.class), 0)
);
我的应用程序保持此服务运行至关重要,我不明白为什么它不会发生。 有人可以解释我怎么解决这个问题?
答案 0 :(得分:0)
我找到了问题的答案。 出于某种原因,即使我在清单文件中请求了WAKE_LOCK并在Activity中注册了我的BroadcastReceiver,我的应用程序也没有权限在屏幕锁定后继续活动。我在设备上找到了一个选项,可以在设置&gt;受保护的应用中指定。所以我刚检查了这个选项,现在我的服务工作正常。我不知道从Google Play安装应用程序时是否自动检查此选项(我希望如此),但在我的情况下未检查此选项。