#使用的情景:
? ? ?App有測(cè)量功能,測(cè)量后把數(shù)據(jù)保存到Sqlite里,要實(shí)現(xiàn)把測(cè)量的數(shù)據(jù)上傳到服務(wù)器。一般有兩種處理方式:1. 用戶點(diǎn)擊按鈕后,實(shí)現(xiàn)數(shù)據(jù)上傳到服務(wù)器 ? 2. 實(shí)現(xiàn)自動(dòng)上傳數(shù)據(jù)到服務(wù)器。
#效果

只要在連網(wǎng)了的情況下,每隔五秒就會(huì)去查詢數(shù)據(jù),看是否有新的數(shù)據(jù),如果有就會(huì)把數(shù)據(jù)查詢出來,轉(zhuǎn)成Json上傳到服務(wù)器。
#代碼

PollingUtils啟動(dòng)和關(guān)閉定時(shí)任務(wù)。
-------------------------------------------------------------------------------------------

Service開啟服務(wù),在服務(wù)里面的線程執(zhí)行你需要的邏輯。
-------------------------------------------------------------------------------------------

在合適的地方啟動(dòng)定時(shí)任務(wù)。這里有四個(gè)參數(shù):第一個(gè)參數(shù)---上下文,第二個(gè)參數(shù)---設(shè)置時(shí)間間隔,第三個(gè)參數(shù)---執(zhí)行任務(wù)的服務(wù),第四個(gè)參數(shù)---服務(wù)的Aciton(標(biāo)志)。
#實(shí)現(xiàn)步驟:
1.在MainActivity啟動(dòng):
PollingUtils.startPollingService(this,5,PollingService.class,PollingService.ACTION);
2.PollingUtils工具類:
public classPollingUtils {
private staticAlarmManageralarmManager;
//開啟輪詢服務(wù)
public static voidstartPollingService(Context context, intseconds,Class cls,String action) {
LogUtils.i("PollingUtils","==Start polling service...");
//獲取AlarmManager系統(tǒng)服務(wù)
alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//需要執(zhí)行Service的Intent
Intent intent =newIntent(context,cls);
intent.setAction(action);
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//觸發(fā)服務(wù)的起始時(shí)間
longtriggerAtTime = SystemClock.elapsedRealtime();
//使用AlarmManger的setRepeating方法設(shè)置定期執(zhí)行的時(shí)間間隔(seconds秒)和需要執(zhí)行的Service
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,triggerAtTime,seconds *1000,pendingIntent);
}
//停止輪詢服務(wù)
public static voidstopPollingService(Context context,Class cls,String action) {
LogUtils.i("PollingUtils","==Stop polling service...");
alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent =newIntent(context,cls);
intent.setAction(action);
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//取消正在執(zhí)行的服務(wù)
alarmManager.cancel(pendingIntent);
}
}
3.服務(wù)PollingService
public classPollingServiceextendsService {
?public static finalStringACTION="com.hbxz.qkys.protocol.PollingService";
?privateGsonmGson;
privateStringmMachineNo;
@Override
publicIBinderonBind(Intent intent) {
return null;
}
@Override
public voidonCreate() {
if(mGson==null) {
mGson=newGson();
}
}
@Override
public voidonStart(Intent intent, intstartId) {
mMachineNo= (String) SharedPreferencesHelper.getData( UIUtils.getContext(),"MachineNo",SerialPortComm.MACHINENO);
newPollingThread().start();
}
intcount=0;//作為上傳數(shù)據(jù)是否正在運(yùn)行的標(biāo)志,1代表正在執(zhí)行
classPollingThreadextendsThread {
@Override
public void run() {
BaseApplication app = (BaseApplication) UIUtils.getContext();
//1.如果上傳數(shù)據(jù)沒正在運(yùn)行,就要開啟;
//2.如果已經(jīng)執(zhí)行,就不要開啟.
if(app.isConnectWifi&&count==0) {//Wifi開啟和count=0就執(zhí)行.
count++;//此時(shí)count就大于0了.
try{
queryDataTotal();
}catch(Exception e) {
count=0;//出錯(cuò)的情況
e.printStackTrace();
}
}
}
}
}