2012-09-28 184 views
1

我有一個在AndroidManifest中註冊的服務的應用程序,可以在啓動時啓動。我通過一個意圖接收器BOOT_COMPLETED來做到這一點,並且這工作正常。但是,如果用戶在安裝後立即啓動應用程序,我想從主Activity啓動服務,因爲它可能沒有運行。啓動可能從啓動時運行的服務活動

我不確定最好的方法來做到這一點。我知道我可以從activity中調用startService(),並且可以工作,但是我可以運行多個服務實例。我不想首先停止服務,因爲如果它正在運行,我只是希望該實例繼續運行。該服務可能處於任務的中間,我不希望它停止。

在活動時間:

Intent serviceIntent = new Intent(); 
serviceIntent.setAction(MessageReceiverService.ClassName); 
startService(serviceIntent); 

Android清單registeing意圖:

<receiver android:name="com.app.proto1.service.StartupIntentReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 

     <category android:name="android.intent.category.HOME" /> 
    </intent-filter> 
</receiver> 

我服務過載的方法:

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    Log.d(Tag, "onCreate()"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d(Tag, "onDestroy()"); 
} 

@Override 
public void onStart(Intent intent, int startId) { 

    super.onStart(intent, startId);  
    Log.d(Tag, "onStart()"); 
    this.registerReceiver(new SmsReceiver(), new IntentFilter(SMS_ACTION)); 
} 

有沒有一種方法可以檢查服務是否已經運行而不是重新啓動,而不會破壞現有的?

+1

與活動不同,不存在多個服務實例。爲了達到完全相同的目的,我的主要活動以完全相同的方式啓動我的服務。你應該都準備好了。 – jsmith

回答

2

那麼,如果你的服務已經在運行,並且你嘗試再次啓動服務,那麼將不會爲該服務創建新實例,它只會考慮以前的運行實例。所以,在這種情況下沒有什麼可擔心的。如果您在調用服務的同時調用其服務onStartCommand(Intent, int, int)而不是onCreate()

+0

好的,我在Service.onStart()重載中註冊了一個廣播接收器,而不是在onCreate()中。是的,看着日誌,我看到onCreate()只有一次調用,即使在多次調用startService()之後。看來我想在服務的onCreate()方法中註冊廣播接收器,而不是onStart()。好的交易,謝謝。 –

+0

另外'onStart()'現在不推薦使用''onStartCommand()' –

+0

Ahhh,謝謝。我必須拉一個相當古老的服務例子。 –