2011-07-03 152 views
2

我有一個活動啓動服務。服務崩潰'活動'的活動

在我的活動:

startService(new Intent(this, MyService.class)); 

在我的服務,在onStart():

/* Show notification */ 
int icon = R.drawable.icon; 
tickerText = getResources().getString(R.string.app_name); 
long when = System.currentTimeMillis(); 
contentTitle = getResources().getString(R.string.app_name); 
contentText = getResources().getString(R.string.running); 

Intent notificationIntent = new Intent(this, activityClass).setAction(Intent.ACTION_MAIN).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
notification = new Notification(icon, tickerText, when); 
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent); 

notification.flags = Notification.FLAG_ONGOING_EVENT; 

((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(0, notification); 

startForeground(0, notification); 

的服務有一個計時器,做了一些工作,每3-4分鐘,並以廣播信息活動如果可能。當活動結束後,該服務應該繼續工作。

當我運行該應用程序,並返回到主屏幕時,該服務繼續運行。但過了一段時間我得到這些logcat的消息,並且該服務停止:

07-03 16:55:09.440:信息/ ActivityManager(583):進程com.myapp(PID 11665)已經死亡。 07-03 16:55:09.440:WARN/ActivityManager(583):墜毀服務com.myapp/.MyService的計劃重啓在5000毫秒

我如何避免這種情況?

+0

好的,以及如何防止死亡的過程? – nhaarman

回答

2

當我運行應用程序,並返回到主屏幕,該服務繼續運行。但一段時間後,我得到這些logcat消息,並停止服務......我怎樣才能防止這種情況?

你一般不會說。

服務並非永久運行。太多的開發者已經開始了服務,並且從未停止過它們。而就你而言,他們這樣做是沒有理由的。在內存中存儲服務只是看着時鐘滴答是非常浪費的,尤其是因爲開發者在做這樣的事情時,會在Android停留時間過長後「崩潰」服務。

對您的情況,請切換到使用AlarmManager,可能與IntentService一起使用,以便在沒有更多工作要完成時自動關閉服務。

+0

我試圖使用AlarmManager,但如果可能,首選解決方法,因爲我使用的是分析。這些都是以上下文開始和結束的,必須是相同的。關閉服務時,上下文丟失,無法關閉分析實例。還是有另一種方法來做到這一點? (我正在使用Flurry)。 – nhaarman

+0

@Niek:「或者有另一種方法可以做到這一點?」 - 自己跟蹤使用數據。或切換到另一個分析包,一個旨在處理服務的分析包。 – CommonsWare

1

你會想看看讓你的服務運行爲Remote Service,以便它在自己的進程中運行。

有關遠程服務的一個博客: http://saigeethamn.blogspot.com/2009/09/android-developer-tutorial-part-9.html

樣本中的一個例子: http://about-android.blogspot.com/2010/02/android-remote-service-sample.html

+0

謝謝,我會嘗試。 – nhaarman

+0

這意味着應用會在活動周圍佔用兩倍的內存,這會浪費應用程序並使其變得更糟。 – CommonsWare

+0

@CommonsWare - 活動可能不需要一直運行,但是,無論應用程序是否需要工作,並且因爲活動結束而停止,則需要找到一些解決方案。 –