我的工作,這將繼電器關於它的位置到遠程服務器信息的應用程序。我打算做一個簡單的HTTP發佈到Web服務器做到這一點,一切都簡單而精緻。Android的 - 定期進行後臺服務 - 諮詢
但根據規範,應用程序需要從時間執行自己的時間,可在每30分鐘一次說。是獨立的接口,意義它需要即使應用程序被關閉運行的。
我環顧四周,發現了Android服務是需要使用什麼。我可以用什麼來實現這樣一個系統。服務(或其他機制)在手機重新啓動時是否會重新啓動?
在此先感謝。
我的工作,這將繼電器關於它的位置到遠程服務器信息的應用程序。我打算做一個簡單的HTTP發佈到Web服務器做到這一點,一切都簡單而精緻。Android的 - 定期進行後臺服務 - 諮詢
但根據規範,應用程序需要從時間執行自己的時間,可在每30分鐘一次說。是獨立的接口,意義它需要即使應用程序被關閉運行的。
我環顧四周,發現了Android服務是需要使用什麼。我可以用什麼來實現這樣一個系統。服務(或其他機制)在手機重新啓動時是否會重新啓動?
在此先感謝。
創建一個Service
您的信息發送到你的服務器中。據推測,你已經掌握了控制權。
您的Service
應該由AlarmManager
觸發的警報啓動,您可以在其中指定一個時間間隔。除非你有報告數據準確每隔30分鐘,你可能想不準確的報警,所以你可以節省一些電池壽命。
最後,您可以註冊您的應用程序通過設置BroadcastReceiver
像這樣得到在啓動廣播:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
// Register your reporting alarms here.
}
}
}
你需要以下權限添加到您的AndroidManifest.xml
該工作。不要忘記,當您正常運行該應用註冊你的報警,否則他們會僅登記在設備啓動。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
您可以使用Alarm Manager在指定時間啓動服務,然後在指定的時間間隔重複報警。當有報警的推移,你可以開始服務,並連接到服務器,讓你想
你應該報警管理器來安排你的服務,首先創建服務的未決意圖:
Intent ii = new Intent(getApplicationContext(), MyService.class);
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii,
PendingIntent.FLAG_CANCEL_CURRENT);
然後使用報警管理器來安排吧:
//getting current time and add 5 seconds to it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);
這將啓動您的服務在當前時間的5秒之後。你可以重複你的鬧鐘。
這裏是一個半不同的方式來保持業務持續永遠。有方法來殺死它的代碼,如果你想
後臺服務:
package com.ex.ample;
import android.app.Service;
import android.content.*;
import android.os.*;
import android.widget.Toast;
public class BackgroundService extends Service {
public Context context = this;
public Handler handler = null;
public static Runnable runnable = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();
handler = new Handler();
runnable = new Runnable() {
public void run() {
Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show();
handler.postDelayed(runnable, 10000);
}
};
handler.postDelayed(runnable, 15000);
}
@Override
public void onDestroy() {
/* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */
//handler.removeCallbacks(runnable);
Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show();
}
}
這裏是你怎麼從你的主要活動啓動它或者你想去的地方:
startService(new Intent(this, BackgroundService.class));
onDestroy()
當應用程序被關閉或被殺,但可運行的只是啓動它右後衛將被調用。
我希望這可以幫助別人了。
爲什麼有些人這樣做的原因是因爲企業應用中,在某些情況下,用戶/僱員必須不能阻止某些事情:)
可能更容易做這樣的事'系統.currentTimeMillis()+ TIMEOUT_MS',而不是與'Calendar'混淆,以獲得最初的延遲。 –
你們知道你在AlarmManager中有1天,12小時,1小時,半小時和15分鐘的靜態值嗎? '公共靜態最後長INTERVAL_DAY' '公共靜態最後長INTERVAL_FIFTEEN_MINUTES' '公共靜態最後長INTERVAL_HALF_DAY' '公共靜態最後長INTERVAL_HALF_HOUR' '公共靜態最後長INTERVAL_HOUR' – DaMachk