I write an android service of get weather, and the AndroidManifest.xml is:
Here says from documentation:
If we want to make this service run in a remote process (instead of the standard one for its .apk), we can use
android:process
in its manifest tag to specify one:<service android:name=".app.MessengerService" android:process=":remote" />
Also note that the name remote
chosen 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:
<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>
So do this in onCreate()
method of your service:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent=new Intent("com.sample.service.serviceClass");
this.startService(intent);
}
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
.In android 3.1 and later
it causes no service be available.In fact for
security
reason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by user
and 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.
I had the same problem. For me the problem was that I first installed the app using the API and then app that provided the API. Uninstalling/Reinstalling the first app solved the problem.
Update: To avoid the problem both apps should define the permission in their manifest.
When you call bindService for a remote service, you should set your packageName too.
Intent intent = new Intent("com.my.weather.WeatherService");
intent.setPackage("com.my.weather");
bindService(intent, serConn, Context.BIND_AUTO_CREATE);
My problem was solved by David Wasser in a comment so I thought I share.
In the Manifest you can set exported attribute to true. This makes the service accessible to other apps.
Manifest.xml
<service android:name=".MyUsefulService_"
android:exported="true"/>
MyActivity.java
Intent intent = new Intent();
intent.setComponent(new ComponentName("jav.android.app",jav.android.app.MyUsefulService_");
bindService(this,MyServiceConnection,0);
In ur activity class do ... suppose BothButton is Activity class name and CleverTexting is Service class name, And u want to call an activity from a service and than service from activity . If ur code is working fine in more than 4.0 android version than u can do like this there will not be any problem.
CleverTexting mService ;
public void setService(CleverTexting listener) {
// TODO Auto-generated method stub
mService = listener;
}
and in ur Service class do... where u want to call ur activity
BothButton mBothButton;
mBothButton = new BothButton(this);
mBothButton.setService(this);
Add an intent-filter with an action to your WeatherService:
<service
android:name=".WeatherService"
android:exported="true" >
<intent-filter>
<action android:name="this.is.my.custom.ACTION" />
</intent-filter>
</service>
Then, when you go to bind with bindService() in your other app, use this intent:
new Intent("this.is.my.custom.ACTION")