2016-02-23 67 views
0

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

<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

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

+0

不,它不会被自动检查 –