关于Remote Service与Application

       其实一直都不太清楚,这里边的机制,但是这次的项目矛盾把它显化了:

       首先说我所想要实现的需求: 我希望的是远程Service与Activity 能够共享 一些动态的信息,比如说我在service中 改变了变量 String str的值,我希望在Activity中能够取得它。

 于是,我把str 放进了扩展的Application里,企图用这种方法来实现这个变量的全局。但是事情还不是这么简单的,下边我说一下遇到的困难:

        一、第一条就是  我在service的构造函数ByService()中的下边的代码

                 

	app = (CustomApp) getApplication();
	Log.i("service", ""+app.hashCode());

                 竟然报空指针。后来我认为这是因为serivce 在那个时候,还没有Bind与onStart,应该是找不到 service.getApplication的。


      二、在service中的CustomApp 中已经赋值好了str,但是到了Activity中,那个str竟然没有值。

             初步认为,好像remote service与Activity 好像得到的CustomApp不是一实例!  于是,我分别在remote Service中与 Activity 中打入Application 的Log,代码如下:

            

	CustomApp app=(CustomApp) MainAct.this.getApplication();
	Log.i("demo", "Act app hashcode:"+app.hashCode()+"|"+app.toString());
        
        CustomApp app=(CustomApp) BgService.this.getApplication();
        Log.i("demo", "BgService app hashcode:"+app.hashCode()+"|"+app.toString());

              最后打出来的是:

                

       08-11 14:43:36.609: INFO/demo(2508): Act app hashcode:1079137856|com.demo.CustomApp@40525640
       08-11 14:43:36.609: INFO/demo(2517): BgService app hashcode:1079139176|com.demo.CustomApp@40525b68
   

               果然,这两个 CustomApp 并不是一个App,也就是说,不同进程的Application是不同的,简单的认为一个Application就是一个程序,这种想法显然是错误的..

     

        三、可是,我还是想让Activity 即前台与我的remote Service 能够共享一份数据, 那我又想了一个歪方法,我在CustomApplication 里边 放static String str 不就行了?

                于是,我在Application里边写了这么一个变量,然后service中赋值, 再在activity中找: 结果呢? 是activity中的str 为NULL 。

       

        四、现在确定的是remote Service中的CustomApp 与Activity中的CustomApp 实例不是一个同一个东西,但是这两个东西 确是一个类生成的,比如在CustomApp 中生成时就写  String  str="demo"   那两个实例中的str值都是demo


         总结: 通过一系列的实验,我对了一些概念有了更为清醒的认识, 对于进程的理解有了更进一步的加深。 这个实验前,我的想法是很不科学且付浅的,我以为Activity与remote Service 虽然是两个进程,但终归是一个程序中的(现在想明白其实只是文字语义,计算机中已经完全不是了),所以理应该是一个Application. 但现在明白进程的概念是多的严格, 在本次实验中 我大概感受到了 进程的严格边界..static不能跨越进程而共享, Android中的Application 也是最多是一个进程共享这么一个全局的东西.。可见,对程序,进程的概念还要更多实践和把握。

        经过这个实验,一些东西理清楚之后, 才更明白IPC,AIDL 的功能级别, 想再更深了解的话,可能要再钻研一下android的进程,内存之类的概念了。

       如此说来,我的项目里,两者共享数据,我准备用sharedpreference了, 内存中的跨进程共享,还要有很多操作,确实是件比较麻烦的事啊...

       顺便说一下,SDK文档中说不建议用Application 扩展来实现全局,建议的是用静态加单例实现

       理解这些,对以后项目搭架构很有好处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值