Intent 分类
显式 Intent:Intent("android.intent.action.CALL", Uri.parse("tel:" + string));
须要指明名字启动。用于程序内多 Activity 交互,通经常使用于应用程序内部消息,有名 Action Intent。
隐式 Intent:一般不指明名字,而是採用广播的形式,一般是 Broadcast Intent。
Action Intent:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
动作非常大程度上决定了剩下的 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 处理流程
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
注冊 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 注冊
IntentFilter myFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVER"); MyReceiver myReceiver = new MyReceiver(); Context.registerReceiver(myReceiver, myFilter);
XML 注冊
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="<receiver android:name=".MyReceiver"> </intent-filter> </receiver>
广播
接收
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 有时间限制,超时则觉得程序无响应
详细演示样例
完整程序:http://download.csdn.net/detail/sweetloveft/9468520
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> 标签里面加入
<receiver android:name="com.sweetlover.activity.Receiver"> <intent-filter> <action android:name="com.china.ui.NEW_LIFEFORM" /> </intent-filter> </receiver>