Intent的属性及Intent-filter配置——指定Action、Category调用系统Activity
Intent代表了启动某个程序组件的“意图”,实际上Intent对象不仅可以启动本应用内程序组件,也可启动Android系统的其他应用的程序组件,包括系统自带的程序组件——只要权限允许。
实际上Android内部提供了大量标准Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如表5.2所示。
Action常量 | 对应字符串 | 简单说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW |
android.intent.action.VIEW |
显示指定数据 |
ACTION_ATTACH_DATA |
android.intent.action.ATTACH_DATA |
指定某块数据将被附加到其他地方 |
ACTION_EDIT |
android.intent.action.EDIT |
编辑指定数据 |
ACTION_PICK |
android.intent.action.PICK |
从列表中选择某项并返回所选的数据 |
ACTION_CHOOSER |
android.intent.action.CHOOSER |
显示一个Activity选择器 |
ACTION_GET_CONTENT |
android.intent.action.GET_CONTENT |
让用户选择数据,并返回所选数据 |
ACTION_DIAL |
android.intent.action.DIAL |
显示拨号面板 |
ACTION_CALL | android.intent.action.CALL |
直接向指定用户打电话 |
ACTION_SEND |
android.intent.action.SEND |
向其他人发送数据 |
ACTION_SENDTO |
android.intent.action.SENDTO |
向其他人发送消息 |
ACTION_ANSWER |
android.intent.action.ANSWER |
应答电话 |
ACTION_INSERT |
android.intent.action.INSERT |
插入数据 |
ACTION_DELETE |
android.intent.action.DELETE |
删除数据 |
ACTION_RUN |
android.intent.action.RUN |
运行数据 |
ACTION_SYNC |
android.intent.action.SYNC |
执行数据同步 |
ACTION_PICK_ACTIVITY |
android.intent.action.PICK_ACTIVITY |
用于选择Activity |
ACTION_SEARCH |
android.intent.action.SEARCH |
执行搜索 |
ACTION_WEB_SEARCH |
android.intent.action.WEB_SEARCH |
执行Web搜索 |
ACTION_BATTERY_LOW |
android.intent.action.ACTION_BATTERY_LOW | 电量低 |
ACTION_MEDIA_BUTTON | android.intent.action.ACTION_MEDIA_BUTTON | 按下媒体按钮 |
ACTION_PACKAGE_ADDED | android.intent.action.ACTION_PACKAGE_ADDED | 添加包 |
ACTION_PACKAGE_REMOVED | android.intent.action.ACTION_PACKAGE_REMOVED | 删除包 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
ACTION_BOOT_COMPLETED | android.intent.action.BOOT_COMPLETED | 系统启动完成 |
ACTION_TIME_CHANGED | android.intent.action.ACTION_TIME_CHANGED | 时间改变 |
ACITON_DATE_CHANGED | android.intent.action.ACTION_DATE_CHANGED | 日期改变 |
ACTION_TIMEZONE_CHANGED | android.intent.action.ACTION_TIMEZONE_CHANGED | 时区改变 |
ACTION_MEDIA_EJECT | android.intent.action.MEDIA_EJECT | 插入或拔出外部媒体 |
标准Category常量及对应的字符串如表5.3所示
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
CATEGORY_BROWSABLE |
android.intent.category.BROWSABLE |
指定该Activity能被浏览器安全调用 |
CATEGORY_TAB |
android.intent.category.TAB |
指定该Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER |
android.intent.category.LAUNCHER |
Activity显示顶级程序列表中 |
CATEGORY_INFO |
android.intent.category.INFO |
用于提供包信息 |
CATEGORY_HOME |
android.intent.category.HOME |
设置该Activity随系统启动而运行 |
CATEGORY_PREFERENCE |
android.intent.category.PREFERENCE |
该Activity是参数面板 |
CATEGORY_TEST |
android.intent.category.TEST |
该Activity是一个测试 |
CATEGORY_CAR_DOCK |
android.intent.category.CAR_DOCK |
指定手机被插入汽车底座(硬件)时运行该Activity |
CATEGORY_DESK_DOCK |
android.intent.category.DESK_DOCK |
指定手机被插入桌面底座(硬件)时运行该Activity |
CATEGORY_CAR_MODE |
android.intent.category.CAR_MODE |
设置该Activity可在车载环境下使用 |
表5.2、表5.3所列出的都只是部分较为常用的Action常量、Category常量、关于Intent所提供的全部Action常量、Category常量,应参考Android API文档中关于Intent的说明。
下面将以两个实例来介绍Intent系统Action、系统Category的用法。
实例:查看并获取联系人电话
这个程序将会在程序中提供一个按钮,用户单击该按钮时会显示系统的联系人列表,当用户单击指定联系人之后,程序将会显示该联系人的名字、电话。
该程序的界面布局代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center_horizontal" > <!-- 显示 联系人姓名的文本框 --> <EditText android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false" android:cursorVisible="false"/> <!-- 显示联系人的电话的文本框 --> <EditText android:id="@+id/phone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false" android:cursorVisible="false"/> <Button android:id="@+id/bn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查看联系人"/> </LinearLayout>
上面的界面布局中包含了两个文本框,一个按钮,其中按钮用于浏览系统联系人列表并选择其中的联系人。两个文本框分别用于显示联系人的名字、电话号码。
该程序的Java代码如下。
package com.example.studyintent; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.app.Activity; import android.content.CursorLoader; import android.content.Intent; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class SysAction extends Activity { final int PICK_CONTACT=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sys_action); Button bn=(Button)findViewById(R.id.bn); //为bn按钮绑定事件监听器 bn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //创建Intent Intent intent=new Intent(); //设置Intent的Action属性 intent.setAction(Intent.ACTION_GET_CONTENT); //设置Intent的Type属性 intent.setType("vnd.android.cursor.item/phone"); //启动Activity,并希望获取该Activity的结果 startActivityForResult(intent,PICK_CONTACT); }}); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (PICK_CONTACT): if(resultCode==Activity.RESULT_OK) { //获取返回的数据 Uri contactData=data.getData(); CursorLoader cursorLoader=new CursorLoader(this,contactData,null,null,null,null); //查询联系人信息 Cursor cursor=cursorLoader.loadInBackground(); //如果查询到指定的联系人 if(cursor.moveToFirst()) { String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); //获取联系人的名字 String name=cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); String phoneNumber="此联系人暂未输入电话号码"; //根据联系人查询该联系人的详细信息 Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone._ID+"="+contactId, null, null); if(phones.moveToFirst()) { //取出电话号码 phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } //关闭游标 phones.close(); EditText show=(EditText)findViewById(R.id.show); //显示联系人的名称 show.setText(name); EditText phone=(EditText)findViewById(R.id.phone); //显示联系人的电话号码 phone.setText(phoneNumber); } //关闭游标 cursor.close(); } break; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.sys_action, menu); return true; } }
运行上面的程序,单击程序界面中“查看联系人”按钮,程序将会显示如图5.4所示的界面。
在图5.4所示的联系人列表中单击某个联系人,系统将会自动返回上一个Activity,程序会在上一个Activity中显示所选联系人的名字和电话,如图5.5所示。
上面的Intent对象除了设置Action属性之外,还设置了Type属性。
需要指出的是,由上面的程序需要查看系统联系人信息,因此不要忘了向该应用的Android Manifest.xml文件中增加相应的权限,也就是在AndroidManifest.xml文件中增加如下配置。
<uses-permission android:name="android.permission.READ_CONTACTS" />
实例:返回系统Home桌面
接下来的示例将会提供,当用户单击该按钮时,系统将会返回Home界面。这也需要Intent来实现,程序为Intent设置合适的Action、合适的Category属性,并根据该Intent来启动Activity即可返回Home界面。该示例程序如下。
package com.example.studyintent; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ReturnHome extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_return_home); Button bn=(Button)findViewById(R.id.bn); bn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //创建Intent对象 Intent intent=new Intent(); //为Intent设置Action、Category属性 intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.return_home, menu); return true; } }
上面的程序中粗体字代码设置了Intent的Action为android.intent.action.MAIN字符串、Category属性为android.intent.category.HOME字符串,满足该Intent的Activity其实就是Android系统的Home界面。因此运行上面程序时“单击”按钮即可返回Home界面。