本人android小菜鸟一只,最近因为某一个顽强的大boss bug困扰鄙人2天之久。
其根本问题就是startactivity的启动过程是放在一个ui线程里面执行的。
所以,当我在service里面startactivity,然后在service里面调用activity里面的某个getHandler方法之时,发现获取到的hanler是空。
经过调查才明白,startactivity是把activity的onCreate方法放到一个线程里面执行,所以我是先获取到了handler为空然后才执行的onCreate方法。
后经过高人指点,在service里面启动Activity以后,
在Activity的onCreate方法里面绑定这个Service,
然后就可以在Activity里面获取这个服务对象了,
然后在service里面写个方法setHandler,
Activity里面调用service对象的setHandler方法并把handler传进去在Service里面,
写个继承Binder类的内部类,然后内部类里面写个方法返回这个service对象,
然后在service的onBind方法里面返回这个内部类对象,。
这样,在Acitivty里面就可以获得这个service的内部类对象了,然后直接调用就可以。
这样的话,整个的流程就是:
service先startactivity,然后在onCreate方法里面绑定服务,得到内部类对象,getservice,得到service对象,sethandler,把handler传过去,然后再在service里面通过handler执行activity里的方法。
需要注意的是,handler和conn不能再onCreate里面初始化,要放到外面。下面:贴图
这个是service里面的内部类。
创建的内部类对象。
返回的内部类对象。
sethandler方法。
handler里面的使用
这是activity里面的onCreate方法和绑定服务的conn,记住要写在onCreate外面。
handler的创建也要写在外面。
在create方法里面设置handler进去。