8

私は、他の開発者がプロ​​ジェクトに含めることで使用するサービスを提供するライブラリを作成しています。そのため、AndroidManifest.xmlを制御することはできません。ドキュメントで何をすべきかを説明しますが、それでも一般的な問題は、マニフェストに適切な<service />タグを追加しなかったり、間違った場所に追加したりすることを怠ることです。

現在、マニフェストでサービスが宣言されていないときにライブラリがstartServiceを呼び出すと、ActivityManagerが警告をログに記録するだけです。これが発生したときに例外をスローして、開発者がそれを修正する方法を理解できるようにしたいと思います。マニフェストが実際にこのサービスを宣言しているかどうかをどのように検出できますか?

4

3 に答える 3

11

これを行うには、ライブラリにコンテキストが必要だと思います。よりクリーンな方法は、で開始したいをクエリするpackagemanagerことです。intentservice

public boolean isServiceAvailable(Context context, String action) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(context, MyService.class);
    List resolveInfo =
            packageManager.queryIntentServices(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);
   if (resolveInfo.size() > 0) {
     return true;
    }
   return false;
}
于 2011-06-30T01:46:45.597 に答える
6

これを見落とすのはちょっとばかげていますが、startService()は、そのようなサービスが見つからない場合はnullを返し、それ以外の場合はComponentNameを返します。それが私にとって最も簡単な方法です。PackageManagerを使用しても機能するようです。

于 2011-06-30T01:39:06.183 に答える
1

PackageManagerは、インストールされているサービス、アクティビティ、およびその他のものを認識しています。私はそれを広範囲に使用していませんが、getServiceInfoはあなたの要件を満たすはずだと思います。

コンポーネントのサービス情報を試して見つけることができるはずです。マニフェストに入れるのを忘れた場合、例外がスローされます。この例外をキャッチして、独自の有益な例外をユーザーにスローできます。

于 2011-06-30T01:32:08.833 に答える