2

対応するサービスもある Android アプリ (アクティビティ) があります。サービスはアクティビティによって開始され、アクティビティが停止しても継続的に実行されるはずです。アクティビティが再び開始されると、サービスにバインドしてクエリを実行できます。

アクティビティが OS によって破棄され、作成されることがあります。これは物事に影響を与えるべきではなく、アクティビティが再作成され、サービスに再びバインドできるようになるはずです。これは基本的に機能します。

でも...

Dalvik VM ヒープとネイティブ ヒープの両方が圧縮されていないため、アクティビティがメモリ不足になり、クラッシュするまでサイズが絶えず増加することがわかりました (合計メモリ使用量は実際には一定であり、リークしていません)。作成プロセス中に多くの割り当てが行われるため、アクティビティを破棄して再作成すると、これはさらに悪化します。

これにより、何度か再起動した後にアクティビティがクラッシュすることがほぼ保証されます。これはそれほど気になりませんが、同じアプリケーションの一部であるため、サービスもクラッシュします。サービスには、クラッシュ中に失われる重要なデータが含まれています。

この問題を解決する方法についての提案に興味がありますか?

サービスをアクティビティから分離する方法はありますか (アクティビティがクラッシュしたときにサービスもクラッシュしないように)、サービスとアクティビティを同じアプリケーション内に保持する方法はありますか?

サービス データを永続化することはできますが、これには DB へのアクセスが多く必要になり、バッテリーの節約にはつながりません。

4

2 に答える 2

0

マニフェストでサービスの「プロセス名」を指定する必要があります。名前は「:」または小文字で始めることができます。引用する:http://developer.android.com/guide/topics/manifest/service-element.html

この属性に割り当てられた名前がコロン (':') で始まる場合、アプリケーション専用の新しいプロセスが必要なときに作成され、サービスはそのプロセスで実行されます。プロセス名が小文字で始まる場合、サービスはその名前のグローバル プロセスで実行されます (許可されている場合)。

例はマニフェストにあります

 <service android:name=".services.OfficeService"
            android:process=":myProcess" />
于 2014-11-11T11:08:46.107 に答える
0

あなたのサービスは、機能していないアクティビティへの参照を維持しているようです。バインドされたサービスではなく、開始されたサービスを使用する必要があります。違いとそれぞれの使用方法の詳細については、サービスに関するガイド トピックを参照してください。

bindService()バインドされたサービスを使用する場合 (つまり、何らかの理由で本当に使用する必要がある場合)、unbindService()アクティビティが終了する前に必ず呼び出してください。最後のアクティビティがアンバインドされると、サービスが停止することに注意してください。

于 2012-02-26T23:16:50.660 に答える