2010-12-17 15 views
11

私はまだAndroidには新鮮で、IDは、アプリの起動時に私のサービスを起動するために以下の設定が動作すると思う。アプリの起動時にAndroidサービスを起動するにはどうすればよいですか?

<service android:name=".PlaylistUpdaterService"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </service> 

しかし、これは該当しません。私は何を取りこぼしたか?

答えて

8

私が間違っている場合は訂正してください。ただし、android.intent.category.LAUNCHERはアクティビティに対してのみ有効です。したがって、サービスを開始する有効な方法のように見えません。あなたは次の操作を行う場合は、達成することができます同じ:

  • は、その活動のためのサービス
  • を開始するためにのみ使用されます透明アクティビティを作成、あなたはGUIのレイアウトを指定する必要はありません。つまり、アクティビティのonCreate()でsetContent()を設定する必要はありません。 AndroidManifest.xmlで、この活動のためのテーマタグの下にスタイル/ Theme.NoDisplay

    :あなたが必要とする唯一のものは

@androidを置くことです。

  • 開始サービスアクティビティのonCreate()からサービスを開始してください。
  • あなたのアクティビティのonStart()finish()と電話すると、閉じることができます。

あなたのアクティビティはユーザーには見えなくなり、まもなくサービスを開始するために使用されたことに気付くことはありません。

+0

この種のメソッドは、アクティビティの実行中にUIをロックしますが、半透明に設定されているため、何もできません。このUIロックを避ける方法はありますか? –

+0

@ Noble6 - 私の答えを更新しました。貴重なコメントをありがとう。 – Zelimir

+3

アクティビティを使用する必要はありません。これは、アクティビティの開始と停止のオーバーヘッドにより、アプリケーションの起動時間が遅くなるだけです。アプリをオーバーライドする以下のアプローチが優れています。ただし、実際にアクティビティから開始したい場合は、サービスがまだ開始されていない場合はデフォルトの動作としてサービスを開始する基本アクティビティを作成し、すべてのアクティビティでそのベースアクティビティを延長する方がよいでしょう。 –

19

間違っている! Applicationクラスを拡張してください(IEはあなた自身で作成してください)。次にonCreate()メソッドでこれを行います。

//Service is below 
Intent serviceIntent = new Intent(getApplicationContext(), PlaylistUpdaterService.class); 
startService(serviceIntent); 

そして、そのインテントフィルタをマニフェストファイルの宣言から削除します。

<service android:name=".PlaylistUpdaterService"> 

としてApplicationクラスは、すぐにアプリがあるとして起動されているため、この操作を行うだけ

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

理由はあなたの家の活動にする必要がありますが、以下のインテントフィルタを、それを残すと、アンドロイドフレームワークが管理するグローバルクラスの一種として機能します。

実際にホーム画面に戻るたびにサービスを実行する場合は、ホームクラスonResume()でサービスを開始する必要があります。アプリケーションに入れる場合は、ユーザーが初めて起動した場合、または実行中のプロセスが終了した後にのみ、サービスが開始されます。onCreate()または、あなたの家のクラスonCreate()に入れることができますが、毎回実行することさえ保証されていません。

+0

あなたは間違っていると言っていますが、インテントフィルタカテゴリも設定しています。それだけでなく、あなたのアプローチも正しいです。 – Zelimir

+0

これは、サービスを1回だけ(起動時に)起動したい場合には適切な方法ではありません。ユーザーが向きを変えるたびにサービスが開始されます。私はこれも解決策を探しています。 – DerpyNerd

+3

@RobbieVercammen - サービスが実行されている場合、2回目の起動は何も行いません。これがデフォルト動作です。 –

関連する問題