/**
 * Copyright (C) 2010-2016 eBusiness Information, Excilys Group
 * Copyright (C) 2016-2020 the AndroidAnnotations project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed To in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.androidannotations.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <p>
 * Should be used on a method that must respond to a specific action in an
 * {@link EIntentService} annotated class. The method name will be used as
 * action name unless the {@link #value()} field is set.
 * </p>
 * <p>
 * The method signature (ie with attributes) will be a part of the IntentBuilder
 * generated for the {@link EIntentService}.
 * </p>
 * <p>
 * The method could contain any type or parameters.
 * </p>
 * <p>
 * The class MAY contain several {@link ServiceAction} annotated methods.
 * </p>
 * <blockquote>
 * 
 * Example :
 * 
 * <pre>
 * &#064;EActivity(R.layout.main)
 * public class MyActivity extends Activity {
 * 
 * 	public void launchAction() {
 * 		// Note the use of generated class instead of original one
 * 		MyIntentService_.intent(this)
 * 				.&lt;b&gt;myAction&lt;/b&gt;("test", 10L)
 * 				.start();
 * 	}
 * 
 * }
 * 
 * &#064;EIntentService
 * public class MyIntentService extends IntentService {
 * 
 * 	&#064;ServiceAction
 * 	void mySimpleAction() {
 * 		// ...
 * 	}
 * 
 * 	&#064;ServiceAction
 * 	void &lt;b&gt;myAction&lt;/b&gt;(String valueString, long valueLong) {
 * 		// ...
 * 	}
 * 
 * 	&#064;Override
 * 	protected void onHandleIntent(Intent intent) {
 * 	 	// empty, will be overridden in generated subclass 	
 * 	}
 * }
 * </pre>
 * 
 * </blockquote>
 * 
 * <p>
 * Note: Since
 * {@link android.app.IntentService#onHandleIntent(android.content.Intent)
 * IntentService#onHandleIntent} is abstract, you have to add an empty
 * implementation. For convenience, we provide the
 * {@link org.androidannotations.api.support.app.AbstractIntentService
 * AbstractIntentService} class, which implements that method, so you do not
 * have to do in your actual class if you derive it.
 * </p>
 * <p>
 * Use on any native, {@link android.os.Parcelable Parcelable} or
 * {@link java.io.Serializable Serializable} field in an {@link EService}
 * annotated class to bind it with Android's arguments. If
 * <a href="http://parceler.org">Parceler</a> is on the classpath, extras
 * annotated with &#064;Parcel, or collections supported by Parceler will be
 * automatically marshaled using a {@link android.os.Parcelable Parcelable}
 * through the Parcels utility class.
 * </p>
 * 
 * @see EIntentService
 * @see org.androidannotations.api.support.app.AbstractIntentService
 *      AbstractIntentService
 */
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface ServiceAction {

	/**
	 * Define the action's name. If this field isn't set the annotated method name
	 * will be used.
	 * 
	 * @return the name of the action
	 */
	String value() default "";

}
