android框架揭秘之Java服务学习笔记

Java应用程序服务 由Activity Manager Service进行管理
FooManager 是包装类,用来获取FooService的
IFooService.aidl会自动生成IFooService.Stub和IFooService.Stub.Proxy
BinderProxy相当于BpBinder 通过JNI到BpBinder  Binder相当于BBinder通过JavaBBinder--Binder
FooManager的foo方法-->BinderProxy.transact(),然后调用android_os_BinderProxy_transact();再调用Bpbinder的transact方法     等于少了Bp类名 和Bn类名 多了一个 服务端多了两个 一个是JavaBBinder和Binder
ServiceManager 也有ServiceManagerProxy 然后是BinderProxy    JavaBBinder
register_android_os_Binder   BinderInternal是ServiceManager


int_register_android_os_Binder注册Binder
JavaBBinder的对象在JavaBBinderHolder的get方法中创建  b = new JavaBBinder(env, mObject);
private long mObject;   调用BBinder的transact()函数将引起JavaBBinder的onTransact()函数的调用.然后在调用Binder的execTransact()方法  在c++中调用java方法时,使用CallXXXMethod 然后Binder类的ontransact方法会被调用



先由java层的Parcel的readStrongBinder然后调用c++的readStrongBinder函数和javaObjectForBinder.
生成的实例对象保存到Parcel类的mObject变量中   parcelForJavaObject函数 将java的Parcel转换为C++的Parcel
hide 不会编译进SDK中  服务继承aidl编出来的stub类
ContextImpl.java (frameworks\base\core\java\android\app)
(ACCOUNT_SERVICE.equals(name)) {
            return getAccountManager();
BinderInternal类提供获取BpBinder对象的功能.  通过其获得getContextObject方法
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
    sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
    return javaObjectForIBinder(env, b); 返回BpBinder
无论是C++中的BpServiceManager还是Java中的ServiceManager
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
和CPP还有几分相似
    static public IServiceManager asInterface(IBinder obj)
    {
        if (obj == null) {
            return null;
        }
        IServiceManager in =
            (IServiceManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }




        return new ServiceManagerProxy(obj);
    }
AIDL编译器自动生成服务接口  oneway不需要应答就可以返回
ActivityThread是Android所有应用程序的主线程
ContextImpl
            ComponentName cn = ActivityManagerNative.getDefault().startService(
                mMainThread.getApplicationThread()(主叫线程), service,
                service.resolveTypeIfNeeded(getContentResolver()));
ActivityManagerNative.getDefault()
        IBinder b = ServiceManager.getService("activity");
        gDefault = asInterface(b);
        new ActivityManagerProxy(obj);




ActivityThread对象的mAppThread变量中保存着ApplicationThread对象,ApplicationThread对象继承自ApplicationThreadNative,只在ActivityThread实例化,它负责从ams中接收binder ipc数据,通过消息队列实现对ActivityThread的控制.
ActivityThread thread = new ActivityThread();
thread.attach(false);
IActivityManager mgr = ActivityManagerNative.getDefault();
         mgr.attachApplication(mAppThread);
  ATTACH_APPLICATION_TRANSACTION
应用程序请求的服务实际是由ActivityThread生成的. attachApplication这个方法控制
attachApplication
attachApplicationLocked
realStartServiceLocked
app = mPidsSelfLocked.get(pid); zygote生成进程后,返回pid,哈希表 ProcessRecord进程关联
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用android studio 运行,下面是一个简单的文档,这个代码是一个demo 一、Activity的使用 1、SNActivity 框架最基本的activity,可调用$(SNManager)进行操作activity,具体用法请参考文档或代码 2、SNNavigationSlidingActivity 包含SNActivity的功能,继承于com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity 支持导航条和左滑视图的Activity 加载导航条: loadNavBar(int height,int background_color_id) loadNavBarResId(int height_id,int background_id) 加载左侧视图: /** * load left view * @param left_id left layout id * @param offset_value offset value * @param shadow_width_value shadow width value * @param shadow_drawable_id shadow drawable style * @param fade fade value */ loadLeft(int left_id, int offset_value, int shadow_width_value, int shadow_drawable_id, float fade) /** * load left view * @param left_id left layout id * @param offset_id offset id * @param shadow_width_id shadow width id * @param shadow_drawable_id shadow drawable id * @param fade fade value */ loadLeftResId(int left_id, int offset_id, int shadow_width_id, int shadow_drawable_id, float fade) 二、SNElement的使用 View的伪装对象,支持所有View的功能,详细功能可参考文档或代码 手动伪装:$.create $.id $.findView 注入伪装:$.setContent(view class or layout id,inject class); 获取原型:elem.toView(); 三、注入 1、视图注入 A、创建注入类,属性名称必须和layout中的id对应,如果不对应请加入标签@SNInjectView class DemoInject{ @SNInjectView(id=R.id.tvTest) public SNElement test; } B、实例化注入对象 DemoInject di=new DemoInject(); C、调用$.inject或者$.setContent注入 $.inject(di); D、注入成功后即可调用对象 String text=di.test.text(); 2、依赖注入 A、需要绑定注入对象,建议写到Application中的onCreate SNBindInjectManager.instance().bind(ITest.class, Test.class); B、与视图注入不同的是属性必须添加标签@SNIOC,注入的对象(Test)必须包含只有一个SNManager参数的构造函数,且必须实现注入者 public class Test implements ITest{ SNManager $; public Test(SNManager _$){ this.$=_$; }; } class DemoInject{ @SNIOC public ITest test; } C、调用$.inject或者$.setContent注入 同视图注入 D、注入成功后即可调用对象 di.test.xxx(); 四、fragment的使用 1、SNFragment 2、SNLazyFragment 五、控件的使用 1、SNFragmentScrollable 2、SNPercentLinearLayout、SNPercentRelativeLayout 3、SNScrollable 4、SNSlipNavigation 5、XList 6、slidingtab
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值