シングルトンとして機能するService
を作成することは悪い習慣ですか?つまり、決して停止せず、他のエンジンやService
が使用するプライベートデータが含まれているActivities
があるため、Service
は次のようになります。
public class CustomService extends Service {
private List<Profile> mProfiles;
private static CustomService instance;
public static CustomService getInstance() {
if(instance == null) {
instance = new CustomService();
}
return instance;
}
public List<Profile> getProfiles() {
return mProfiles;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
}
...
}
シングルトンの代わりにService
を実行する理由は、アプリケーションから独立して機能する必要があるためです。これは、開始時に、決して閉じてはならず、アプリケーションに依存しないWebソケットに接続するためです。どうしたらいいですか?他のエンジンやService
からいくつかのデータ(例えばmProfiles
配列)を利用できるようにするためにActivities
を再利用するより良い方法はありますか?
Service
がシングルトンとして機能することをどこかで読みましたが、アプリケーションの他のポイントからプライベート変数にアクセスする方法がわかりません。
シングルトンとして機能するサービスを作成することは悪い習慣ですか?
これは冗長であり、あなたが提案する方法では、Android
Service
の観点から機能するアプリケーションコンポーネントとして機能しません。
Application
ライフサイクルは、次の影響を受けますアプリケーションコンポーネントのそのような意図は、
AndroidManifest.xml
_での宣言Application
内にコンポーネントのインスタンスを作成し、それをApplicationThread
/ActivityThread
に「アタッチ」します。つまり、アプリケーションコンポーネントはOSプロセスによってホストされるApplication
インスタンスに関連付けられており、独立して実行できないという事実がもたらされます。
あなたのアプローチに関して、2つのシナリオがあります:
1。CustomService
のデフォルトコンストラクタはパターンに従ってプライベートです。
getInstance()
を呼び出すと、CustomService
の単一のインスタンスが作成されます。インスタンスは、Java
オブジェクト(シングルトン)であり、Android
Service
アプリケーションコンポーネントと共通点はありません。 onStart()
、onStartCommand()
などのメソッドがシステムによって呼び出されることはありません。
「サービス」(マニフェストで宣言)を startService(Intent)
で開始しようとすると、_IllegalAccessException: access to constructor not allowed
_で失敗します。
2。CustomService
のデフォルトコンストラクタはパブリックです(投稿されたコードに従って)。
サービスがAndroidManifest
で宣言され、デフォルトのコンストラクターが空の場合、startService()
は失敗しませんが、getInstance()
はCustomService
の別のインスタンスを作成しますこれはAndroid
Service
アプリケーションコンポーネントとして扱われません。
これはシングルトンではありません。
どうしたらいいですか。他のエンジンやアクティビティからいくつかのデータ(たとえば、mProfiles配列)を利用できるようにするために、サービスを再利用するより良い方法はありますか?
ドキュメント に従ってService
を使用し、必要な通信の種類を選択します。
Activity
_-->
_ Service
)- started Service
を使用し、各Intent
( mProfiles
クラスがonStartCommand()
に Profile
)を実装している場合のParcelable
のように、データを添付します。Activity
_<->
_ Service
)- bound Service
を使用し、IBinder
経由で通信します。最後に、Service
のAndroid
はシングルトンです。システム内の各サービスのインスタンスは1つだけです。オンデマンドで起動し、保留中のすべてのIntent
s /バインド済みクライアントを処理します。完了するか、明示的に停止すると、破棄されます。
サービスをシングルトンとして作成することはお勧めしません。サービススティッキを開始して、サービスを名前で取得し、アクティビティ内から次のコードを使用して、サービスが機能しているかどうかを確認できます。
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
(およびこれをサポートするドキュメントが見つからないが、そうであると想定している)サービスがAndroidフレームワークによって1回だけインスタンス化されている場合、instance
を初期化できますService.onCreate
。唯一の欠点は、これがいつ呼び出されるかが保証されないことです。つまり、Application.onCreate
内でstartServiceを呼び出す場合、サービスが利用可能になるまでに少し待つ必要があります実際にインスタンス化。