Intent 分类

显式 Intent:Intent("android.intent.action.CALL", Uri.parse("tel:" + string));需要指明名字启动,用于程序内多 Activity 交互,通常用于应用程序内部消息,有名 Action Intent
隐式 Intent:一般不指明名字,而是采用广播的形式,通常是 Broadcast Intent。

Action Intent:


动作很大程度上决定了剩下的 Intent 如何构建,特别是数据(data)和附加(extras)字段,就像一个方法名决定了参数和返回值。因此,Intent 对象动作通过 setAction 设置后,具体的 Action 具有具体的数据格式要求。比如:ACTION_EDIT 的数据字段将包含用于编辑文档的 URL;ACTION_CALL 则是 tel:URL。此外,还应了解数据格式类型,比如获取的数据是音频、视频、文字、图像还是其他,这就需要通过 setType 指定 MIME,常用的 Category 如下:

CATEGORY_BROWSABLE
CATEGORY_GADGET
CATEGORY_HOME
CATEGORY_LAUNCHER
CATEGORY_PREFERENCE

addCategory 用于添加一个种类到 Intent,与此对应的是 removeCategory 用于删除前一个种类,一个Intent 可以有多个 Category,getCategories 用于获取 Intent 中的所有种类

Broadcast Intent

Action Intent 只能被一个指定的 Activity 响应,如果需要推送通知这样的广播信息,则需要 Broadcast Intent

Broadcast Intent 处理流程


注册 Broadcast Intent 步骤

(1)继承 BroadcastReceiver,并重写 onReceiver 方法:

package com.sweetlover.camera2basic;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context arg0, Intent arg1) {// TODO Auto-generated method stub}}

(2)根据 IntentFilter 注册 Broadcast Intent

<1> Java 注册

IntentFilter myFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVER");MyReceiver myReceiver = new MyReceiver();Context.registerReceiver(myReceiver, myFilter);

<2> XML 注册

<receiver android:name=".MyReceiver"><intent-filter><action android:name="<receiver android:name=".MyReceiver"></intent-filter></receiver>

(3)广播


(4)接收

Broadcast Receiver 接收到 Intent 后对其判断,符合条件则响应 onReceiver 方法

public void onReceiver(Context myContext, Intent myIntent) {if (myIntent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {// TODO 电量低时切换到节电模式,关闭 WIFI 和 GPS}}

(5)销毁

每当 Receiver 响应一个 Intent 后就被自动销毁,Receiver 有时间限制,超时则认为程序无响应

具体示例

1.MainActivity.java

@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();try {Thread.sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}final Intent intent = new Intent(MY_NEW_LIFEFORM);sendBroadcast(intent);}

2.Receiver.java

package com.sweetlover.activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubToast.makeText(context, "收到广播信息", Toast.LENGTH_SHORT).show();}}

3.activity_main.xml

添加一个空的 LinearLayout 布局即可

4.AndroidManifest.xml

在 <application> 标签里面添加

        <receiver android:name="com.sweetlover.activity.Receiver">            <intent-filter>                <action android:name="com.china.ui.NEW_LIFEFORM" />            </intent-filter>        </receiver>

更多相关文章

  1. 隐藏底部导航栏的虚拟按键,并响应点击事件。解决:点击的时候会唤起
  2. Android第一行代码学习笔记Chapter5&6
  3. Android中onTouch与onClick事件的关系
  4. Android(安卓)退出终止APP的方法总结
  5. android,自定义广播,最终广播接收者,防止拦截广播,有序广播,无序广
  6. Android(安卓)BroadcastReceiver
  7. 关于JAVA回调函数和Android事件响应
  8. android ListView 点击无响应
  9. 说说Android的广播(5) - 广播的历史

随机推荐

  1. Study on Android【二】--ContentProvide
  2. Android(IPC)进程间通讯1:详解Binder由来?
  3. android通过webservice连接SQL数据库(一)服
  4. Android实现系统关机和重启
  5. android实现横竖屏不间断播放文件
  6. Android电源管理
  7. android架构
  8. Android(安卓)版本兼容适配
  9. Android即时通讯和sns开源项目汇总
  10. Android(安卓)mediaplayer 播放本地音乐