Start service in Android

AndroidServiceAndroid Activity

Android Problem Overview


I want to call a service when a certain activity starts. So, here's the Service class:

public class UpdaterServiceManager extends Service {

	private final int UPDATE_INTERVAL = 60 * 1000;
	private Timer timer = new Timer();
	private static final int NOTIFICATION_EX = 1;
	private NotificationManager notificationManager;

	public UpdaterServiceManager() {}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		// Code to execute when the service is first created
	}

	@Override
	public void onDestroy() {
		if (timer != null) {
			timer.cancel();
		}
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startid) {
		notificationManager = (NotificationManager) 
				getSystemService(Context.NOTIFICATION_SERVICE);
		int icon = android.R.drawable.stat_notify_sync;
		CharSequence tickerText = "Hello";
		long when = System.currentTimeMillis();
		Notification notification = new Notification(icon, tickerText, when);
		Context context = getApplicationContext();
		CharSequence contentTitle = "My notification";
		CharSequence contentText = "Hello World!";
		Intent notificationIntent = new Intent(this, Main.class);
		PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
				notificationIntent, 0);
		notification.setLatestEventInfo(context, contentTitle, contentText,
				contentIntent);
		notificationManager.notify(NOTIFICATION_EX, notification);
		Toast.makeText(this, "Started!", Toast.LENGTH_LONG);
		timer.scheduleAtFixedRate(new TimerTask() {

			@Override
			public void run() {
				// Check if there are updates here and notify if true
			}
		}, 0, UPDATE_INTERVAL);
		return START_STICKY;
	}

	private void stopService() {
		if (timer != null) timer.cancel();
	}
}

And here is how I call it:

Intent serviceIntent = new Intent();
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager");
startService(serviceIntent);

The problem is that nothing happens. The above code block is called at the end of the activity's onCreate. I already debugged and no exception is thrown.

Any idea?

Android Solutions


Solution 1 - Android

Probably you don't have the service in your manifest, or it does not have an <intent-filter> that matches your action. Examining LogCat (via adb logcat, DDMS, or the DDMS perspective in Eclipse) should turn up some warnings that may help.

More likely, you should start the service via:

startService(new Intent(this, UpdaterServiceManager.class));

Solution 2 - Android

startService(new Intent(this, MyService.class));

Just writing this line was not sufficient for me. Service still did not work. Everything had worked only after registering service at manifest

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
   
    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>

Solution 3 - Android

Java code for start service:

Start service from Activity:

startService(new Intent(MyActivity.this, MyService.class));

Start service from Fragment:

getActivity().startService(new Intent(getActivity(), MyService.class));

MyService.java:

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

	private static String TAG = "MyService";
	private Handler handler;
	private Runnable runnable;
	private final int runTime = 5000;

	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG, "onCreate");

		handler = new Handler();
		runnable = new Runnable() {
			@Override
			public void run() {

				handler.postDelayed(runnable, runTime);
			}
		};
		handler.post(runnable);
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onDestroy() {
		if (handler != null) {
			handler.removeCallbacks(runnable);
		}
		super.onDestroy();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return START_STICKY;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.i(TAG, "onStart");
	}

}

Define this Service into Project's Manifest File:

Add below tag in Manifest file:

<service android:enabled="true" android:name="com.my.packagename.MyService" />

Done

Solution 4 - Android

I like to make it more dynamic

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); }
private void stopMyService()  { context.stopService(new Intent(context, serviceMonitor));  }

do not forget the Manifest

<service android:enabled="true" android:name=".MyService.class" />

Solution 5 - Android

Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

add service in manifist

<service android:enabled="true" android:name="YourActivity.class" />

for running service on oreo and greater devices use for ground service and show notification to user

or use geofencing service for location update in background reference http://stackoverflow.com/questions/tagged/google-play-services

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMiguel RibeiroView Question on Stackoverflow
Solution 1 - AndroidCommonsWareView Answer on Stackoverflow
Solution 2 - AndroidVitalii KorsakovView Answer on Stackoverflow
Solution 3 - AndroidHiren PatelView Answer on Stackoverflow
Solution 4 - AndroidThiagoView Answer on Stackoverflow
Solution 5 - AndroidAsif MehmoodView Answer on Stackoverflow