1

我的應用程序需要做一些後臺任務後啓動完成,並在睡眠模式。 所以我使用WakefulIntentService來避免睡眠模式下的流量問題,並且效果很好。 但是,當我試圖使用引導接收器在引導完成後繼續數據流時,它會產生一些奇怪的錯誤,並且有時也無法正常工作。啓動接收器有多個任務奇怪地工作

這裏是我的Boot Receiver類,我嘗試做多個任務。

public class OnBootReceiver extends BroadcastReceiver { 

private static final int SERVICE_PERIOD = 300000; // 5 minutes currently 
// private static final int HANDLER_PERIOD = 300000 * 12; // 1 hour 
// currently 
private static final String TAG = "OnBoot"; 
private Context mContext; 

private int mInterval = 1000 * 60 * 60 * 2; // 2 hours by default, can be 
             // changed later 
private Handler mHandler; 

@Override 
public void onReceive(Context context, Intent intent) { 
    mContext = context; 
    AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, OnServiceReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 

    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + 60000, SERVICE_PERIOD, pi); 

    mHandler = new Handler(); 
    startRepeatingTask(); 

} 

Runnable mStatusChecker = new Runnable() { 
    @SuppressWarnings("unchecked") 
    @Override 
    public void run() { 

     SharedPreferences mSharedPreferences = mContext 
       .getSharedPreferences(KEY_USER_ID, 0); 
     String UserId = mSharedPreferences.getString(KEY_USER_ID, "0"); 
     new SyncValidater(mContext, UserId).execute(); 
     mHandler.postDelayed(mStatusChecker, mInterval); 
    } 
}; 

void startRepeatingTask() { 
    mStatusChecker.run(); 
} 

void stopRepeatingTask() { 
    mHandler.removeCallbacks(mStatusChecker); 
} 
} 

在這堂課我寫了兩個任務。第一個是啓動另一個開始喚醒服務的廣播接收機(與github example相同)。第二個啓動一個處理程序,它啓動一個AsyncTask類,每兩小時執行一次服務器事務。但有時候,處理程序會隨機啓動,有時會停止。

所以在這裏我很困惑,這是我的應用程序需要兩個引導接收器? 是否有任何其他選項在當前接收器中執行這些多任務?

請大家幫忙。由於

回答

2

,第二個開始這將啓動一個的AsyncTask類,每兩小時

沒有做一些服務器事務一個處理程序,您的第二個任務永遠不會再運行一次,可能是因爲你的過程在此期間終止。

所以在這裏我很困惑,這是我的應用程序需要兩個啓動接收器?

是否有任何其他選項,在當前的接收器做這些多任務?

使用兩個AlarmManager事件,每個事件都有自己的週期。一個是您當前的AlarmManager事件。另一個是你爲支持你的每兩小時工作而創建的。

+0

感謝您的回答。但我有點困惑,我必須寫兩個報警管理器。在我的服務的doWakefulWork()或bootreceiver類中。 – user3678972

+0

@ user3678972:「但我有點困惑,我必須在哪裏寫兩個報警管理器」 - 您已經有了一個報警管理器。我假設你應該在配置第一個之後立即配置第二個。 – CommonsWare