android 源码中的回调

     1.要实现一个回调,一般需要三个类: 定义接口类、实现接口类、设置触发接口类;
     2.在android中,回调是经常用到的,例如view的点击事件以及各种监听事件。还是如Activity中的生命周期的那六个方法,我们都不是显示的调用 ,其实这都是回调,

      先看最常近的onClicklistener

(1) alps\frameworks\base\core\java\android\view\View.java

    (1.1)先定义接口

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

(1.2) 声明接口对象

        /**
         * Listener used to dispatch click events.
         * This field should be made private, so it is hidden from the SDK.
         * {@hide}
         */
        public OnClickListener mOnClickListener;

(1.3)   赋值接口实例类的变量与接口对象 (注册回调)

    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

(1.4 )接口实现类(实现回调函数) packages\apps\Settings\src\com\android\settings\SettingsActivity.java  

                Button backButton = (Button)findViewById(R.id.back_button);
                backButton.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        setResult(RESULT_CANCELED, null);
                        finish();
                    }
                });
                Button skipButton = (Button)findViewById(R.id.skip_button);
                skipButton.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        setResult(RESULT_OK, null);
                        finish();
                    }
                });

(1.5)触发回调函数 frameworks\base\core\java\android\view\View.java

    public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            if (DBG_TOUCH) {
                Log.d(VIEW_LOG_TAG, "(View)performClick, listener = " + li.mOnClickListener
                        + ",this = " + this);
            }
            li.mOnClickListener.onClick(this);//触发回调函数
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        notifyEnterOrExitForAutoFillIfNeeded(true);

        return result;
    }

 (2)再来看看 Activity.java的onCreate()的回调

  (2.0)frameworks\base\core\java\android\app\ActivityThread.java::handleLaunchActivity()

 // Initialize before creating the activity
        WindowManagerGlobal.initialize();

        Activity a = performLaunchActivity(r, customIntent);

   (2.1)performLaunchActivity()

                activity.mCalled = false;
                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }

    (2.2) 这里有必要多说一句,这activity是怎么来的,此 activity并不是直接通过方法的参数直接传入的,performLaunchActivity方法的两个参数类型分别是ActivityClientRecord r, Intent customIntent,此处activity而是通过java的反射机制生成,如下

        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;//声明一个activity变量,但并未初始化赋值
        try {
            java.lang.ClassLoader cl = appContext.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess();
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {
            if (!mInstrumentation.onException(activity, e)) {
                throw new RuntimeException(
                    "Unable to instantiate activity " + component
                    + ": " + e.toString(), e);
            }
        }

 (2.3) frameworks\base\core\java\android\app\Instrumentation.java::callActivityOnCreate()

    public void callActivityOnCreate(Activity activity, Bundle icicle) {
        prePerformCreate(activity);
        activity.performCreate(icicle);//进入activity类
        postPerformCreate(activity);
    }

(2.3)\frameworks\base\core\java\android\app\Activity.java::performCreate()

    final void performCreate(Bundle icicle) {
        restoreHasCurrentPermissionRequest(icicle);
        onCreate(icicle);//回调OnCreate()方法
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

(备注activity启动流程)

 java.lang.Exception
      at com.example.androidtestproject.MainActivity.onCreate(MainActivity.java:20)//app的MainActivity类
      at android.app.Activity.performCreate(Activity.java:6975)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2844)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2969)
      at android.app.ActivityThread.-wrap11(Unknown Source:0)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1658)
      at android.os.Handler.dispatchMessage(Handler.java:108)
      at android.os.Looper.loop(Looper.java:206)
      at android.app.ActivityThread.main(ActivityThread.java:6733)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值