Android学习——界面互调2

红薯 发布于 2009/07/14 10:48
阅读 1K+
收藏 1

Android中, 除了像前面我们说的弹出指定页面,系统还提供了一个机制,就是跨程序调用,这样可以大大提高系统复用度,比如,我们自己写一个打电话程序,我们可以调用系 统中自带的电话薄选择页面来实现;一个文本内容,我们可以写一个文本编辑器来修改,也可以用系统自带的文本工具来操作,就像在windows,可以用记事本打开一个txt也可以用word来操作一样。

对于这样的跨程序调用,Android中并没有采用定位程序再定信程序集中的界面来实现,而是采用类似于婚介所的形式,在系统我们安装一个apk程序后,系统会自动把里面的activity信息加载到系统的一个列表中,这个列表记录着Activity的名称,描述,数据格式等信息,另一个程序如果想调用系统中其他程序的界面时,只要向系统(婚介所)提供我需要的Activity(对象)的描述,由系统去筛选这个Activity,然后把结果(Intent)交给你的程序来处理。

 

首先看一下,怎样写一个Activity登记到这个系统中(婚介所),在前面我们就说过,一个程序都配有一个manifest.xml的装箱单,那发布这个Activity也是在这个文件中,看下面的代码:

<application……

        <activity android:name=".TestActivity"

                  android:label="@string/app_name">

            <intent-filter>

                            <action android:name="android.intent.action.PICK"/>

                            <category android:name="android.intent.category.DEFAULT"/>

                            <data android:path="tttt"

                                   android:scheme="Test">

                            </data>

                     </intent-filter>

        </activity>

</application>

在这个Application结点下面,可以定义Activity,当然是可以定义多个的,name:指定了具体的类;intent-filter:就是发布这个Activity的相关描述信息,主要有:

l  Action

activity的动作类型,在系统中,已为我们定义了一些动用类型,这类型主要是将Activity进行分类,比如有ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, ACTION_PICK等等。举例来说,我们写一个电话薄程序,可以有查看,编辑,选择的功能,那么其他系统调用我这个包后,具体想要用其中的哪一个功能就只要传入这样的参数就可以了。

l  Category

描述action的附加信息,主要描述了这个Activity的执行环境(个人觉得,有点不确定),比如指定一个activity只能是启动时用,或只能在弹出界面中用等等。

l  Data

这块主要是描述了数据传递格式,个人觉得里面还包含了该Activity的启动路径,比如,上例中,我们就要用“Test://tttt”来启动这个Activity。具体可看下面。

 

在发布了Activity之后,我们就要想到怎样使用,代码很简单,如下:

Uri uri = Uri.parse("Test://tttt/");

Intent intent = new Intent(Intent.ACTION_PICK, uri);

startActivityForResult(intent, 1);

使用时,我们定义Uri来定位到需要的Activity,然后创建Intent,然后直接启用即可。如果说系统中检测到有多个Activity满足你这个Intent要求,那么系统会自动弹出一个选择列表,让你选择一个具体的处理类,就象让你选择用记事本还是Word一样,当然在系统中,可以指定一个默认的处理类,可以不用弹出来选了。

 

其实,除了这种启动方法外,我们还有一种比较隐藏的应用,比如,收到一条短信,在这短信里有一个电话号码,和一个网址,我想实现,将这电话号码和网址变成超链接,点击后分别进行拨号和查看网页内容。

这样的程序其实也不难,在Linkify提供了这样的功能,看代码:

TextView textView = (TextView)findViewById(R.id.myTextView);

Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);

XML中:

<TextView

android:layout_width=”fill_parent”

android:layout_height=”fill_parent”

android:text=”@string/linkify_me”

android:autoLink=”phone|email”

/>

这样,我们的textView就可以自动识别出来网址格式和Email格式了,当点击时,其实也就是自动根据内容产生一个Uri,然后再Call出相应的Activity来处理。

 

总的看下来,这种隐式调用的方法,就像信息传递一样,我发起一个请求,对应的程序来处理,其实这处理方式也就是Android系统中的BroadCast(广播),消息传递机制,就是说把传递的内容当成消息,Activity为接受程序。

消息发送程序写法:

public static final String NEW_LIFEFORM_DETECTED =

             "com.zjf.AndroidStudyBroadcast.NEW_LIFEFORM";

Intent intent = new Intent(NEW_LIFEFORM_DETECTED);

//intent.putExtra(“lifeformName”, lifeformType);

sendBroadcast(intent);

消息接受程序写法:

public class Receiver extends BroadcastReceiver {

 

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

}

}

然后将Receiver在系统的manifest.xml中注册:

<receiver android:name="Receiver">

<intent-filter>

<action android:name="com.zjf.AndroidStudyBroadcast.NEW_LIFEFORM"/>

</intent-filter>

</receiver>

当然除了通过定义来注册,也可以通过代码来注册:

IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED);

LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();

registerReceiver(r, filter);

通过unregisterReceiver(r);来注销监听。

 

在系统中提供了一系列的默认的事件,比如来电话,来短信,电池不足等,都可以用类似的方法来接收处理。

 

最后一种界面形式就是对话框,这种界面主要就是弹出的确认框啊,选择界面之类的,它并没有占屏幕的全部,但是这个界面的生命期完全由父控件来操作管理。实现对话框主要通过以下几种方式来实现:

(一)   继承Dialog来处理

Dialog d = new Dialog(MyActivity.this);

// Have the new window tint and blur the window it

// obscures.

Window window = d.getWindow();

window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,

WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

d.setTitle(“Dialog Title”);

d.setContentView(R.layout.dialog_view);

TextView text = (TextView)d.findViewById(R.id.dialogTextView);

text.setText(“This is the text in my dialog”);

d.show();

(二)   通过Activities用上dialog皮肤来实现

<activity android:name=”MyDialogActivity”

android:theme=”@android:style/Theme.Dialog”>

</activity>

(三)   Toasts

这种方式是用于后台服务发出的提示信息。这个用法以后等学了服务再来了解吧

加载中
返回顶部
顶部