I write an android service of get weather, and the AndroidManifest.xml is:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.weather"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<service
android:name=".WeatherService"
android:exported="true" >
</service>
</application>
</manifest>
Now, I want let another apk to start this service:
Intent service = new Intent();
service.setClassName("com.my.weather", "com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);
And I got the error message:
E/AndroidRuntime(14068): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.test/com.my.test.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.my.weather/.WeatherService }
How can I solved this issue?
Other apk is use the Messenger method to communication with weather service.
================================================================================
Thanks all!
Now I modify my weather service’s AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.weather"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<service
android:name=".WeatherService"
android:exported="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.my.weather.WeatherService"></action>
</intent-filter>
</service>
</application>
</manifest>
And I use this method to start:
Intent service = new Intent("com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);
Then I got the warning message:
W/ActivityManager(131): Unable to start service Intent { act=com.my.weather.WeatherService }: not found
Here says from documentation:
Also note that the name
remotechosen here is arbitrary, and you can use other names if you want additional processes. The:prefix appends the name to your package’s standard process name. With that done, clients can now bind to the service and send messages to it. Note that this allows clients to register with it to receive messages back as well.Edit1:
Second, if the service element (in manifest) contains an action string, use it. For example if your service declared like this:
So do this in
onCreate()method of your service:I saw that in this question:
Unable to start Service Intent
Edit2:
I saw your manifest again.It seems that your manifest has no
Main/Launcher Activity.Inandroid 3.1 and laterit causes no service be available.In fact forsecurityreason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by userand this needs to a Main/Launcher Activity.So you have to add such Activity to your App and be care that it has already been performed.