サービスインテントを開始できません


81

サービスクラスがあります。このクラスをjarにエクスポートし、jarをクライアントアプリに埋め込みました。

必要に応じて、サービスクラスを呼び出します。これを実行しようとすると、次のエラーが発生します。

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found

同じjar内にあるサービスクラスとは別に、アクセスできる(そのクラスのオブジェクトを作成する)クラスがあります。

構成やマニフェストなどで何かを見逃しているように感じます。

同じものを特定するのを手伝ってください。私のコードは以下の通りです:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent = new Intent () ;  
      intent.setClassName("com.sample.service" ,"com.sample.service.serviceClass") ;  
      this.startService(intent) ; // when I call this line I get the message...  
      // binding other process continue  here   
}

クライアントmanifest.xml

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>

よろしく
お願いします、Vinay


私はあなたのコードを修正しようとしましたが、ソースにはそれを試みるのに十分理解していないと感じた問題があります。基本的に、<service ...>には余分なスペースがあり、<service ...>である必要がありますが、ソースを見ると、2つのインポートステートメントの前に「/」があり、それらがあるかどうかはわかりません。そこにあるはずです。'<'の後のスペースが問題の原因になると思います。
ジェームスブラック

返信してくれてありがとうジェームズ。これらのスペースは、サイトに表示するためにのみ意図的に与えられています。コード内では、タグ内にスペースはありません。「\」でさえ、サイトに正しく表示するためだけのものです。基本的に、Eclipseでコンパイルエラーは発生しません。実行時にのみ、LogCat
Vinay

回答:


48

まず、必要ないのでandroid:process=":remote"、削除してください。余分なRAMを使用するだけで、メリットはありません。

次に、<service>要素にはアクション文字列が含まれているため、次のように使用します。

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

親愛なるマークさん、別のアプリから同じコンテンツにアクセスする必要があるため、リモートを追加しました。Webで読んだ後、リモートサービスを実装する方がよいということを含めます。私はあなたの提案に従って修正しました、そしてそれは今うまくいきます。もう一度ありがとう。
Vinay 2010

2
@Vinay:「異なるアプリから同じコンテンツにアクセスする必要があります。」それでも必要ないのでandroid:process=":remote"、削除してください。余分なRAMを使用するだけで、メリットはありません。リモートサービスは、AIDLを介してAPIを提供するサービスであり、android:process属性とは関係ありません。これがサンプルリモートサービスです:github.com/commonsguy/cw-advandroid/tree/master/AdvServices/…そしてこれがそのサービスの対応するクライアントです:github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare 2010

72

このスレッドに出くわした他の人にとって、私はこの問題を抱えていて、髪を引っ張っていました。 '<application>'終了タグDUHの外側にサービス宣言がありました!

正しい:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>    

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        
</application>

<uses-permission android:name="..." />

間違っていますが、それでもエラーなしでコンパイルされます:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>

</application>

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        

<uses-permission android:name="..." />


7
これは、これらの単純な間違いを拾う強化されたAndroidリントの仕事のように聞こえます!私たちは最終的にそれを得るかもしれません。
Ehtesh Choudhury 2012

1
xmlでサービス名のスペルを間違えました!これは私に問題がどこにあったかについての手がかりを与えました。ありがとう
Arvand 2013

回答を投稿していただきありがとうございます。これにより、サービスが開始されないことが最終的に解決されました。
pmont 2013

うわー!本当にありがとう。<application>タグで機能しないのはなぜですか?
ルチルバロニア2015

IDEは、スペルミスのある<service>タグについて文句を言いません。私たちもそれを間違えました。
Yeung 2015年

32

1)マニフェストのサービス宣言がアプリケーションタグにネストされているかどうかを確認します

<application>
    <service android:name="" />
</application>

2)service.javaアクティビティと同じパッケージまたはdiffパッケージに含まれているかどうかを確認します

<application>
    <!-- service.java exists in diff package -->
    <service android:name="com.package.helper.service" /> 
</application>
<application>
    <!-- service.java exists in same package -->
    <service android:name=".service" /> 
</application>

1
ドットかどうか?ない、代わりに私の使用<サービスは、Android:名=「サービスを」/>私の場合、それはworks.see stackoverflow.com/questions/2265020/...
DiveInto

ドットを使用すると、パッケージパスを定義するため、これも機能するはずです
Jianhong 2011年

3
おい、あなたの答えをどうもありがとう。私は極寒の問題に取り組んできましたが、私のサービスは別のパッケージに入っていたことがわかりました。私があなたを抱きしめることができれば私はそうするでしょう!
racl101 2012年

1
2点目が助かりました。
どうも

5

この情報についても誰かを助けられることを願っています。サービスクラスを別のパッケージに移動し、参照を修正しました。プロジェクトは完全に問題ありませんでしたが、アクティビティによってサービスクラスが見つかりませんでした。

logcatのログインを見ると、この問題に関する警告に気づきました。アクティビティはサービスクラスを見つけることができませんでしたが、面白いことに、パッケージに「/」文字が含まれていました。コンパイラが探していた

com.something./service.MyService

の代わりに

com.something.service.MyService

サービスクラスをパッケージから移動して元に戻しましたが、すべて正常に機能しました。


最初は/はエラーだと思いましたが、logcatエントリを見続けると何度も表示され、それらのアプリはすべて完全に機能しています。
Axxiss 2012

1
まあ、私はあなたの経験を否定することはできませんが、私のものは少し異なっていて、パッケージからクラスに出入りすることによって、Eclipseはそれ自体の間違いを修正しました;)そして私は実行時の例外を受け取りませんでした。
sataniccrow 2012

2
私もそれがうまくいったと言わなければなりません。奇妙な問題ですが、コメントを見つけるのに30分かかりました。ありがとう!
Alex RR

同じ問題があると思いますが、クラスファイルを移動しても修正できませんでした...
2012

これは私の特定の問題でした。理解するのは非常に難しいですが、サービス名の/が手がかりでした。サービスが突然機能しなくなったり、新しいチェックアウトで機能しなくなったりした場合は、これが原因(および解決策)である可能性があります。
Hayes Haugen 2013

0

私の場合、Intentによるデータ転送の最大上限は1MBです。キャッシュまたはストレージを使用します。


0

私は同じ問題を見つけました。OnClickListenerメソッドからサービスを開始しようとしてほぼ1日を失いました-外で、onCreate1日後も失敗しました!!!! とてもイライラします!サンプル例を見ていましたRemoteServiceController。それらは機能しますが、私の実装は機能しません!

私のために働いていた唯一の方法は、内部onCreateメソッドからでした。他のバリアントはどれも機能せず、私がそれらすべてを試したと信じています。

結論:

  • サービスクラスをmainActivityとは異なるパッケージに入れると、あらゆる種類のエラーが発生します
  • また、1つの「/」はサービスへのパスを見つけることができずIntent(package,className)、何も開始しようとしませんでした。他のタイプのインテントも開始しました。

  • 動作するアクティビティ最終フォームの同じパッケージでサービスクラスを移動しました

  • うまくいけば、これは次のようにメソッドonClick内でlisternersを定義することによって誰かを助けるでしょうonCreate

    public void onCreate() {
    //some code......
        Button btnStartSrv  = (Button)findViewById(R.id.btnStartService);
        Button btnStopSrv  = (Button)findViewById(R.id.btnStopService);
    
        btnStartSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                startService(new Intent("RM_SRV_AIDL"));
            }
        });
    
        btnStopSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                stopService(new Intent("RM_SRV_AIDL"));
            }
        });
    
    } // end onCreate
    

マニフェストファイルにとっても非常に重要です。サービスがアプリケーションの子であることを確認してください。

<application ... >
    <activity ... >
     ...
    </activity>
    <service
        android:name="com.mainActivity.MyRemoteGPSService"
        android:label="GPSService"
        android:process=":remote">

        <intent-filter>
             <action android:name="RM_SRV_AIDL" />
        </intent-filter>
    </service>
</application>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.