IntentService的使用

TigerJin發表於2021-09-09

 在安卓實際開發中,我們經常會遇到一些耗時操作,如請求網路,儲存,android 提供了AsyncTask,可是這種不好的地方

 有些同學可能認為一個在Activity中的AsyncTask會隨著Activity的銷燬而銷燬。但AsyncTask會一直執行doInBackground()方法直到方法執行結束。一旦上述方法結束,會依據情況進   行不同的操作。

 •如果cancel(boolean)呼叫了,則執行onCancelled(Result)方法

 •如果cancel(boolean)沒有呼叫,則執行onPostExecute(Result)方法

所以activity的ondestroy()必須cancle掉asyncTask的任務

private InitDataAsyncTask mInitDataAsyncTask;

private class InitDataAsyncTask extends AsyncTask<Void,Void,Void> {

    @Override
    protected Void doInBackground(Void... params) {
        fetchDataFromDataBase();
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        mTipView.hideView();
        updateHealthLayout();
        initAdapterForFragment();
    }
}

public void ondestroy(){
    super.ondestroy();
    if(mInitDataAsyncTask != null) {
        mInitDataAsyncTask.cancel(true);
    }
}

所以不需要執行回撥的情況下使用intentService是非常合適的

IntentService是繼承並處理非同步請求的一個類,在IntentService內有一個工作執行緒來處理耗時操作,啟動IntentService的方式和啟動傳統的Service一樣,同時,當任務執行完後,IntentService會自動停止,而不需要我們手動去控制或stopSelf()。另外,可以啟動IntentService多次,而每一個耗時操作會以工作佇列的方式在IntentService的onHandleIntent回撥方法中執行,並且,每次只會執行一個工作執行緒,執行完第一個再執行第二個。Intent服務開啟後,執行完onHandleIntent裡面的任務就自動銷燬結束,透過列印的執行緒名稱可以發現是新開了一個執行緒來處理耗時操作的,即是耗時操作也可以被這個執行緒管理和執行,同時不會產生ANR的情況。

那麼如何寫一個intentService呢:

public class PedometerIntentService extends IntentService {

    private static final String SERVICE_NAME = "PedometerIntentService";
    private static final String BOOLEAN_VALUE = "boolean_value";
    private static final String INT_VALUE = "int_value";


    private static final String TAG = PedometerIntentService.class.getSimpleName();

    public PedometerIntentService() {
        super(SERVICE_NAME);
    }

    public static void startService(Context context, String action) {
        try{
            Intent intent = new Intent(action);
            intent.setClass(context,PedometerIntentService.class);
            context.startpService(intent);
        }catch (Exception ex) {
            ex.printStackTrace();
            MonitorUtil.reportError(context,ex);
        }
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent == null) return;
        int value = 0;
        try{
            switch (intent.getAction()) {
                case PemometerConstant.PEDOMETER_EXECUTE_GET_RECOMMEND_SPORT_TARGET_ACTION:
                    LogUtil.d(TAG,"pedometer_execute_get_recommend_sport_target_action task execute");
                    getRecommendSportTask();
                    break;
                case PemometerConstant.PEDOMETER_EXECUTE_GET_RED_PACKAGE_ACTION:
                    boolean shouldShowRedPackageInNotification = intent.getBooleanExtra(BOOLEAN_VALUE,false);
                    LogUtil.d(TAG,"pedometer_execute_get_red_package_target_action execute flag="+shouldShowRedPackageInNotification);
                    PedometerUtils.notifyredPackageChanged(this,shouldShowRedPackageInNotification ? 1 : 0);
                    break;
            }
        }catch (Exception ex) {
            MonitorUtil.reportError(this,ex);
            ex.printStackTrace();
        }

    }

    private void getRecommendSportTask() {
    }


}

呼叫方法是

PedometerIntentService.startService(mContext, PemometerConstant.PEDOMETER_EXECUTE_GET_RECOMMEND_SPORT_TARGET_ACTION);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2818284/,如需轉載,請註明出處,否則將追究法律責任。

相關文章