[2022.2.2]使用Intent实现拨打电话和发送短信功能,返回系统桌面功能,ACTION |
您所在的位置:网站首页 › 下载电话拨号到桌面 › [2022.2.2]使用Intent实现拨打电话和发送短信功能,返回系统桌面功能,ACTION |
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()或配置文件中的标签)的标准动作。 常量 对应字符串 说明 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);同时需要在配置文件里配置: (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 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文件中使用标记,也可以使用接口动态设置。这里介绍标记。 4.1 标记标记用于指定组件能响应的动作。 标记的语法格式如下: 如 4.2 标记标记用于向Action提供要操作的数据。URI可以分为scheme(协议),host(主机),port(端口),path(路径),组成格式如下: ://:/ 如 content://com.hyh.test:200/folder/dir 4.3 标记标记用于指定以何种方式去执行Intent请求的动作。 标记的语法格式如下: 如 5 使用Intent实现拨打电话,发送短信PhoneSmsIntent: MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected 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() { @Override public 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 { @Override protected 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() { @Override public 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启动另外一个ActivityActionViewIntent: MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button= (Button) findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() { @Override public 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 { @Override protected 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 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |