2013-01-02 104 views
0

我有一個活動將一些細節發送到我的數據庫,但是當我點擊後退按鈕時它會停止。 是否有可能讓它在後臺運行?我聽說使用服務可以解決這個問題,但是因爲我所有的類都是活動,所以我想知道它是否可行。 用onStop方法的某些代碼無法完成這項工作嗎?在後臺運行一個活動

+3

不,onStop應該很快,所以你不能在那裏繼續處理。如果你有長時間運行的進程,你應該把它們放在後臺,但是你也應該只對用戶交互進程使用活動。遷移到「服務」並不困難,值得付出努力。 – 323go

+0

您正在尋找服務。看看這個教程http://www.vogella.com/articles/AndroidServices/article.html –

+0

讓我們假設我的應用程序是某種計時器..我想在後臺運行它,但當用戶重新打開它應該看到它是一種活動......我該如何分解它?服務是什麼以及活動是什麼? –

回答

1

你提到所有的類都寫成活動,我假設你的應用程序邏輯嵌入了你的用戶界面邏輯。這通常不是一個好的做法 - 您應該嘗試將特定於應用程序的代碼遷移到單獨的類。通過在用戶界面之外使用此功能,您的應用程序將以多種方式受益。

要回答你的問題,可以讓你的應用程序通過子類Service在後臺執行功能。看一看here是一個很好的解釋。

0

您應該使用意圖編寫活動與之通信的服務。因此它應該將數據發送到服務以便發送到數據庫,然後服務可以通知活動。當活動監聽來自服務的事件時,您正在實現Observer模式(Java和Android中的監聽器以及許多其他事件處理系統)。

您也可以輪詢服務,但這不是獲取狀態更新的首選模式。

2

Heey,

創建一個擴展Service的新類。 添加必要的覆蓋。

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    //this service will run until we stop it 
      // This will execute when the service starts 


    return START_STICKY; //makes it sticky to keep it on until its destroyd 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
      // when the service is destroyd 
} 

可以啓動與服務:

stopService(new Intent(getBaseContext(), ServiceClassName.class)); 

您可以停止服務:

stopService(new Intent(getBaseContext(), ServiceClassName.class)); 

希望這有助於:)

1

你將不得不重寫onBackPressed方法來做你想做的事情。如果你想「隱藏」活動(所以用戶看到它「關閉」),你可以調用moveTaskToBack方法。

+0

「moveTaskToBack」後應用程序會繼續運行嗎? –

+0

您應該測試用於db寫入的「背景」代碼。至少它會隱藏它之前保存狀態。 – DNax

+0

我應該使用super.onBackPressed()嗎?我認爲沒有,因爲這是殺死我的應用程序,我猜對的方法? –