职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 428|回复: 1

intent and service

[复制链接]
gz-vps 发表于 2011-8-26 10:11 | 显示全部楼层 |阅读模式
明天才开始讨论包需求......
推荐链接 见证又一个......


明天才开始讨论包需求,估计离进入开发阶段还要一段时间,今天继续复习android in action,结合之前的知识,把总结的东西记一记

1. 一个应用内部各组件之间的跳转,以及不同应用间组件的跳转(这里的组件包括activity、service、receiver、provider),是通过Intent和IntentFilter实现的。包括显式Intent和隐式Intent。

对于在Manifest文件中没有配置Intent-Filter的组件,只能在应用内部通过显式Intent来跳转,这种情况需要设置Intent的Component。

在Manifest中配置了Intent-Filter的组件,既可以通过显式Intent跳转,也可以通过隐式Intent跳转,并且可以跨应用跳转。这种情况下,需要设置Intent的Action、Category、Data

此外,可以通过给Intent设置Extra,来携带一些数据

Android in Action这本书里说,understanding intent, and you will understand android。现在来看,也是夸大了一点,android也没他说的这么简单

2. 至于在设置了Intent,并发送Intent请求,比如startActivity(Intent intent)之后,系统寻找匹配组件的过程是这样的。

首先,如果是显式Intent,那么比较简单
Java代码  
Intent intent = new Intent(this,XXXActivity.class);  

Intent intent = new Intent(this,XXXActivity.class);

这种情况下,android系统直接到该应用的Manifest文件中找指定的Activity,如果找到则跳转,如果没有找到,则抛出一个异常

如果是隐式Intent,情况要略微复杂一点,也不难
Java代码  
Intent intent = new Intent();   
intent.setAction(Intent.ACTION_VIEW);   
intent.setCategory(Intent.CATEGORY_DEFAULT);  

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setCategory(Intent.CATEGORY_DEFAULT);

这种情况下,系统会把所有应用内,配置了Intent-Filter的Activity都遍历一遍,包括安装的第三方应用,和系统自带的应用。根据Intent的参数,和Intent-Filter的设置逐一匹配。如果没有找到合适结果,则抛出异常。如果只有唯一结果,则直接跳转。如果有多个结果,则弹出对话框让用户进行选择

3. 至于Intent和IntentFilter的匹配规则,很多地方都能找到详细的文档,我这里就不罗嗦了。只是有一点特别提醒一下,由于隐式的Intent,如果没有设置Category,则跳转的时候系统会自动加上DEFAULT CATEGORY,相当于以下代码
Java代码  
intent.setCategory(Intent.CATEGORY_DEFAULT);  

intent.setCategory(Intent.CATEGORY_DEFAULT);

所以为了能够匹配成功,在intent-filter的配置里,也要加上CATEGORY_DEFAULT才可以,否则就匹配不到了

4. 看sample代码,学习到一个开机时自动启动某个service的方法,还是不错的。首先配置一个BroadcastReceiver,其intent-filter加上action:android.intent.action.BOOT_COMPLETED。这样的话,当系统开机之后,广播一个BOOT_COMPLETED消息的时候,这个Receiver就能收到

然后在此Receiver的onReceiver()方法里,就可以调用startService()方法了

5. 前面的博客已经介绍过Activity的生命周期了,与它不同的是,Receiver组件的生命周期是很短的,在执行过onReceiver()方法之后,该组件的实例和所在的进程,都被标记为可以被系统回收。所以在Receiver里,不能搞一些异步操作,也不能长久的存放变量,很可能说没就没了

6. 大家都知道adb shell命令是很好用的,可以用来查看文件,执行SQLite操作等。如果eclipse同时连接了多个AVD,或许还连接了真机,这个时候直接打adb shell就不好使了。

可以先打adb devices命令,就可以看到目前有哪些AVD和真机可以连接

然后打adb -s emulator-5554 shell,就可以连接到emulator-5554这台AVD上

7. 关于sqlite3命令,连接上SQLite后。有2个命令比较方便,一个是.tab,可以看到所有的表。第二个是.h on,可以在查询时看到列的名称

8. 再介绍一下Service组件的生命周期,比Activity也要简单一点。分两种情况

如果Service是通过startService()方法启动的,那么这是一个后台服务,它的生命周期就比较长,会经历onCreate()、onStart()、onDestory()方法。其实还有一些其他方法,比如onLowResource()等,不过不常用,主要的就是前面说的3个方法

如果Service是绑定到另一个组件上的,那其生命周期就不长于绑定的组件,而且onStart()方法不会被系统调用

9. 虽然可以通过startService(Intent)方法,来启动另一个应用中的Service,其实就是使其调用onStart()方法。但是如果需要调用另一个应用中的Service组件的某一个特定方法,这种粒度的需求,靠Intent就无法实现了。因为不同的应用都是跑在独立的沙盒中的,也处于不同的进程中。(前面已经介绍过,一个应用对应一个进程,以及一个Dalvik实例)

这种情况下,android提供了AIDL方式,来实现跨应用的服务调用。粗略看了一下,感觉比较复杂。既然目前没有这个场景,我也就不去深究了,知道有这么一种方式就可以了,以后需要的时候再来看。有兴趣的朋友,可以去看android in action这本书第4章的结尾部分,讲得非常清楚

木已 发表于 2011-8-26 10:12 | 显示全部楼层
推荐链接
见证又一个准百万富翁的诞生!
3G培训就业月薪平均7K+,不3K就业不花一分钱!
20-30万急聘多名天才Java/MTA软件工程师


您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-8 00:32 , Processed in 0.107665 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表