-1

Чтобы узнать разницу между IntentService и службой на Android, я создал ниже проведенный небольшой тест класса IntentService. Класс IntentService можно запустить с помощью startService(intent);, что приведет к вызову nStartCommand (Intent intent, int flags, int startId). Кроме того, чтобы отправить значение из класса IntentService к MainActivity для примера, мы должны послать его через sendBroadcast(intent); и MainActivity должно зарегистрировать BroadcastReceiver для этого действия, поэтому он может принимать значения, отправленные черезРазница между сервисом и IntentService

sendBroadcast(intent); 

до сих пор я не вижу различий между Сервисом и 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); 
} 
+0

Главное различие, что '' обслуживания работает на том же потоке, в котором он был вызван. И «IntentService» работает над фоновым потоком – xAqweRx

ответ

0

Короче говоря, служба является более широкая реализация для разработчика для создания фоновых операций, в то время как IntentService полезен для операций «огонь и забыть», заботясь о создании и очистке фона.

Из документов:

Сервис А Сервис является компонент приложения, представляющий желание либо приложения для выполнения более длительного хода операции при этом не взаимодействуя с пользователем, либо предоставить функциональные возможности для других приложений для использования.

IntentService Service является базовым классом для служб IntentService, которые обрабатывают асинхронные запросы (выраженные как намерения) по требованию. Клиенты отправляют запросы через вызовы startService (Intent); служба запускается по мере необходимости, обрабатывает каждое намерение по очереди с использованием рабочего потока и останавливается, когда заканчивается работа.

См этот документ - http://developer.android.com/reference/android/app/IntentService.html

0

Service

Это базовый класс для всех услуг. Когда вы расширяете этот класс, важно создать новый поток, в котором будет выполняться вся работа службы, поскольку служба использует основной поток вашего приложения по умолчанию, что может замедлить работу любой активности вашего приложения.

IntentService

Это подкласс услуг, который использует рабочий поток для обработки всех запросов, начинают по одному. Это лучший вариант, если вы не требуете, чтобы ваша служба обрабатывала несколько запросов одновременно. Все, что вам нужно сделать, это реализовать onHandleIntent(), который получает намерение для каждого запроса на запуск, чтобы вы могли выполнять фоновое задание.

Ниже перечислены некоторые основные различия между сервисом и IntentService в Android.

1) Когда использовать?

Служба может использоваться в задачах без пользовательского интерфейса, но не должна быть слишком длинной. Если вам нужно выполнять длительные задачи, вы должны использовать потоки в службе.

IntentService может использоваться в длинных задачах, обычно без связи с главной нитью. Если требуется связь, можно использовать обработчик Main Thread или трансляцию. Другой случай использования - когда требуются обратные вызовы (запущенные задачи Intent).

2) Как запускать?

Служба запускается при вызове метода onStartService().

IntentService запускается с использованием намерения, он порождает новый рабочий поток, и метод onHandleIntent() вызывается в этом потоке.

для большей ясности передать этот http://www.onsandroid.com/2011/12/difference-between-android.html

+0

в точке № 1, вы заявили, что в службе один из них не может манипулировать потоком пользовательского интерфейса ... возможно в Intentservice? – user2121

+0

обе не имеют связи с пользовательским интерфейсом. но при необходимости в сервисе намерения мы должны использовать обработчик Main Thread или трансляцию. –

+0

Я вижу много общего в вашем ответе на [этот] (https://stackoverflow.com/a/15772151/1364007). Не могли бы вы использовать подсветку цитаты (путем запуска строки с '>'), чтобы показать, какие строки являются вашими словами, а какие строки были скопированы/вставлены? Это предотвратит возможность других людей обвинять вас в плагиате. –

 Смежные вопросы

  • Нет связанных вопросов^_^