屏幕锁定时,AlarmManager不起作用

时间:2016-02-23 14:59:12

标签: android broadcastreceiver android-service

我在实施应该定期运行的服务时遇到一些困难。 当屏幕打开时,即使应用程序已从最近的任务中删除,该应用程序也能正常运行。但是当设备被锁定时,应用程序会停止,即使屏幕再次打开,服务也不会返回。 我已经实现了一个带有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)
        );

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

1 个答案:

答案 0 :(得分:0)

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