サービスを開始するためのAndroid onCreateまたはonStartCommand


105

通常、Androidサービスを作成するときにonCreateメソッドを実装しますが、最後のプロジェクトではこれが機能しません。私は実装しようとしましたonStartCommandが、これはうまくいくようです。

問題は、どのメソッドが必要なサービスを実装する必要があるかです。どのメソッドを実装する必要がありますか?onCreateonStartCommandまたはその両方?そして、それぞれの役割は何ですか?


onCreate常に関係なく呼び出されます
IgorGanapolsky

回答:


189

onCreate()Serviceオブジェクトがインスタンス化されるとき(つまり、サービスが作成されるとき)に呼び出されます。このメソッドでは、1回だけ実行する必要があることを実行する必要があります(つまり、いくつかの変数を初期化するなど)。インスタンス化されたオブジェクトごとに1onCreate()回だけ呼び出されます

onCreate()実際に何かを1回だけ初期化する必要がある場合にのみ、実装する必要があります。

onStartCommand()クライアントがを使用してサービスを開始するたびに呼び出さますstartService(Intent intent)。つまり、onStartCommand()複数回呼び出される可能性があります。このメソッドでは、クライアントがサービスから何かを要求するたびに必要なことを行う必要があります。これは、サービスの機能と、クライアントとの通信方法(およびその逆)に大きく依存します。

実装しないと、クライアントが渡すonStartCommand()から情報を取得できず、サービスが有用な作業を行えない可能性があります。IntentonStartCommand()


6
同じサービスの2つのインスタンスがアプリケーション内に存在できますか?
jacktradesは2013年

1
@jacktrades理論的におよびドキュメントによると:いいえ。ただし、Androidにはいくつかのバグがあり、実際には特定の状況でサービスの複数のインスタンスが作成されるようです。しかし、先ほど申し上げたように、これはバグであり、思い通りに確実に再現することはできませんでした。なぜ質問するのですか?
David Wasser 2013年

3
@Mr_and_Mrs_D私の知る限り、公式のバグは報告されていません。しかし、これが起こっているという報告がいくつかあり、私はそれが起こっていることを知っているアプリケーションを持っています。問題を小さく再現可能なものに減らすことができなかったため、自分でバグを報告していません。ドキュメントでは、サービスがシングルトンであることを明示的に述べていませんが、それが意図されていることは非常に明確です。「startService()」のドキュメントを見てください。サービスがまだ実行されていない場合は、作成および開始され、実行されている場合は実行されたままであることを
David Wasser

6
@Diffyを呼び出すstartService()と、サービスが実行されていない場合、Androidはサービスクラスのインスタンス(これはサービスオブジェクトです)を作成し、onCreate()そのオブジェクトを呼び出します。次にonStartCommand()、そのオブジェクトを呼び出します。しばらくしてから再度を呼び出したstartService()場合、サービスがまだ実行中であれば、Androidは新しいサービスオブジェクトを作成しません。代わりonStartCommand()に、既存のサービスオブジェクトを呼び出すだけです。それは明らかですか?
David Wasser 2014年

1
わたしは、あなたを愛しています!(y)魔法のように機能しました(y)非常にシンプルで優れた説明
ヒルトンハドカ2017

11

サービスはアクティビティと同じように動作しますassociateサービスで一度やりたいことは何でもonCreate初期化のようになります

そして、servicestartServiceを使用して呼び出されるときはいつでも。onStartCommand呼び出されます。実行するアクションを渡すことができます。音楽プレーヤーのように、アクションの使用、再生、一時停止、停止ができます

そして、あなたはoperation in serviceアクションを送信してそれを受け取ることで何かをしますonStartCommand

onCreate コンストラクタのように動作します。

簡単に編集

onCreate()唯一あなたが最初に起動したときのためのコールServiceに対しonStartCommand()コールは、あなたが呼び出す毎回startService再び。再生、停止、音楽の一時停止などのアクションを設定できます。

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

startService(intent)を使用してサービスを呼び出すと、onCreate()は呼び出されませんか?私は常にサービスをstartSevice(intent)で開始しているため、「サービスオブジェクト」が何であるかを理解できません。
2014年

サービスオブジェクトを適切にインスタンス化したか、おそらくマニフェストにサービスがないか
Zar E Ahmer

startService(new Intent(this、ServiceName.class));のようなサービスを開始します。
Zar E Ahmer 2014年

しかし、このメソッドはサービスのインスタンス化と呼ばれていますか?では、サービスオブジェクトはどこにありますか?
2014年

インテントを使用してアクティビティとサービスを呼び出す方法であり、Androidでアクティビティとサービスを開きます。サービスオブジェクトで実行したいことは、意図的に実行することもできます。サービスにデータを渡すことを意味します
Zar E Ahmer 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.