我的理解,Acitivity之间的互动两种方式,一种是利用startAcitivity实现父子之间的互动;一种是利用Intent机制来实现。
startActivity一般是用在一个应用内部,而Intent机制可以用在不同应用之间。
startActivity可以这样理解,如同在一个Form中启动另外一个Form,所以他们之间有互动联系是必然的。如果想把子Acitity的执行情况传回给父Activity,就可以利用startActivityForResult来实现。并在子Activity中利用setResult来设置发挥状态及额外信息。
其实这也是一种Intent机制。对于需要调用外部程序,或者侦听外部消息并作出响应的话,利用Intent就没有错。总的理解就如同windows编程中所谓的消息,Intent如同消息,我们想办法创建一个Intent消息,然后利用Intent.putExtra把需要传递的数据一并打包到Intent消息之中,然后根据需要以不同的方式广播出去,如需要考虑优先级的消息可以利用sendOrderedBroadcast进行广播(这种Intent被成为Broadcast Intent,我的理解就是普通的Intent)。如果需要广播特殊的设备状态或者自己的STICKY消息时,就可以考虑使用sendStickyBroadcast来广播Sticky Intent消息(比如,电池状态等)。
有消息的发送者就必然有消息的接收者,要接收消息,就必须首先在Manifest文件中明确声明广播的接收者,我想这大概也是出于便于权限管理的原因。然后在其中利用<receiver>标记定义一个Broadcast Receiver,由于我们的应用必然更加专注于某一方面的消息,所以,在<receiver>标签内部利用<intent-filter>来定义需要接收消息的过滤器。
尽管综合来看,不管是那一种方式,实质上都是在利用Intent来实现,但毕竟还有体内循环和体外循环的差别。也许有人说,从应用中利用如下代码即可自动调用拨号程序,那拨号程序也不是自己的应用啊。我想说的是,这有点像在一个HTML应用中嵌套了一个AcitiveX对象,这个AcitiveX对象不一定非得是自己的应用,但也得算作自己应用所实现功能的扩展。
自动调用拨号程序的实现:
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:0311-12345678"));
startActivity(intent);