关于BroadcastReceiver与Service交互时调用peekService返回null的疑问及解析

大家都清楚由于onReceive()函数是由进程的主线程调用的,生命期在10s左右,如果遇上了耗时操作,官网的BroadcastReceiver中onReceive(context,intent)部分建议如下:

in particular, for interacting with services, you should use startService(Intent) instead of bindService(Intent, ServiceConnection, int). If you wish to interact with a service that is already running, you can use peekService(Context, Intent)

就是说涉及到跟service交互的话,不要用bindService方法,因为可能binder对象还没返回回来这个receiver就killed掉了。建议使用peekService(context,intent)方法,这个方法还是比较少用到的,也不清楚这个函数返回的Ibinder对象来自于哪儿。所以下面写了个demo来看看这个peekService怎么用.

Read More

处理Runtime Changed的官方建议

一般情况下我们应用的配置发生了改变的话,activity会被destory掉(目的是为了让应用去适应新的配置环境),然后重开启一个activty,这就涉及到数据存储的问题了。

一般情况下: activity在发生异常的时候,会先执行onSaveInstanceState()的,把我们的数据存进去,然后在onCreate(Bundle savedInstanceState)或者onRestoreInstanceState(Bundle savedInstanceState)的时候从bundle取出来就可以了,但onSaveInstanceState()只是适合小数据量的情况。如果数据量很大的话,比如说一个复杂的listView里面的item数据(比如说包含了bitmap),是否也要花一大部分代码去存储数据状态呢?显然是不对的,这样太占用内存了。
解决方案有两个

Read More