Wednesday, June 8, 2011

android ApiDemos笔记1 - 运行时遍历activity

关于启动activity: com.example.android.apis

在运行时,递归遍历属下所有的activity (queryIntentActivities)
过滤出和指定前缀相关的activity
归纳所有activity lable路径的第1层目录,构造1个list

list元素的title = activity lable(优先)或者activity的pack路径,
list元素的object = 启动activity的intent

如果title是activity lable,使用browseIntent创建intent
如果title是activity的pack路径,使用activityIntent创建

通过 SimpleAdapter,把list中的title显示到listActivity上。
选中listActivity中的项目,找到list只能给的intent,触发intent

2个activity的处理过程,
06-08 02:49:52.451: DEBUG/getData(382): ===> i = 0
06-08 02:49:52.511: DEBUG/getData(382): labelSeq = App/Activity/Hello World
06-08 02:49:52.521: DEBUG/getData(382): info.activityInfo.name = com.example.android.apis.app.HelloWorld
06-08 02:49:52.521: DEBUG/getData(382): label = App/Activity/Hello World
06-08 02:49:52.531: DEBUG/getData(382): prefix = 
06-08 02:49:52.531: DEBUG/getData(382): if (prefix.length() == 0 || label.startsWith(prefix))
06-08 02:49:52.531: DEBUG/getData(382): nextLabel = App
06-08 02:49:52.542: DEBUG/getData(382): prefixPath = null
06-08 02:49:52.542: DEBUG/getData(382): labelPath = [Ljava.lang.String;@40599058
06-08 02:49:52.550: DEBUG/getData(382): else if (entries.get(nextLabel) == null)
06-08 02:49:52.561: DEBUG/getData(382): browseIntent(App)


06-08 02:49:53.880: DEBUG/getData(382): ===> i = 58
06-08 02:49:53.880: DEBUG/getData(382): labelSeq = Views/Layouts/RelativeLayout/2. Simple Form
06-08 02:49:53.880: DEBUG/getData(382): info.activityInfo.name = com.example.android.apis.view.RelativeLayout2
06-08 02:49:53.880: DEBUG/getData(382): label = Views/Layouts/RelativeLayout/2. Simple Form
06-08 02:49:53.880: DEBUG/getData(382): prefix = 
06-08 02:49:53.880: DEBUG/getData(382): if (prefix.length() == 0 || label.startsWith(prefix))
06-08 02:49:53.880: DEBUG/getData(382): nextLabel = Views
06-08 02:49:53.880: DEBUG/getData(382): prefixPath = null
06-08 02:49:53.880: DEBUG/getData(382): labelPath = [Ljava.lang.String;@405270c8


2套Activity目录

06-08 02:05:50.591: DEBUG/getData(346): label = Content/Storage/External Storage
06-08 02:05:50.591: DEBUG/getData(346): nextLabel = Content
06-08 02:05:50.661: DEBUG/getData(346): label = Content/Resources/Styled Text
06-08 02:05:50.661: DEBUG/getData(346): nextLabel = Content
06-08 02:05:50.661: DEBUG/getData(346): label = Content/Assets/Read Asset
06-08 02:05:50.661: DEBUG/getData(346): nextLabel = Content
06-08 02:05:50.692: DEBUG/getData(346): label = Content/Resources/Resources
06-08 02:05:50.692: DEBUG/getData(346): nextLabel = Content
06-08 02:05:50.692: DEBUG/getData(346): label = Content/Provider/Pick Contact
06-08 02:05:50.692: DEBUG/getData(346): nextLabel = Content


06-08 02:05:50.692: DEBUG/getData(346): label = OS/Morse Code
06-08 02:05:50.692: DEBUG/getData(346): nextLabel = OS
06-08 02:05:50.741: DEBUG/getData(346): label = OS/Sensors
06-08 02:05:50.741: DEBUG/getData(346): nextLabel = OS
06-08 02:05:50.741: DEBUG/getData(346): label = OS/Rotation Vector
06-08 02:05:50.741: DEBUG/getData(346): nextLabel = OS
06-08 02:05:50.780: DEBUG/getData(346): label = OS/SMS Messaging
06-08 02:05:50.780: DEBUG/getData(346): nextLabel = OS

=============================================================================
后续层次的activity列表也都采用ApiDemos这个Activity

在创建activity中,获得当前activity的lable路径
public void onCreate(Bundle savedInstanceState)
   String path = intent.getStringExtra("com.example.android.apis.Path");

在创建ListActivity项目中,每个项目对应1个新的Activity。
如果新的activity还是1个列表Activity。
构建intent时,需要保存这个activity的lable路径
protected Intent browseIntent(String path)
   Intent result = new Intent();
   result.setClass(this, ApiDemos.class);
   result.putExtra("com.example.android.apis.Path", path);

如果不是列表Activity,就是最底层的具体的功能activity了。
构建Intent是保存包名和其他Activity类型
protected Intent activityIntent(String pkg, String componentName) {
        Intent result = new Intent();
        result.setClassName(pkg, componentName);

触发intent,显示Intent指定的Activity类型。

连续深入列表Activity的过程如下:
06-08 05:56:48.590: DEBUG/ListItemClick(514): path = intent.getStringExtra = 
06-08 05:56:49.330: DEBUG/ListItemClick(514): intent.putExtra = App
06-08 05:56:50.380: DEBUG/ListItemClick(514): intent.putExtra = Content
06-08 05:56:50.530: DEBUG/ListItemClick(514): intent.putExtra = OS
06-08 05:56:50.540: DEBUG/ListItemClick(514): intent.putExtra = Views
06-08 05:56:52.381: DEBUG/ListItemClick(514): intent.putExtra = Graphics
06-08 05:56:53.271: DEBUG/ListItemClick(514): intent.putExtra = Media
06-08 05:56:53.281: DEBUG/ListItemClick(514): intent.putExtra = Text
06-08 05:56:53.331: DEBUG/ListItemClick(514): intent.putExtra = NFC

06-08 05:58:16.340: DEBUG/ListItemClick(514): position, id, title = 0, 0, App
06-08 05:58:16.440: DEBUG/ListItemClick(514): path = intent.getStringExtra = App
06-08 05:58:17.321: DEBUG/ListItemClick(514): intent.putExtra = App/Activity
06-08 05:58:17.780: DEBUG/ListItemClick(514): intent.putExtra = App/Service
06-08 05:58:17.910: DEBUG/ListItemClick(514): intent.putExtra = App/Alarm
06-08 05:58:17.920: DEBUG/ListItemClick(514): intent.putExtra = App/Notification
06-08 05:58:18.020: DEBUG/ListItemClick(514): intent.putExtra = App/Search
06-08 05:58:18.060: DEBUG/ListItemClick(514): intent.putExtra = App/Menu
06-08 05:58:18.070: DEBUG/ListItemClick(514): intent.putExtra = App/Preferences

06-08 05:58:27.281: DEBUG/ListItemClick(514): position, id, title = 0, 0, Activity
06-08 05:58:27.371: DEBUG/ListItemClick(514): path = intent.getStringExtra = App/Activity

=============================================================================
1,运行时分析的功能很不错,代码用来处理统一的数据结构,更加简洁。
   ApiDemos专门用来列举下一层activity的目录清单。

2,原来以为ApiDemos只是1个启动用的Activity,没想到功能这么强大。
   接下来,只要看每个具体功能的Activity就可以了。
   幸亏没有把他放一放。

3,intent是一个命令对象,包括需要创建的activity的类型,还可以附带一些命令参数。

No comments:

Post a Comment