IntentService stopSelf 为什么要所有的事务处理完成之后才能stop service

在IntentService 中 处理完onHandleIntent会调用stopSelf

    private final class ServiceHandler extends Handler {        public ServiceHandler(Looper looper) {            super(looper);        }        @Override        public void handleMessage(Message msg) {            onHandleIntent((Intent)msg.obj);            stopSelf(msg.arg1);        }    }
    /**     * Old version of {@link #stopSelfResult} that doesn't return a result.     *       * @see #stopSelfResult     */    public final void stopSelf(int startId) {        if (mActivityManager == null) {            return;        }        try {        //调用AMS stopService            mActivityManager.stopServiceToken(                    new ComponentName(this, mClassName), mToken, startId);        } catch (RemoteException ex) {        }    }
    @Override    public boolean stopServiceToken(ComponentName className, IBinder token,            int startId) {        synchronized(this) {            return mServices.stopServiceTokenLocked(className, token, startId);        }    }
  boolean stopServiceTokenLocked(ComponentName className, IBinder token,            int startId) {        if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "stopServiceToken: " + className                + " " + token + " startId=" + startId);        ServiceRecord r = findServiceLocked(className, token, UserHandle.getCallingUserId());        if (r != null) {            if (startId >= 0) {                // Asked to only stop if done with all work.  Note that                // to avoid leaks, we will take this as dropping all                // start items up to and including this one.                ServiceRecord.StartItem si = r.findDeliveredStart(startId, false, false);                if (si != null) {                    while (r.deliveredStarts.size() > 0) {                        ServiceRecord.StartItem cur = r.deliveredStarts.remove(0);                        cur.removeUriPermissionsLocked();                        if (cur == si) {                            break;                        }                    }                }                if (r.getLastStartId() != startId) {//这里如果startid不知最新的就不stop                    return false;                }                if (r.deliveredStarts.size() > 0) {                    Slog.w(TAG, "stopServiceToken startId " + startId                            + " is last, but have " + r.deliveredStarts.size()                            + " remaining args");                }            }            synchronized (r.stats.getBatteryStats()) {                r.stats.stopRunningLocked();            }            r.startRequested = false;            if (r.tracker != null) {                r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),                        SystemClock.uptimeMillis());            }            r.callStart = false;            final long origId = Binder.clearCallingIdentity();            bringDownServiceIfNeededLocked(r, false, false);            Binder.restoreCallingIdentity(origId);            return true;        }        return false;    }

首先service在启动的时候, 会从AMS中传startId 的参数

    @Override    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {        onStart(intent, startId);        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;    }

如果一个每次在startService是会调用ActiveService.java 中的
realStartServiceLocked接口,

        // If the service is in the started state, and there are no        // pending arguments, then fake up one so its onStartCommand() will        // be called.        if (r.startRequested && r.callStart && r.pendingStarts.size() == 0) {            r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),                    null, null, 0));        }

ServiceRecord.java

    public int makeNextStartId() {        lastStartId++;        if (lastStartId < 1) {            lastStartId = 1;        }        return lastStartId;    }

更多相关文章

  1. android - Jni 接口函数表
  2. android Activity 和 Service 之间 传参数
  3. android 获取本应用详细系统参数
  4. 【译】Android 6.0接口变化(二)(Android 6.0 Changes)
  5. android camera相机相关参数
  6. Android,使用Intent或Bundle传递参数,跳转页面。
  7. 获取Android各类系统相关信息的接口实现代码
  8. Android 数据查询query函数参数解析
  9. 获取android手机内部存储空间和外部存储空间的参数 && 如何决定

随机推荐

  1. android如何查看app的内存占用情况
  2. 【原创】Android学习历程..持续中
  3. Android中ContextMenu用法实例
  4. Android拓展系列(9)--Android视频录制scr
  5. android绘制几何图形
  6. EditText 光标不显示问题
  7. android拍照上传的效果是如何实现的
  8. Android开发问题 - Some projects cannot
  9. Android(安卓)生成不同服务器配置,不同APP
  10. Android 异常处理:java.lang.IllegalArgum