阅读《Android 从入门到精通》(33)——Intent 分类
2016-03-21 19:40
387 查看
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 IntentBroadcast 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 注册
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/94685201.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>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories