Service와 IntentService의 차이점

7514 단어 면접 총결산
Android의 서비스는 백엔드 서비스에 사용되는 것이다. 응용 프로그램이 백엔드에 걸렸을 때 응용 프로그램의 일부 구성 요소가 여전히 작동할 수 있도록 서비스라는 개념을 도입했다. 그러면 이 개념에서 강조하고자 하는 것은 서비스라는 독립된 프로세스도 독립된 프로세스도 아니고 응용 프로그램의 메인 라인에 의존하는 것이다. 즉,Service에서 많은 시간을 소모하는 논리와 조작을 작성하는 것을 권장하지 않습니다. 그렇지 않으면 ANR을 일으킬 수 있습니다.
그러면 우리가 작성한 시간 소모 논리가 서비스에 의해 관리될 수밖에 없을 때 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

좋은 웹페이지 즐겨찾기