组件的特点
对于Android的四大组件Activity, Service, ContentProvider和Service,不能有Setter和Getter,也不能给组件添加接口。原因是组件都是给系统框架调用的,开发者只能实现其规定的回调接口,组件的创建与销毁都是由系统框架控制的,开发者不能强行干预,更没有办法获取组件的对象。比如Activity,Service,BroadcastReceiver,你没有办法去创建一个Activity,Service或BroadcastReceiver,然后像使用其他类那样的调用其上的接口与其通信,用Setters和Getters改变属性等等。这也决定了,组件之间通信只能用系统支持的Intent。而Intent只能传递基本数据类型和Uri等一些常见的数据类型。Intent只支持传递内置类型和一些限制类型,这就导致了组件之间的数据传递必须都是基本类型,所以枚举类型无法使用。
多态无法实现
比如你有一个Service用于在后台执行UI中发来的请求,这些请求有些是做数据请求,有些是做数据分析,等等。这里可以用多态,定义一个统一的Transaction类,然后再为每种特定的Transaction类型,Transaction中统一接口process()用于实际的处理,理想的情况是,Service接收一个Transaction对象,然后调用其process(),没有必要知道具体的类型,UI创建具体的一个类型对象然后交由Service来处理。但是这在Android当中是无法实现的,因为Intent通信机制所限,因为它不能直接传递Transaction对象。所以,Service必须要知道具体的类型。原生应用Mms中就有如此的现象,在transaction包中TransactionService是处理服务,UI发送到Service的只是区别不同Transaction的Id(一个整数),Service查看不同的Id创建不同的Transaction对象,然后调用process()对其处理。
建议:自己实现一个类似Service的服务类,在其内用Handler,Thread和Looper让其长时间运行。这样就没有组件间通信的限制,你可以像正常使用Java对象那样来使用这个服务类,向其传递自定义的处理请求:
public void execute(Transaction request) {
if (mHandler == null) {
return;
}
Message msg = Message.obtain();
msg.obj = request;
mHandler.sendMessage(msg);
}
}
新闻热点
疑难解答
图片精选