阅读《Android 从入门到精通》(33)——Intent 分类 Intent 分类 Action Intent: Broadcast Intent Broadcast Intent 处理流程 注冊 Broadcast Intent 步骤 详细演示样例

显式 Intent:Intent("android.intent.action.CALL", Uri.parse("tel:" + string));
须要指明名字启动。用于程序内多 Activity 交互,通经常使用于应用程序内部消息,有名 Action Intent。


隐式 Intent:一般不指明名字,而是採用广播的形式,一般是 Broadcast Intent。

Action Intent:

阅读《Android 从入门到精通》(33)——Intent 分类
Intent 分类
Action Intent:
Broadcast Intent
Broadcast Intent 处理流程
注冊 Broadcast 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 处理流程

阅读《Android 从入门到精通》(33)——Intent 分类
Intent 分类
Action Intent:
Broadcast Intent
Broadcast Intent 处理流程
注冊 Broadcast Intent 步骤
详细演示样例

注冊 Broadcast Intent 步骤

继承 BroadcastReceiver,并重写 onReceiver 方法:

package com.sweetlover.camera2basic;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
		// TODO Auto-generated method stub
		
	}

}

依据 IntentFilter 注冊 Broadcast Intent

Java 注冊

XML 注冊

广播

阅读《Android 从入门到精通》(33)——Intent 分类
Intent 分类
Action Intent:
Broadcast Intent
Broadcast Intent 处理流程
注冊 Broadcast Intent 步骤
详细演示样例

接收

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

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

销毁

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

详细演示样例

1.MainActivity.java

@Override
protected void onStart() {
	// TODO Auto-generated method stub
	super.onStart();
		
	try {
		Thread.sleep(5000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.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 {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Toast.makeText(context, "收到广播信息", Toast.LENGTH_SHORT).show();
	}
}

3.activity_main.xml

加入一个空的 LinearLayout 布局就可以

4.AndroidManifest.xml

在 <application> 标签里面加入