注意:资料估计是在SDK1.5以前的,有一些参数请参照官方的最新文档,如下文中会提到DIAL_ACTION,我试了一下在2.2中是ACTION_DIAL。其他一些也会有相应的修改,如:setLaunchFlags这个函数并不需要再调用,但是文中大多数提到的是基本概念问题,不影响!
这一节中会做一个如何拨打和接收电话的例子,此外还会出现一个非常重要的概念,intents。
前面的例子中已将可以创建一个“静态”的应用程序,然而这些没有什么实际应用的意义。接下来是调用平台的一些函数来实现打电话的功能!
什么是Intents?
在开始这个应用程序之前,必段先明白接下来会用到的一些东西,Intents。当你能够熟练掌握Intents之后,一个全新的程序开发的世界将向你敞开!(Once you master the use of Intents, a whole new world of application development will be open to you)
Android的函数通过Intent将一些信息从一个Activity传递到另一个。Intent就是告诉一个Activity该做什么,你可以理解成一个在两个Activity之间传递的消息。比如:假设你有一个Activity需要打开Web浏览器并显示一个页面。你的Activity会发送一个“在Web浏览器上打开xxx网页”的消息。比较常见的有WEB_SEARCH_ACTION Intent,当这个Intent被发送后,被Android Intent解析器收到,解析器会解析出一个Activity的列表,并选择一个与你所传送的Intent最匹配的一个。在这个例子中就是Web浏览器Activity,接下来由Web浏览器根据你Intent中的内容做相应的操作。
Activity Action Intents: Intents用来调用你应用程序之外的Activity,并且只能调用一个Activity,如调用Web浏览器
Broadcast Intents: 顾名思义了,这个可以调用你应用程序之外的很多Activity,比如手机电量值,广播一个Intents,任何一个Activity都会做出相应的反应,在电量低的情况下,可以退出一个Activity。
以下列出一个可以使用的Activity Action Intents及相应的描述,可以看出的是,基本上一个Intents描述了一项功能!
Activity Action Intent Message
ADD_SHORTCUT_ACTION Add a function shortcut to the Android Home Screen
ALL_APPS_ACTION List all the applications available on the device
ANSWER_ACTION Answer an incoming call
BUG_REPORT_ACTION Open the Bug Reporting Activity
CALL_ACTION Place a call to supplied location
DELETE_ACTION Delete the specified data
DIAL_ACTION Open the Dial Activity and dial the specified number
EDIT_ACTION Provide editable access to the supplied data
EMERGENCY_DIAL_ACTION Dial an emergency number
FACTORY_TEST_ACTION Retrieve factory test settings
GET_CONTENT_ACTION Select and return specified data
INSERT_ACTION Insert an empty item
注:上面列出的只是一小部分,并且因参考资料的陈旧与SDK不断的更新,实际请参考最新的官方文档!当然还有Broadcast Intents请参考官方文档!
在接下来的例子中会用到两个Intents,CALL_ACTION和DIAL_ACTION,这两个Intents用作拨号与呼叫的功能!
在Broadcast Intents中,有一些发送非常的频繁,比如TIME_TICK_ACTION和SIGNAL_STRENGTH_CHANGED_ACTION,小心使用他们。
一个Intent只有一个功能实现的三分之一,Intent是告诉Activity做什么,但是Intent并不会真正的去执行这些东西,他只是一个消息,还需要Intent Filter和Intent Receivers去侦听,然后解析这个Intent。Intent Filter和Intent Receivers比较容易理解,如果把Intent比作邮件信息,那么需要一个投放的“邮箱”,这个是Intent Receivers。
理解了什么是Intents,接下来学习如何使用DIAL_ACTION Intent来拨号。如前面的介绍一样,新建一个项目,建完新项目之后,第一件要做的事是把TextView删掉,把该清理的清理掉。然后,在你的项目中需要新引入两个包:android.content.Intent和android.net.Uri。第一个是创建Intent,第二个是解析URI的。接下来一步是创建一个Intent,
Intent <intent_name> = new Intent(<Android_Intent>,<data>)
Intent_name是Intent的名字,取一个就行了,Android_Intent需要查Activity Action Intent这个表,这里是DIAL_ACTION Intent,格式是:Intent.DIAL_ACTION,最后一个参数data是电话号码,他是URI,需要如下转换Uri.parse("tel:7788250")。
Intent DialIntent = new Intent(Intent.DIAL_ACTION,Uri.parse("tel:7788250"));
注意:Uri不是URI
TIP:可以用voicemail:替换tel:
Intent创建完之后,现在要告诉Android开启一个新的Activity去拨号。你可以用Intent 的setLaunchFlags()方法,必须给setLaunchFlags()方法一个适当的参数。以下是一些可供选择的参数:
NO_HISTORY_LAUNCH,启动一个Activity不记录在系统启动记录中。
SINGLE_TOP_LAUNCH,告诉系统不要启动这个Acitivity如果他已经在运行中了。
NEW_TASK_LAUNCH,新启动一个Activity
MULTIPLE_TASK_LAUNCH,不管有没有启动,都启动一个新的
FORWARD_RESULT_LAUNCH,如果这个标记被设置。 而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity
(注:FORWARD_RESULT_LAUNCH解释来源于互联网。)
在这个例子中,简单的使用一下NEW_TASK_LAUNCH吧。
DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
最后一步是用这个Intent实实在在的启动这个Activity,
startActivity(DialIntent);
完整的JAVA代码如下:
package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.net.Uri;
public class AndroidPhoneDialer extends Activity {
/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
/** Create our Intent to call the Dialer */
/** Pass the Dialer the number 5551212 */
Intent DialIntent = new
Intent(Intent.DIAL_ACTION,Uri.parse("tel:5551212"));
/** Use NEW_TASK_LAUNCH to launch the Dialer Activity */
DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
/** Finally start the Activity */
startActivity(DialIntent);
}
}
接下来可以编译,并在模拟器上运行了:
阶段性结束一下吧,以上只是一个拨号的过程,还需要CALL的过程,然后这中会关系到一些权限的问题,接下来是按钮自已再个性化一下。工作太忙,以后再写了。