栗子:
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, DisplayMessageActivity.class);
startActivity(intent);//启动一个Activity
}
}
1.frameworks/base/core/java/android/app/Activity.java
<1>.public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
<2>.注意:这里继承关系: Activity —-—> ContextThemeWrapper ——> ContextWrapper ——> Context
————>public class Activity extends ContextThemeWrapper{}
————>public class ContextThemeWrapper extends ContextWrapper{}
————>public class ContextWrapper extends Context {}
<3>.在frameworks/base/core/java/android/content/Context.java中定义抽象方法startActivity()
public abstract void startActivity(@RequiresPermission Intent intent);
并且在frameworks/base/core/java/android/app/ContextImpl.java中实现了startActivity()抽象方法.
public void startActivity(Intent intent) {
mMainThread.getInstrumentation().execStartActivity();
}
2.frameworks/base/core/java/android/app/Instrumentation.java
public ActivityResult execStartActivity(){
int result = ActivityManagerNative.getDefault().startActivity();
}
3.frameworks/base/core/java/android/app/ActivityManagerNative.java
<1>.static public IActivityManager getDefault(){
return gDefault.get();
}
<2>.private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>(){
IBinder b = ServiceManager.getService("activity");
IActivityManager am = asInterface(b);
return am;
}
4.frameworks/base/core/java/android/os/ServiceManager.java
public static void getService(String name, IBinder service){
}
<1>.public static IBinder getService(String name) {
return getIServiceManager().getService(name);
}
<2>.private static IServiceManager getIServiceManager() {
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
return sServiceManager;
}
5.frameworks/base/core/java/com/android/internal/os/BinderInternal.java
public static final native IBinder getContextObject();//jni函数
6.frameworks/base/core/jni/android_util_Binder.cpp
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz){
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}
7.frameworks/native/libs/binder/ProcessState.cpp
<1>.sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/){
//这里参数为0,就是ServiceManager的binder handle值。所以这里你给个0,就返回给你servicemanager的Binde
通过AMS分析Binder流程(Java到Kernel)
最新推荐文章于 2023-08-27 20:25:07 发布
本文详细探讨了Android系统中Binder通信机制的工作流程,从Java层的接口调用一直深入到Kernel层面的交互。通过AMS(Activity Manager Service)为例,展示了Binder如何在应用进程和系统服务之间传递消息,涉及IPC、代理对象、binder驱动等多个关键环节。
摘要由CSDN通过智能技术生成