2016-02-23 66 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

不,它不會被自動檢查 –