Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start Service-only Android app

I am creating an 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.

like image 947
Anurag Uniyal Avatar asked Jun 13 '09 07:06

Anurag Uniyal


People also ask

Can we start service without activity?

It's not possible to have a Service on its own as a stand-alone "app". It needs to be started manually by a user through an Activity .

Can we start a service without activity in Android?

You start a service by passing an intent. Default Services have a higher priority that background activity. A service has its own context. To wake it self up, you need to implement a broadcast receiver.

How do you run the service even after killing the application in Android?

First, the easiest way to do what you're trying to do is to launch an Android Broadcast when the app is killed manually, and define a custom BroadcastReceiver to trigger a service restart after that. Dear Dr Sabri Allani, If your Service is started by your app then actually your service is running on main process.


3 Answers

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.

like image 126
snctln Avatar answered Oct 02 '22 15:10

snctln


Return START_STICKY in Service.onStartCommand

Android will restart your service

like image 20
shaobin0604 Avatar answered Oct 02 '22 14:10

shaobin0604


I'm researching on the same issue. Here's is what I've found: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

That simple little demo shows a solution by playing a little bit of ping-pong between a BroadcatReceiver and a Service. The Receiver is registered to start at boot time by registering in the Manifest to receive ACTION_BOOT_COMPLETED. It just starts a service when receviving ACTION_BOOT_COMPLETED. The Service in turn registeres the BroadcastReceiver then for the ACTION_TIME_TICK.

The app logic will be implemented in the BroadcastReceiver.

like image 1
jboi Avatar answered Oct 02 '22 14:10

jboi