Service와 IntentService의 차이점
7514 단어 면접 총결산
그러면 우리가 작성한 시간 소모 논리가 서비스에 의해 관리될 수밖에 없을 때 Intent Service를 도입해야 한다. Intent Service는 서비스를 계승하는 것이다. 그러면 서비스의 모든 특성을 포함하고 서비스의 생명 주기도 포함한다. 서비스와 달리 Intent Service는 onCreate 작업을 수행할 때 내부에 하나의 라인을 열었다.가서 시간 소모된 조작을 실행해라.
IntentService는Handler looper message를 통해 다중 스레드 작업을 수행하는 동시에 시간 소모 작업도 이 스레드에 의해 관리되고 실행되며 ANR이 발생하지 않습니다.
-------------------------------------------------------------
Service
Service는 백그라운드에서 장기간 실행되는 애플리케이션 구성 요소입니다.
서비스는 별도의 프로세스가 아니며 응용 프로그램과 같은 프로세스에 있고 서비스도 하나의 스레드가 아니기 때문에 스레드와 아무런 관계가 없기 때문에 시간 소모 작업을 직접 처리할 수 없습니다.만약 직접 시간 소모 조작을 서비스의onStartCommand () 에 두면 ANR을 일으키기 쉽다.만약 시간이 소모되는 조작이 있다면 반드시 단독 라인을 열어 처리해야 한다.
IntentService
IntentService는 서비스에서 계승되고 비동기 요청을 처리하는 클래스로 IntentService에서 작업 스레드가 있어 시간 소모 작업을 처리하고 IntentService를 시작하는 방식은 전통적인 서비스를 시작하는 것과 같으며 작업이 끝난 후에 IntentService는 자동으로 멈추며 우리가 수동으로 제어할 필요가 없다.또한 Intent Service를 여러 번 시작할 수 있으며, 모든 소모 시간은 작업 대기열의 방식으로 Intent Service의 onHandle Intent 리셋 방법에서 실행되며, 매번 하나의 작업 라인만 실행하고, 첫 번째 라인을 실행하고 두 번째 라인만 실행합니다.
또한 모든 요청이 하나의 단일 스레드에 있으므로 애플리케이션의 주 스레드(UI Thread)를 차단하지 않으며 같은 시간에 하나의 요청만 처리합니다.Intent Service를 사용하면 어떤 이점이 있습니까?우선, 우리는 서비스에서 수동으로 라인을 켜는 번거로움을 없앴고, 둘째, 작업이 끝났을 때, 우리는 수동으로 서비스를 멈추지 않아도 된다.
Service 및 IntentService 처리 시간 소모 작업 비교 결과
service:
public class MyService2 extends Service {
private static final String TAG = "MyService2";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
LogUtil.e(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtil.e(TAG, "onStartCommand");
// service
new Thread(new Runnable() {
@Override
public void run() {
LogUtil.e(TAG, "onStartCommand");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LogUtil.e(TAG, " ");
}
});
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
LogUtil.e(TAG, "onDestroy");
}
}
만약 onStartCommand에서 라인을 열지 않고 직접 시간 소모 조작을 지원한다면, 시간이 짧기 때문에: Skipped 60 프레임스! The application may be doing too much work on its main thread.
intentService:
public class MyIntentService2 extends IntentService {
private static final String TAG = "MyIntentService2";
public MyIntentService2() {
super("MyIntentService2"); //
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
// ,IntentService
//IntentService Intent , worker thread( ) Intent
// startService ,IntentService
LogUtil.e(TAG, "onStart");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LogUtil.e(TAG, " ");
}
@Override
public void onDestroy() {
super.onDestroy();
LogUtil.e(TAG, "onDestroy");
}
}
servicedemoActivity
@OnClick({R.id.button, R.id.button2, R.id.button3, R.id.button4})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button:
// ANR
startService(new Intent(this, MyService2.class));
break;
case R.id.button2:
stopService(new Intent(this, MyService2.class));
break;
case R.id.button3:
// IntentService, ,
//
// ( IntentService )
startService(new Intent(this, MyIntentService2.class));
startService(new Intent(this, MyIntentService2.class));
break;
case R.id.button4:
//
break;
}
}
인쇄 결과:
start Service가 시작하는 서비스이기 때문에android 시스템이 종료되지 않고stop 서비스 방법을 주동적으로 호출하지 않으면 서비스는 백엔드에서 계속 실행됩니다.
서비스를 시작하려는Activity가 종료될 때 서비스도 함께 종료됩니다. 서비스와Activity를 귀속시켜야 합니다.bindService
05-28 14:54:01.105 8224-8224/com.sdhmw.com.mystudy E/MyService2: onCreate
05-28 14:54:01.105 8224-8224/com.sdhmw.com.mystudy E/MyService2: onStartCommand
05-28 14:56:52.015 8224-8224/com.sdhmw.com.mystudy D/ViewRootImpl: ViewPostImeInputStage processPointer 0
05-28 14:56:52.095 8224-8224/com.sdhmw.com.mystudy D/ViewRootImpl: ViewPostImeInputStage processPointer 1
05-28 14:56:52.095 8224-8224/com.sdhmw.com.mystudy E/MyService2: onDestroy
05-28 14:57:22.205 8224-16273/com.sdhmw.com.mystudy E/MyIntentService2: onStart
05-28 14:57:23.205 8224-16273/com.sdhmw.com.mystudy E/MyIntentService2:
05-28 14:57:23.205 8224-16273/com.sdhmw.com.mystudy E/MyIntentService2: onStart
05-28 14:57:24.205 8224-16273/com.sdhmw.com.mystudy E/MyIntentService2:
05-28 14:57:24.205 8224-8224/com.sdhmw.com.mystudy E/MyIntentService2: onDestroy
IntentService, ,
( IntentService )
IntentService , 。
bindService 반환 키 Activity가 꺼질 때 자동으로 꺼짐:
05-28 15:21:26.295 7203-7203/com.sdhmw.com.mystudy E/MyService2: onCreate
05-28 15:21:26.295 7203-7203/com.sdhmw.com.mystudy E/MyService2: BinderStart
05-28 15:21:26.295 7203-7203/com.sdhmw.com.mystudy E/ServiceDemoActivity: onServiceConnected name:ComponentInfo{com.sdhmw.com.mystudy/com.sdhmw.com.mystudy.MyService2}
05-28 15:21:26.295 7203-7203/com.sdhmw.com.mystudy E/ServiceDemoActivity: onServiceConnected service:com.sdhmw.com.mystudy.MyService2$MyBinder@b888e6a
05-28 15:21:32.105 7203-7203/com.sdhmw.com.mystudy D/ViewRootImpl: ViewPostImeInputStage processKey 0
05-28 15:21:32.185 7203-7203/com.sdhmw.com.mystudy D/ViewRootImpl: ViewPostImeInputStage processKey 1
05-28 15:21:32.625 7203-7203/com.sdhmw.com.mystudy D/ViewRootImpl: #3 mView = null
05-28 15:21:32.635 7203-7203/com.sdhmw.com.mystudy E/MyService2: onDestroy
서비스 안의 onstart () 방법과 onStart Command () 방법의 차이
참조:https://blog.csdn.net/kuangren_01/article/details/9427839
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Service와 IntentService의 차이점그러면 우리가 작성한 시간 소모 논리가 서비스에 의해 관리될 수밖에 없을 때 Intent Service를 도입해야 한다. 서비스와 달리 Intent Service는 onCreate 작업을 수행할 때 내부에 하나의 라...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.