2011-07-03 10 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:INFO/ActivityManager(583):プロセスcom.myapp(PID 11665)が死亡しました。 07-03 16:55:09.440:WARN/ActivityManager(583):私はこれを防ぐにはどうすればよい

5000msで墜落したサービスcom.myapp/.MyServiceのスケジュールの再起動?

+0

さて、どのようにプロセスが死ぬのを防ぐには? – nhaarman

答えて

2

私はアプリを実行して、ホームスクリーンに戻ると、サービスが実行し続けます。しかし、しばらくすると、私はこれらのlogcatメッセージを取得し、サービスが停止します...どうすればこれを防ぐことができますか?

あなたは一般的に言えません。

サービスは永遠に実行されるようには設計されていません。開発者が非常に多く、サービスを停止したことはありません。そして、あなたの場合、彼らは正当な理由でそうしません。時計のチックを見ているだけで、サービスがハングアップしているのは無駄です。特に開発者があまりにも長引くとAndroidがクラッシュしてしまうようなことが起こるためです。

AlarmManagerとおそらくIntentServiceを組み合わせて使用​​するように切り替えてください。これ以上の作業がなければ、サービスは独自に調整されます。

+0

私はAlarmManagerを使用しようとしましたが、私は分析を使用しているため、可能な場合は回避策を優先しました。これらは、同じでなければならないコンテキストで開始および終了されます。サービスを閉じると、コンテキストが失われ、アナリティクスインスタンスを閉じることができません。あるいは、これを行う別の方法がありますか? (私は途中でFlurryを使用しています)。 – nhaarman

+0

@ニーク: "これを行う別の方法はありますか?" - 使用状況を自分で追跡します。サービスと連携するように設計された別の分析パッケージに切り替えることもできます。 – CommonsWare

1

お客様のサービスをRemote Serviceとして実行して、独自のプロセスで実行されるようにしたい場合があります。

リモートサービスに関するブログ: http://saigeethamn.blogspot.com/2009/09/android-developer-tutorial-part-9.html

サンプル1の例: http://about-android.blogspot.com/2010/02/android-remote-service-sample.html

+0

ありがとう、私はそれを試してみましょう。 – nhaarman

+0

これは、アクティビティが周囲にある間にアプリが2倍のRAMを占めることを意味します。これは、無駄なアプリを必要とし、悪化させます。 – CommonsWare

+0

@CommonsWare - アクティビティは常に実行する必要はありませんが、アプリケーションが動作する必要がある場合でも、アクティビティが終了したため停止する場合でも、何らかの解決策を見つける必要があります。 –

7

提供された回答は私を助けませんでした。しかし、私はこれを行うには本当に簡単な方法を発見し、マニフェストにだけ、現時点ではテスト

<service android:name="..." android:process=":remote" /> 

http://developer.android.com/guide/topics/manifest/service-element.html

を追加し、私の活動はすでに殺されてしまったが、私のサービスが実行されています。

関連する問題