2016-09-14 65 views
0

我打電話給我的服務與報警經理AlarmManager +服務在空閒(屏幕關閉)

這樣的:

alarmManage.setExact(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + getPoolingInterval(), pendingIntentPolling); 

在我ServicePooling我重新安排的同樣的方式,這ServicePooling調用另一項服務在我的服務上發送數據。

Intent serviceSocket = new Intent(this.context, SenderService.class); 
    this.context.startService(serviceSocket); 

所有作品非常好每minut我收到我的服務器輪詢通信,但是當我的設備是屏幕關閉,沒有USB插上,這個停止工作。

回答

1

現在使用Service代替AlarmManager是個好主意。改爲使用WakefulBroadcastReceiver。你的設備睡着瞭然後拔掉。

public class BRMine extends WakefulBroadcastReceiver { 
    public static final String INTENT_FILTER = "com.example.BRMine"; 
    @Override 
    public void onReceive(Context ctx, Intent intent) { 
     // TODO Auto-generated method stub 
     OWakeLocker.acquire(ctx, _.indexNOTS); 
     ComponentName comp = new ComponentName(ctx.getPackageName(), 
       SMine.class.getName()); 
     startWakefulService(ctx, intent.setComponent(comp)); 
    } 

} 

其中:

公共類OWakeLocker { 私有靜態PowerManager.WakeLock [] wakeLocks =新PowerManager.WakeLock [_ indexNOTS_MAX]; //服務計數

@SuppressWarnings("deprecation") 
public static void acquire(Context ctx, int index) { 
    WakeLock wakeLock = wakeLocks[index]; 
    if (wakeLock != null) wakeLock.release(); 

    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP | 
       PowerManager.ON_AFTER_RELEASE, _.APPNAME + Integer.toString(index)); 
    if (wakeLock != null && wakeLock.isHeld()){ 
     wakeLock.acquire(); 
    } 
} 

public static void release(int index) { 
    WakeLock wakeLock = wakeLocks[index]; 
    if (wakeLock != null) 
     wakeLock.release(); 
     wakeLock = null; 
}} 

啓動:

Intent intent = new Intent(BRMine.INTENT_FILTER); 
PendingIntent pi = PendingIntent.getBroadcast(ctx, myintentalarm, intent, PendingIntent.FLAG_CANCEL_CURRENT): 
am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi); 
+0

我將嘗試與此WakefulBroadcastReceiver – rcorbellini

+0

同樣的問題,我認爲問題是setExact當設備處於空閒狀態。 – rcorbellini

0

我使用Vyacheslav b的答案解決了我的問題ut wihtout AlarmManager,因爲setExact didint在閒置時爲我工作,而我的android是一個低於23的api(並且沒有setExactAndAllowWhileIdle)我在startapplication上使用了一個timertask,在我的情況下工作很好,當我的應用程序運行時我只需要這個。