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)