views:

6100

answers:

4

I am creating a application whose only component is a service which keeps on running in background (basically a proxy server) but I am not able to find a way how to start that service. Application can not have any UI or user interaction so I am not using Activity. Broadcast receiver can listen to BOOT broadcast but how do I start service first time when it is installed and how can I keep it running? or is there a broadcast which I can listen after app is installed e.g. may be TIME_TICK but that has to be registered from activity i think

A: 

"which keeps on running in background (basically a proxy server) but I am not able to find a way how to start that service"

Bear in mind that services can be terminated as needed at will by Android.

"Broadcast receiver can listen to BOOT broadcast but how do I start service first time when it is installed and how can I keep it running?"

Have the BroadcastReceiver call startService() on the service. That will start it running. Eventually, the phone will fall asleep (CPU stops by service is still in RAM), and eventually Android will terminate your process for one reason or another (e.g., low on RAM).

If you can find a way to get by with a scheduled task, AlarmManager is a better answer:

http://androidguys.com/?p=4411

CommonsWare
how will BroadcastReceiver.onRecieve be called unless user restarts the phone, so how can i start service on first time installtion
Anurag Uniyal
for keeping service up, i am running two services which track each other and start each other if needed, will that work?
Anurag Uniyal
It could, but it's unnecessary. If Android kills a service it will automatically restart it once the resources become available - so there's no need to manually restart it.
Reto Meier
+6  A: 

Unfortunately right now there is no reliable way to receive a broadcast event after your applicaiton has been installed, the ACTION_PACKAGE_ADDED Intent does not broadcast to the newly installed package.

You will have to have a broadcast receiver class as well as your service in order to receive the ACTION_BOOT_COMPLETED event. I would also recommend adding the ACTION_USER_PRESENT intent to be caught by that broadcast receiver, this requires Android 1.5 (minSDK=3), this will call your broadcast receiver whenever the user unlocks their phone. The last thing that you can do to try to keep your service running without having it easily be shut down automatically is to call Service.setForeground() in your service onCreate to tell Android that your service shouldn't be stopped, this was added mainly for mp3 player type services that have to keep running but can be used by any service.

Make sure you add the proper permissions for the boot_complete and user_present events in you manifest.

Here is a simple class that you can use as a broadcast receiver for the events.

package com.snctln.util.WeatherStatus;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class WeatherStatusServiceReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
     if(intent.getAction() != null)
     {
      if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
          intent.getAction().equals(Intent.ACTION_USER_PRESENT))
      {
       context.startService(new Intent(context, WeatherStatusService.class));
      }
     }
    }
};

Good luck.

snctln
Good advice. One thing about Service.setForeground(): it no longer works in Android 2.0+. All "long-lived" services are now required to have a persistent notification in the notification area while they're running. Example here: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html
Jarett
A: 

return START_STICKY in Service.onStartCommand

Android will restart your service

shaobin0604
START_STICKY is valid only for Android 2.0+
cow
A: 

How do you return START_STICKY?

john