无法启动服务意图

我有一个服务class。 我已经将这个类导出到jar,我已经在我的客户端应用程序中embedded了jar。

需要时,我打电话给服务class。 当我尝试这样做时,出现以下错误:

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

除了服务类以外,我还有其他类,我可以访问(创build该类的对象),它们位于同一个jar中。

我觉得我已经错过了我的configuration或清单中的一些东西。

请帮我确定一下。 我的代码如下:

 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> 

提前致谢,
维奈

首先,你不需要android:process=":remote" ,所以请删除它,因为它所要做的只是占用额外的内存而没有任何好处。

其次,由于<service>元素包含一个操作string,所以使用它:

 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

我把服务类从包里取出来,一切正常。

在我的情况下,意向数据传输的最大上限为1 MB。 我只是使用caching或存储。

我发现了同样的问题。 我失去了将近一天的时间尝试从OnClickListener方法启动服务 – 在onCreate之外,1天之后,我仍然失败! 非常沮丧! 我正在看示例示例RemoteServiceController 。 他们的作品,但我的实施不起作用!

为我工作的唯一方法是从onCreate方法。 没有其他变种的工作,相信我,我已经尝试了所有。

结论:

  • 如果你把你的服务类放在与mainActivity不同的包中,我会得到所有types的错误
  • 另外一个“/”找不到服务的path,尝试从Intent(package,className) ,没有任何东西,也有其他types的Intent启动

  • 我把这个服务类移到了工作的最终表单的同一个包中

  • 希望这可以通过在onCreate方法中定义列表器onClick帮助某人:

     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 

Manifest文件也是非常重要的,确保服务是应用程序的子节点:

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