web-dev-qa-db-ja.com

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

サービスクラスがあります。このクラスを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

80
Vinay

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

第二に、<service>要素にはアクション文字列が含まれているため、それを使用します。

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

このスレッドに出くわした他の人には、この問題があり、髪を引っ張っていました。 「<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="..." />
72
Blundell

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>
32
Jianhong

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

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

com.something./service.MyService

の代わりに

com.something.service.MyService

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

5
sataniccrow

私の場合、Intentによるデータ転送の最大上限は1 MBです。 CacheまたはStorageを使用します。

0
ranbuch

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

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

結論:

  • サービスクラスをmainActivityとは異なるパッケージに配置すると、あらゆる種類のエラーが発生します
  • また、「/」はサービスへのパスを見つけることができなかったため、Intent(package,className)およびnothingで開始しようとしましたが、他のタイプのインテントも開始しました

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

  • 次のようにonClickメソッド内でリスターナー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>
0
marisxanis