Service和IntentService之间的区别

时间:2016-07-18 11:07:32

标签: android service android-service intentservice android-intentservice

要知道Android中IntentService和Service之间的区别,我创建了下面发布的IntentService类的小测试。可以使用启动IntentService类 startService(intent);将导致调用nStartCommand(Intent intent,int flags,int startId)。还要将值从IntentService类发送到MainActivity 例如,我们应该通过sendBroadcast(intent);发送它,MainActivity应该为该操作注册broadcastReceiver,以便它可以接收通过

发送的值
sendBroadcast(intent);

到目前为止,我看不到Service和IntentService之间的任何区别!由于它们在启动它们的方式和它们广播数据的方式上是相似的,你能否请告诉我 他们的背景不同?

请告诉我为什么我会收到这些错误以及如何解决这些错误

MainActivity

public class MainActivity extends AppCompatActivity {

    private final String TAG = this.getClass().getSimpleName();

    private Button mbtnSend = null;
    private int i = 0;

    private BroadcastReceiver mBCR_VALUE_SENT = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (action.equals(MyIntentService.INTENT_ACTION)) {
                int intnetValue = intent.getIntExtra(MyIntentService.INTENT_KEY, -1);
                Log.i(TAG, SubTag.bullet("mBCR_VALUE_SENT", "intnetValue: " + intnetValue));
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerReceiver(this.mBCR_VALUE_SENT, new IntentFilter(MyIntentService.INTENT_ACTION));

        this.mbtnSend = (Button) findViewById(R.id.btn_send);
        this.mbtnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MyIntentService.class);
                intent.putExtra("intent_key", ++i);
                startService(intent);
            }
        });
    }
}

MyIntentService

public class MyIntentService extends IntentService {

private final String TAG = this.getClass().getSimpleName();
public final static String INTENT_ACTION = "ACTION_VALUE_SENT";
public final static String INTENT_KEY = "INTENT_KEY";

public MyIntentService() {
    super(null);
}

/**
 * Creates an IntentService.  Invoked by your subclass's constructor.
 *
 * @param name Used to name the worker thread, important only for debugging.
 */
public MyIntentService(String name) {
    super(name);
    setIntentRedelivery(true);
}

@Override
public void onCreate() {
    super.onCreate();
    Log.w(TAG, SubTag.msg("onCreate"));
}

@Override
protected void onHandleIntent(Intent intent) {
    Log.w(TAG, SubTag.msg("onHandleIntent"));

    int intent_value = intent.getIntExtra("intent_key", -1);
    Log.i(TAG, SubTag.bullet("", "intent_value: " + intent_value));

    Intent intent2 = new Intent();
    intent2.setAction(MyIntentService.INTENT_ACTION);
    intent2.putExtra(MyIntentService.INTENT_KEY, intent_value);
    sendBroadcast(intent2);

    SystemClock.sleep(3000);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.w(TAG, SubTag.msg("onStartCommand"));

    return super.onStartCommand(intent, flags, startId);
}

2 个答案:

答案 0 :(得分:0)

简而言之,服务是开发人员设置后台操作的更广泛的实现,而IntentService对于“即发即弃”操作非常有用,负责后台线程的创建和清理。

来自文档:

服务服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行较长时间运行的操作,或者为其他应用程序提供要使用的功能。

IntentService Service是IntentService Services的基类,可根据需要处理异步请求(表示为Intents)。客户端通过startService(Intent)调用发送请求;服务根据需要启动,使用工作线程依次处理每个Intent,并在工作失败时自行停止。

请参阅此文档 - http://developer.android.com/reference/android/app/IntentService.html

答案 1 :(得分:0)

服务

这是所有服务的基类。扩展此类时,重要的是创建一个新线程来执行所有服务的工作,因为默认情况下,该服务使用应用程序的主线程,这可能会降低应用程序运行的任何活动的性能。

IntentService

这是Service的子类,它使用工作线程来处理所有启动请求,一次一个。如果您不要求您的服务同时处理多个请求,这是最佳选择。您需要做的就是实现onHandleIntent(),它接收每个启动请求的意图,以便您可以完成后台工作。

以下是Android中Service和IntentService之间的一些主要区别。

1)何时使用?

该服务可用于没有UI的任务,但不应太长。如果需要执行长任务,则必须使用Service中的线程。

IntentService可用于长任务,通常不与主线程通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调(Intent触发任务)。

2)如何触发?

触发服务调用方法onStartService()。

使用Intent触发IntentService,它会生成一个新的工作线程,并在此线程上调用onHandleIntent()方法。

为了更清楚,请参阅此内容 http://www.onsandroid.com/2011/12/difference-between-android.html