2012-05-02 76 views
24

我的工作,這將繼電器關於它的位置到遠程服務器信息的應用程序。我打算做一個簡單的HTTP發佈到Web服務器做到這一點,一切都簡單而精緻。Android的 - 定期進行後臺服務 - 諮詢

但根據規範,應用程序需要從時間執行自己的時間,可在每30分鐘一次說。是獨立的接口,意義它需要即使應用程序被關閉運行的。

我環顧四周,發現了Android服務是需要使用什麼。我可以用什麼來實現這樣一個系統。服務(或其他機制)在手機重新啓動時是否會重新啓動?

在此先感謝。

回答

28

創建一個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"/> 
0

您可以使用Alarm Manager在指定時間啓動服務,然後在指定的時間間隔重複報警。當有報警的推移,你可以開始服務,並連接到服務器,讓你想

6

你應該報警管理器來安排你的服務,首先創建服務的未決意圖:

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秒之後。你可以重複你的鬧鐘。

+0

可能更容易做這樣的事'系統.currentTimeMillis()+ TIMEOUT_MS',而不是與'Calendar'混淆,以獲得最初的延遲。 –

+4

你們知道你在AlarmManager中有1天,12小時,1小時,半小時和15分鐘的靜態值嗎? '公共靜態最後長INTERVAL_DAY' '公共靜態最後長INTERVAL_FIFTEEN_MINUTES' '公共靜態最後長INTERVAL_HALF_DAY' '公共靜態最後長INTERVAL_HALF_HOUR' '公共靜態最後長INTERVAL_HOUR' – DaMachk

11

這裏是一個半不同的方式來保持業務持續永遠。有方法來殺死它的代碼,如果你想

後臺服務:

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()當應用程序被關閉或被殺,但可運行的只是啓動它右後衛將被調用。

我希望這可以幫助別人了。

爲什麼有些人這樣做的原因是因爲企業應用中,在某些情況下,用戶/僱員必須不能阻止某些事情:)

http://i.imgur.com/1vCnYJW.png

+1

不錯的解決辦法,但這種將繼續啓動經過一段時間後,服務將在一段時間後重新開始。 – Dev

+1

要防止重起的onCreate()的代碼移到 @覆蓋 公衆詮釋onStartCommand(意向意圖,詮釋標誌詮釋startId){可運行 回報START_NOT_STICKY //代碼; } return START_NOT_STICKY將確保服務不會重新啓動,並且您的處理程序將在onDestroyed()後保持停止狀態。 – Dev

+1

不要忘了將該服務添加到你的'AndroidManifest.xml'中:'。 –