Intent和BroadcastReceiver

た 入场券 2022-03-16 14:27 291阅读 0赞

Intent简介

Intent是一种消息传递机制,作用:

  • 使用类名显示启动一个特定的Service或Activity
  • 启动Activity或Service来执行一个Intent
  • 广播某个事件已经发生

  • 使用Intent启动Activity

显式启动Activity

  1. Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
  2. startActivity(intent);
  3. 复制代码

调用新Activity的finish或按下返回按钮将关闭该Activity,并出栈。

隐式的Intent和运行时绑定

隐式调用,就是让匿名的应用程序组件响应动作请求。如拨打电话:

  1. Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:xxxx"));
  2. startActivity(intent);
  3. 复制代码

隐式调用需要一个执行的动作,也可提供执行动作需要的数据URI。还可以通过向Intent添加extra来向目标Activity发送数据。

确定Intent能否解析

有的时候需要判断intent能否解析:

  1. PackageManager pm = getPackageManager();
  2. ComponentName cn = intent.resolveActivity(pm);
  3. 复制代码

从Activity返回结果

调用startActivityForResult,回调为onActivity。如选取联系人:

  1. Uri uri = Uri.parse("content://contacts/people");
  2. Intent intent = new Intent(Intent.ACTION_PICK,uri);
  3. startActivityForResult(intent,REQUEST_CODE);
  4. 复制代码

然后请求完成后:

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. //处理返回的结果
  5. }
  6. 复制代码

Android 原生Action

  • ACTION_ALL_APPS 打开一个列出所有已安装应用程序的Activity
  • ACTION_ANSWER 打开一个处理来电的Activity
  • ACTION_BUG_REPORT 显示一个可以报告bug的Activity
  • ACTION_CALL 打开一个电话拨号程序
  • ACTION_CALL_BUTTON 用户按下拨打按钮触发,调用拨号Activity
  • ACTION_DELETE 启动一个Activity,允许删除Intent数据URI中指定的数据
  • ACTION_DIAL 打开一个拨号程序
  • ACTION_EDIT 请求一个Activity,要求该Activity可以编辑Intent的数据URI中的数据
  • ACTION_INSERT 打开一个能够在Intent的数据URI指定的游标处插入新项的Activity
  • ACTION_PICK 启动一个子Activity,可以从Intent的数据URI指定的Content Provider中选择
  • ACTION_SEARCH 通常用于启动特定的搜索Activity
  • ACTION_SEARCH_LONG_PRESS 允许截获对硬件搜索键的长按操作
  • ACTION_SENDTO 启动一个Activity来向Intent的数据URI所指定的联系人发送消息
  • ACTION_SEND 启动一个Activity,该Activity会发送Intent中指定的数据
  • ACTION_VIEW 视图要求以最合理的方式查看Intent的数据URI中提供的数据
  • ACTION_WEB_SEARCH 打开一个浏览器,进行搜索

使用Intent广播事件

Intent可以在进程之间发送结构化的消息,可以通过实现Broadcast Receiver来监听和响应应用程序内的Broadcast Intent。

广播Intent:

  1. Intent intent = new Intent();
  2. intent.putExtra(key, value);
  3. sendBroadcast(intent);
  4. 复制代码

处理广播Intent:

  1. private class MyBroadcastReceiver extends BroadcastReceiver{
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. //处理事件
  5. }
  6. }
  7. 复制代码

注册广播两种方式:

代码中注册

  1. IntentFilter intentFilter = new IntentFilter();
  2. intentFilter.addAction(action);
  3. //注册
  4. registerReceiver(receiver,intentFilter);
  5. //取消注册
  6. unregisterReceiver(receiver);
  7. 复制代码

Manifest注册

  1. <receiver android:name=".MyBroadcastReceiver">
  2. <intent-filter>
  3. <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
  4. </intent-filter>
  5. </receiver>
  6. 复制代码

这种方式Receiver总是活动的,并且一直可以接受广播事件。

广播有序的Intent

sendOrderdBroadcast可以按照优先级顺序发送广播事件。

  1. <receiver android:name=".MyBroadcastReceiver">
  2. <intent-filter>
  3. android:priority = "100">
  4. <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
  5. </intent-filter>
  6. </receiver>
  7. 复制代码

广播Sticky Intent

Sticky Intent可以保存它们最后一个广播的值,一旦有新的接收器被注册为接收该广播时,它们会把这些值作为Intent返回。使用sendStickyBroadcast广播,删除使用removeStickyBroadcast。

  • Pending Intent

Pending Intent用于包装在响应将来的事件时触发的Intent。

  1. Intent intent = new Intent(this,MyOtherActivity.class);
  2. PendingIntent.getActivity(this,requestCode,intent,flags);
  3. Intent intent = new Intent(this,MyService.class);
  4. PendingIntent.getService(this,requestCode,intent,flags);
  5. Intent intent = new Intent();
  6. PendingIntent.getBroadcast(this,requestCode,intent,flags);
  7. 复制代码

创建Intent Filter

使用Intent Filter为隐式Intent提供服务

Intent Filter标签:

  1. action 服务的动作标签,唯一字串
  2. category 指定提供服务的情况

    • ALTERNATIVE 在特定数据类型上执行的默认动作的可选项
    • SELECTED_ALTERNATIVE 与ALTERNATIVE类似,但是要求可以有多种可能性
    • BROWSABLE 指定浏览器内部可用的动作
    • DEFAULT 默认动作
    • HOME 作为本地屏幕的可选项
  3. data data标签允许指定组件可以执行的数据类型:

    • android:host 指定一个有效的主机名
    • android:mimetype 指定组件可以执行的数据类型
    • android:path 指定URI的有效路径
    • **android:port 指定主机的有效端口
    • android:scheme 要求一种特定的模式(如http)

Android解析Intent Filter

  1. Android将安装包的可用Filter放到一个列表中
  2. 从列表中移除在解析Intent时相关联的动作或者类别不匹配的Intent Filter
  3. Intent的数据URI的每一个部分都和Intent Filter的data标签进行比较

监听本地Broadcast Intent

可以监听系统事件,然后进行自己程序的相应动作,经常使用的系统事件:

  • ACTION_BOOT_COMPLETED 系统完成启动后,会触发这个动作
  • ACTION_CAMERA_BUTTON 当单击拍照按键时触发
  • ACTION_DATE_CHANGED 和ACTION_TIME_CHANGED 日期和时间被手动修改,或触发
  • ACTION_MEDIA_EJECT 用户弹出外部存储,会触发,如果正在操作外部存储,记得保存和关闭文件句柄
  • ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED 新的外部存储成功添加或者移除,会触发
  • ACTION_NEW_OUTGOING_CALL 向外拨打电话就会触发
  • ACTION_SCREEN_OFF和ACTION_SCREEN_ON 屏幕关闭或者打开时触发
  • ACTION_TIMEZONE_CHANGED 时区改变会触发

有的时候需要在运行时管理Manifest Receiver

使用PackageManager.setComponentEnabledSetting(ReceiverName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP)启用一个Receiver

使用PackageManager.setComponentEnabledSetting(ReceiverName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)禁用一个Receiver

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 robotiumIntent

     大多数Activity在启动时,都会从Intent中获取一些数据。 在使用Robotium测试时,当然也会需要从Activity中获取数据。 可用的流程为 1。将set

    相关 Android BroadcastReceiver

    和ContentProvider一样,都可以跨进程、跨应用访问。 android在好多情况下会发出各种广播,我们可以自定义广播接收器来接收必要的广播,只需要继承Broadca

    相关 BroadcastReceiver

    前言:这个月写的博客文章数量比较多,因为刚入门的缘故吧,多总结,由浅入深,等后面更深入了再给大家写续篇。 学之广在于不倦,不倦在于固志。 ——晋·葛洪 (学

    相关 显式Intent隐式Intent

    Intent是各组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递消息。一般被用于启动活动、启动服务以及发送广播等场景。 主要分为