web-dev-qa-db-ja.com

Androidサービスが開始されていないように見える-onStartCommand()が呼び出されない

バックグラウンドでファイルI/Oを処理するサービスを作成しようとしています。データを更新するアクティビティはサービスにバインドし、サービスのメソッドを呼び出してI/Oを実行します。ガイダンスとしてAndroidドキュメントを使用しています。

しかし、私のサービスは開始したくないようです。私のアクティビティのonCreate()メソッドには、次のものがあります。

Intent smsIntent = new Intent(this, SurveyManagerService.class);    
String surveyFilename = getIntent().getStringExtra("surveyFilename");   
System.out.println(startService(smsIntent)); //testing if it starts
SurveyManagerServiceConnection connection = new SurveyManagerServiceConnection();
sms = connection.getSurveyManagerService();

3行目でLogCatはComponentInfoオブジェクトを出力するため、サービスが作成されたように見えます。ただし、smsはnullです。さらに、SurveyManagerService onStartCommand()メソッドが呼び出されることはないようです。

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    System.out.println("starting service");
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    openSurveyFromIntent(intent);
    return START_REDELIVER_INTENT;
}

LogCatに「サービス開始」の出力が表示されたり、Toastが表示されたりすることはありません。

私のサービスはマニフェストで次のように宣言されています。

<service Android:name=".SurveyManagerService" Android:exported="false" Android:enabled="true">
</service>

明らかな何かが欠けていますか?問題を診断するために提供する必要がある他の情報を教えてください。

17
Spinner

OnCreate()メソッド 終了する必要があります サービスを実際に開始する前のようです。 getSurveyManagerService()リクエストを削除し、少し時間が経過すると、サービスが開始されたことを示すSystem.outメッセージを受け取りました。

残念ながら、これは別の問題を引き起こします。アクティビティはデータをサービスに依存しているため、サービスの開始をアクティビティに待機させる方法を決定する必要があります。

編集:私の解決策は、アクティビティにServiceConnectionのプライベートサブクラスを作成することでした。次に、onServiceConnected()メソッドをオーバーライドして、アクティビティにデータを提供します(この場合はListViewにデータを入力します)。

6
Spinner

誤ってサービスタグをアプリケーションタグの外に配置した可能性がありますか?その後、サービスはサイレントに失敗します。ログに「サービスインテントを開始できません...」というエラーがあるはずですが。

21
ohra

必ずAndroidManifest.xmlでサービスを宣言してください

<application>
    ...
    <service Android:name=".path.to.service.MyService"/>
</application>
16
Defuera

私の場合、サービスクラスをリファクタリングしましたが、マニフェストで自動的にリファクタリングされていないことに気付きました。そのため、マニフェストでサービスの完全修飾名を手動で更新する必要がありました。

0
Rupinder Kaur