5

私は、他の開発者がプロ​​ジェクトにプロジェクトを組み込むことによって使用されるサービスを提供するライブラリを作成しています。したがって、私はAndroidManifest.xmlを制御できません。ドキュメントで何をすべきか説明しますが、一般的な問題は、適切な<サービス/ >タグをマニフェストに追加すること、または間違った場所に追加することを無視することです。AndroidManifest.xmlでサービスが宣言されているかどうかをプログラムで確認する方法は?

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

答えて

5

私はこれを見落とす種類がありますが、startService()はそのようなサービスが見つからない場合はnullを返し、それ以外の場合はComponentNameを返します。それは私のための最も簡単な方法です。これは、PackageManagerを使用してもうまくいくようです。

1

PackageManagerは、インストールされているサービス、アクティビティなどがわかります。私は広範囲に使用していないが、私はgetServiceInfoがあなたの要件を満たすべきだと考えている。

コンポーネントのサービス情報を試すことができます。彼らがマニフェストにそれを入れるのを忘れた場合、例外がスローされます。この例外をキャッチして、ユーザーに有益なものを投げることができます。

9

これを行うには、ライブラリにコンテキストがある必要があります。より洗練された方法は、intentpackagemanagerを照会して、serviceを開始することです。

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; 
} 
+1

「MATCH_DEFAULT_ONLY」フラグとは何ですか? – HyBRiD

関連する問題