无法启动服务意图
我有一个服务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>