サービスクラスがあります。このクラスを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
まず、Android:process=":remote"
は必要ないので、削除してください。余分なRAMを使用してもメリットはありません。
第二に、<service>
要素にはアクション文字列が含まれているため、それを使用します。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent=new Intent("com.sample.service.serviceClass");
this.startService(intent);
}
このスレッドに出くわした他の人には、この問題があり、髪を引っ張っていました。 「<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="..." />
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>
私もこの情報で誰かを助けることができることを願っています:私はサービスクラスを別のパッケージに移動し、参照を修正しました。プロジェクトはまったく問題ありませんでしたが、アクティビティによってサービスクラスが見つかりませんでした。
Logcatのログを見ると、問題に関する警告に気付きました。アクティビティはサービスクラスを見つけることができませんでしたが、面白いことに、パッケージが間違っていて、「/」文字が含まれていました。コンパイラは探していました
com.something./service.MyService
の代わりに
com.something.service.MyService
サービスクラスをパッケージから外に移動し、元に戻したところ、すべて正常に機能しました。
私の場合、Intentによるデータ転送の最大上限は1 MBです。 CacheまたはStorageを使用します。
同じ問題が見つかりました。 OnClickListener
メソッドからサービスを開始しようとしてほぼ1日を失いました-onCreate
の外で、1日たっても失敗しました!!!!とてもイライラする!サンプル例RemoteServiceController
を見ていました。それらは動作しますが、私の実装は動作しません!
私のために働いていた唯一の方法は、onCreate
メソッド内からでした。他のバリアントはどれも機能せず、すべて試してみました。
結論:
また、「/」はサービスへのパスを見つけることができなかったため、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>