本文主要是介绍使用Intent实现拨打电话和发送短信功能,返回系统桌面功能,ACTION_VIEW启动另一个Activity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 Intent概述
一个Activity程序主要由Activity,Service和BroadcastReceiver3种组件组成,这3种组件是相互独立的,可以互相调用。这些组件之间的通信由Intent协助完成,Intent负责对一次操作的Action,Action涉及的Data,Extras进行描述,Android根据Intent的描述,负责找到对应的组件,将Intent传递给调用的组件。
由以下3种基本应用场景:
(1)开启Activity
将Intent对象传递给startActivity()方法,启动一个新的Activity;
将Intent对象传递给startActivityForResult()方法,需要获取返回结果时,在Activity的onActivityResult()里接收。
(2)开启Service
将Intent对象传递给startService()方法,启动一个新的Service;
将Intent对象传递给bindService()方法,可以建立调用组件与目标服务之间的连接。
(3)传递Broadcast
通过sendBroadcast(),sendOrderBroadcast()等方法。
2 Intent属性
Intent主要包含6种属性:Component name,Action,Category,Data,Extras和Flags。
属性 | 作用 |
Component name | 指定为处理Intent对象的组件名称 |
Action | Intent要完成的一个动作 |
Category | 用来对执行动作的类别进行描述 |
Data | 向Action提供要操作的数据 |
Extras | 向Action提供要操作的附加数据 |
Flags | 提示Android程序如何去启动一个Activity |
表1 Intent对象的属性及作用
2.1 Component name(组件名称)
组件名称:包名+类名
Component name可通过setComponent(),setClass()或setClassName()方法设置,并通过getComponent()方法读取。
(1)setComponent
public Intent setComponent(ComponentName component)
构造ComponentName对象:
ComponentName(Context context, Class<?> cls)Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this, DetailActivity.class);
intent.setComponent(componentName);
或
ComponentName(String pkg, String cls)Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hyh","com.hyh.test");
intent.setComponent(componentName);
(2)setClass
public Intent setClass(Context packageContext, Class<?> cls)Intent intent = new Intent();
intent.setClass(this, DetailActivity.class);
(3)setClassName
public Intent setClassName(Context packageContext, String className)Intent intent = new Intent();
intent.setClassName(this, "com.hyh.test");
(4)getComponent
public ComponentName getComponent()
2.2 Action(动作)
Action属性用来指定将要执行的动作。在Intent类中,定义了一系列action常量,目标组件包含Activity和Broadcast。
1 标准Activity动作
表2列出了用于启动Activity(Context.startActivity())的标准动作。
常量 | 对应字符串 | 说明 |
ACTION_MAIN | android.intent.action.MAIN | Activity启动,没有数据输入输出 |
ACTION_VIEW | android.intent.action.VIEW | 将数据显示给用户 |
ACTION_EDIT | android.intent.action.EDIT | 将数据显示给用户用于编辑 |
ACTION_PICK | android.intent.action.PICK | 从数据种选择一项,并返回该项 |
ACTION_DIAL | android.intent.action.DIAL | 使用提供的数字拨打电话 |
ACTION_CALL | android.intent.action.CALL | 使用提供的数字给某人拨打电话 |
ACTION_SEND | android.intent.action.SEND | 向某人发送消息,接收者未指定 |
ACTION_SENDTO | android.intent.action.SENDTO | 向某人发送消息,接收者已指定 |
表2 标准Activity动作说明
2 标准广播动作
表3列出了用于接收广播(Context.RegisterReceiver()或配置文件中的<receiver>标签)的标准动作。
常量 | 对应字符串 | 说明 |
ACTION_BOOT_COMPLETED | android.intent.action.BOOT_COMPLETED | 在系统启动完成后发出一次通知 |
ACTION_PACKAGE_ADDED | android.intent.action.PACKAGE_ADDED | 通知新应用已经安装到设备上 |
ACTION_PACKAGE_CHANGED | android.intent.action.PACKAGE_CHANGED | 通知已安装的应用程序包已经被修改 |
ACTION_PACKAGE_REMOVED | android.intent.action.PACKAGE_REMOVED | 通知从设备中删除应用程序包 |
ACTION_PACKAGE_DATA_CLEARED | android.intent.action.PACKAGE_DATA_CLEARED | 通知用户清空应用程序包中的数据 |
ACTION_BATTERY_CHANGED | android.intent.action.BATTERY_CHANGED | 包含充电状态,等级和其他电池信息的广播 |
ACTION_SHUTDOWN | android.intent.action.SHUTDOWN | 通知设备已经关闭 |
表3 标准广播动作说明
除了预定义的Action,我们可以自定义Action。自定义Action的字符串必须使用应用程序的包名作为前缀,如"com.hyh.test.DETAIL"。
一个Intent对象的Action通过setAction()方法设置,通过getAction()方法获取。
(1)setAction
public Intent setAction(String action)static final String ACTION_DETAIL = "com.hyh.text.DETAIL";
Intent intent = new Intent();
intent.setAction(DetailActivity.ACTION_DETAIL);
同时需要在配置文件里配置<intent-filter>:
<intent-filter><action android:name="com.hyh.test.DETAIL"><category android:name="android.intent.category.DEFAULT">
</intent-filter>
(2)getAction
public String getAction()
2.3 Data(数据)
数据是一个URI对象,通常包含数据的URI类型和MIME类型。常用的数据类型如表4:
操作类型 | Data格式 | 示例 |
浏览网页 | http://网页格式 | http://www.baidu.com |
拨打电话 | tel:电话号码 | tel:17622283361 |
发送短信 | smsto:短信接收号码 | smsto:17622283361 |
查找SD卡文件 | file:///sdcard/dir | file:///sdcard/Download/1.jpg |
显示地图 | geo:坐标,坐标 | geo:36.5,-26.7 |
联系人信息 | content://联系人信息 | content://com.android.contacts/contacts/1 |
表4 常用的数据类型
(1)setData
// data:要设置的数据URI
public Intent setData(Uri data)
// 要设置数据未联系人信息id为1的联系人数据
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
(2)setType
// type:数据的MIME类型
public Intent setType(String type)intent.setType("image/*");
(3)setDataAndType
public Intent setDataAndType(Uri data, String type)
(4)getData
public Uri getData()
(5)getType
public String getType()
2.4 Category(种类)
用来对执行动作的类别进行描述。常用的Category常量如表5:
常量 | 对应字符串 | 说明 |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 让Activity可以安全地从浏览器调用 |
CATEGORY_TAB | android.intent.category.TAB | 将Activity作为TabActivity的选项卡 |
CATEGORY_HOME | android.intent.category.HOME | 用于返回Home Activity(系统桌面) |
CATEGORY_APP_MARKET | android.intent.category.APP_MARKET | 让Activity允许用户浏览和下载新应用 |
表5 常用Category说明
(1)addCategory()
为Intent添加种类信息
public Intent addCategory(String category)
(2)removeCategory()
从Intent中删除指定的种类信息
public void removeCategory(String category)
(3)getCategories()
获取所有与Intent相关的种类信息
public Set<String> getCategories()
2.5 Extras(附加信息)
Extras用于向Intent组件添加附加信息,采用键值对的形式保存附加信息。通常会将附加信息作为一个Bundle对象,使用putExtras()和getExtras()方法添加和读取。
(1)putExtras()
public Intent putExtras(Bundle extras)Bundle bundle = new Bundle();
bundle.putCharSequence("name","hyh");
intent.putExtras(bundle);
(2)getExtras()
public Bundle getExtras()
2.6 Flags(标志)
Flags用来指示如何去启动一个Activity,如Activity属于哪个Task以及启动后如何处理,Task是一组以栈的模式聚集到一起的Activity组件的集合。常用的标志常量如表7:
常量 | 说明 |
FLAG_GRANT_READ_URI_PERMISSION | 对Intent数据有读取权限 |
FLAG_GRANT_WRITE_URI_PERMISSION | 对Intent数据有写入权限 |
FLAG_ACTIVITY_CLEAR_TOP | 如果在当前task中有要启动的Activity,那么把该Activity之前的所有Activity都关掉,并把该Activity置前 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 新的Activity不会在最近启动的Activity的列表中保存 |
FLAG_ACTIVITY_MULTIPLE_TASK | 新的Task总是会启动来处理Intent,而不管是否已经有一个Task可以处理相同的事情 |
FLAG_ACTIVITY_NEW_TASK | 系统会检查当前已创建的Task中是否有需要启动的Activity的Task,若有则在该Task上创建Activity;若没有,则在新建的Task上创建Activity |
FLAG_ACTIVITY_NO_HISTORY | 新的Activity将不在历史Stack中保留,用户一旦离开,这个Activity自动关闭 |
表7 常用的标志常量
(1)setFlags()
多次使用会将之前的替换掉
public Intent setFlags(int flags)intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
(2)addFlags()
多次使用将会添加多个标志
public Intent addFlags(int flags)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
(3)getFlags()
public int getFlags()
3 Intent种类
Intent可以分为显示Intent和隐士Intent两种。
3.1 显式Intent
显式Intent是指在创建Intent对象时就指定接收者(Activity,Service和BroadcastReceiver)。如:
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent);
3.2 隐式Intent
隐式Intent是指在创建Intent对象时不指定具体的接收者,而是定义要执行的Action,Category和Data,Android系统根据相应的匹配机制找到要启动的Activity。
如,我们需要在自己的应用程序中展示一个网页,可以直接调用系统的浏览器:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
或
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intent);
4 Intent过滤器
使用隐式Intent时,系统需要根据某种匹配机制来找到要启动的Activity。这种机制是根据Intent过滤器来实现的。通常是在AndroidManifest.xml文件中使用<intent-filter>标记,也可以使用接口动态设置。这里介绍<intent-filter>标记。
4.1 <action>标记
<action>标记用于指定组件能响应的动作。
<action>标记的语法格式如下:
<action android:name="string" />
如
<action android:name="android.intent.action.MAIN" />
4.2 <data>标记
<data>标记用于向Action提供要操作的数据。URI可以分为scheme(协议),host(主机),port(端口),path(路径),组成格式如下:
<scheme>://<host>:<port>/<path>
如
content://com.hyh.test:200/folder/dir
4.3 <category>标记
<category>标记用于指定以何种方式去执行Intent请求的动作。
<category>标记的语法格式如下:
<category android:name="string" />
如
<action android:name="android.intent.category.TEST" />
5 使用Intent实现拨打电话,发送短信
PhoneSmsIntent:
MainActivity.java
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton_phone);ImageButton imageButton1 = (ImageButton) findViewById(R.id.imageButton_sms);imageButton.setOnClickListener(l);imageButton1.setOnClickListener(l);}View.OnClickListener l = new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();switch (v.getId()) {case R.id.imageButton_phone:intent.setAction(intent.ACTION_DIAL); //调用拨号面板intent.setData(Uri.parse("tel:18768193385")); //设置要拨打的号码//intent.setData(Uri.parse("tel:17800928376")); //设置要拨打的号码startActivity(intent);break;case R.id.imageButton_sms:intent.setAction(intent.ACTION_SENDTO); //调用发送短信息intent.setData(Uri.parse("smsto:17800928376")); //设置要发送的号码intent.putExtra("sms_body", "Welcome to Android!"); //设置要发送的信息内容startActivity(intent);}}};
}
https://github.com/hanyuhang-hz/android-demos
6 使用Intent返回系统桌面
HomeIntent:
MainActivity.java
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);Button button= findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();// 设置action动作属性intent.setAction(intent.ACTION_MAIN);// 设置categoty种类显示主屏幕intent.addCategory(intent.CATEGORY_HOME);startActivity(intent);}});}
}
https://github.com/hanyuhang-hz/android-demos
7 使用Intent的ACTION_VIEW启动另外一个Activity
ActionViewIntent:
MainActivity.java
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button= (Button) findViewById(R.id.btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();// 为Intent设置动作intent.setAction(intent.ACTION_VIEW);startActivity(intent);}});}
}
由于有多个app匹配ACTION_VIEW,因此需要用户进行选择。
ContactsActivity.java
public class ContactsActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_contacts);//设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);}
}
https://github.com/hanyuhang-hz/android-demos
这篇关于使用Intent实现拨打电话和发送短信功能,返回系统桌面功能,ACTION_VIEW启动另一个Activity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!