react 做网站,建网站和建网店的区别,网站开发公司比较有名,wordpress 建站配置转载自#xff1a;Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带#xff0c;封装了不同组件之间通讯的条件。
Intent本身是定义为一个类别(Class)#xff0c;一个Intent对象表达一个目的(Goal)或期望(Expectation)#xff0c;叙述其所期望的服务或动作、与… 转载自Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带封装了不同组件之间通讯的条件。
Intent本身是定义为一个类别(Class)一个Intent对象表达一个目的(Goal)或期望(Expectation)叙述其所期望的服务或动作、与动作有关的数据等。Android则根据此Intent对象之叙述负责配对找出相配的组件然后将 Intent对象传递给所找到的组件Android的媒婆任务就完成了。
在Google Doc中是这样描述Intent的摘自Android中文翻译组
当接收到ContentResolver发出的请求后内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对象。对于activity和服务来说它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。比如说它可以承载对一个activity 的请求让它为用户显示一张图片或者让用户编辑一些文本。而对于广播接收器而言Intent对象指明了声明的行为。比如它可以对所有感兴趣的对象声明照相按钮被按下。
对于每种组件来说激活的方法是不同的
通过传递一个Intent对象至Context.startActivity()或Activity.startActivityForResult()以载入或指定新工作给一个activity。相应的activity可以通过调用 getIntent() 方法来查看激活它的intent。Android通过调用activity的onNewIntent()方法来传递给它继发的intent。 一个activity经常启动了下一个。如果它期望它所启动的那个activity返回一个结果它会以调用startActivityForResult()来取代startActivity()。比如说如果它启动了另外一个activity以使用户挑选一张照片它也许想知道哪张照片被选中了。结果将会被封装在一个Intent对象中并传递给发出调用的activity的onActivityResult() 方法。通过传递一个Intent对象至Context.startService()将启动一个服务或给予正在运行的服务以一个新的指令。Android调用服务的onStart()方法并将Intent对象传递给它。 与此类似一个Intent可以被调用组件传递给 Context.bindService()以获取一个正在运行的目标服务的连接。这个服务会经由onBind() 方法的调用获取这个Intent对象如果服务尚未启动bindService()会先启动它。比如说一个activity可以连接至前述的音乐回放服务并提供给用户一个可操作的用户界面以对回放进行控制。这个activity可以调用 bindService() 来建立连接然后调用服务中定义的对象来影响回放。应用程序可以凭借将Intent对象传递给 Context.sendBroadcast() Context.sendOrderedBroadcast() 以及Context.sendStickyBroadcast()和其它类似方法来产生一个广播。Android会调用所有对此广播有兴趣的广播接收器的 onReceive()方法将intent传递给它们。
Intent对象包含的内容 在Intent类的Java源代码中定义了Intent相关内容的变量如下
// Action
private String mAction;
// Data
private Uri mData;
private String mType;
private String mPackage;
// ComponentName
private ComponentName mComponent;
// Flag
private int mFlags;
// category
private HashSetString mCategories;
// extras
private Bundle mExtras; componentName组件名称指定Intent的目标组件的类名称。组件名称是可选的如果填写Intent对象会发送给指定组件名称的组件否则也可以通过其他Intent信息定位到适合的组件。组件名称是个ComponentName类型的对象。 用法
Intent intent new Intent();
// 构造的参数为当前Context和目标组件的类路径名
ComponentName cn new ComponentName(HelloActivity.this, com.byread.activity.OtherActivity);
intent.setComponent(cn);
startActivity(intent);
相当于以下常用方法
Intent intent new Intent();
intent.setClass(HelloActivity.this, OtherActivity.class);
startActivity(intent);
Intent类中也包含一个初始化ComponentName的构造函数
public Intent(Context packageContext, Class? cls) { mComponent new ComponentName(packageContext, cls);
}
action动作), 指定Intent的执行动作比如调用拨打电话组件。
public Intent(String action) { mAction action;
}
data数据起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的通过设置data的Uri来获得。
public Intent(String action, Uri uri) { mAction action; mData uri;
}
比如调用拨打电话组件
Uri uri Uri.parse(tel:10086);
// 参数分别为调用拨打电话组件的Action和获取Data数据的Uri
Intent intent new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
category类别)被执行动作的附加信息。例如应用的启动Activity在intent-filter中设置category。
intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER /
/intent-filter
extras附加信息)为处理Intent组件提供附加的信息。可通过putXX()和getXX()方法存取信息也可以通过创建Bundle对象再通过putExtras()和getExtras()方法来存取。 flags标记)指示Android如何启动目标Activity设置方法为调用Intent的setFlags方法。常用的Flags参数有
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_NO_HISTORY
FLAG_ACTIVITY_SINGLE_TOP
Intent的投递
显式方式:直接设置目标组件的ComponentName用于一个应用内部的消息传递比如启动另一个Activity或者一个services。 通过Intent的setComponent和setClass来制定目标组件的ComponentName。隐式方式:ComponentName为空用于调用其他应用中的组件。需要包含足够的信息这样系统才能根据这些信息使用intent filter在所有的组件中过滤action、data或者category来匹配目标组件。可参考Android中Activity组件详解5.Activity的Intent Filter 如果Intent指明定了action则目标组件的IntentFilter的action列表中就必须包含有这个action否则不能匹配 如果Intent没有提供type系统将从data中得到数据类型。和action一样目标组件的数据类型列表中必须包含Intent的数据类型否则不能匹配 如果Intent中的数据不是content: 类型的URI而且Intent也没有明确指定它的type将根据Intent中数据的scheme 比如 http: 或者mailto: 进行匹配。同上Intent 的scheme必须出现在目标组件的scheme列表中 如果Intent指定了一个或多个category这些类别必须全部出现在组建的类别列表中。比如 Intent中包含了两个类别LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY解析得到的目标组件必须至少包含这两个类别。
Intent调用常见系统组件
// 调用浏览器
Uri webViewUri Uri.parse(http://blog.csdn.net/zuolongsnail);
Intent intent new Intent(Intent.ACTION_VIEW, webViewUri); // 调用地图
Uri mapUri Uri.parse(geo:100,100);
Intent intent new Intent(Intent.ACTION_VIEW, mapUri); // 播放mp3
Uri playUri Uri.parse(file:///sdcard/test.mp3);
Intent intent new Intent(Intent.ACTION_VIEW, playUri);
intent.setDataAndType(playUri, audio/mp3); // 调用拨打电话
Uri dialUri Uri.parse(tel:10086);
Intent intent new Intent(Intent.ACTION_DIAL, dialUri);
// 直接拨打电话需要加上权限uses-permission idandroid.permission.CALL_PHONE /
Uri callUri Uri.parse(tel:10086);
Intent intent new Intent(Intent.ACTION_CALL, callUri); // 调用发邮件这里要事先配置好的系统Email否则是调不出发邮件界面的
Uri emailUri Uri.parse(mailto:zuolongsnail163.com);
Intent intent new Intent(Intent.ACTION_SENDTO, emailUri);
// 直接发邮件
Intent intent new Intent(Intent.ACTION_SEND);
String[] tos { zuolongsnailgmail.com };
String[] ccs { zuolongsnail163.com };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, the email text);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.setType(text/plain);
Intent.createChooser(intent, Choose Email Client); // 发短信
Intent intent new Intent(Intent.ACTION_VIEW);
intent.putExtra(sms_body, the sms text);
intent.setType(vnd.android-dir/mms-sms);
// 直接发短信
Uri smsToUri Uri.parse(smsto:10086);
Intent intent new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra(sms_body, the sms text);
// 发彩信
Uri mmsUri Uri.parse(content://media/external/images/media/23);
Intent intent new Intent(Intent.ACTION_SEND);
intent.putExtra(sms_body, the sms text);
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);
intent.setType(image/png); // 卸载应用
Uri uninstallUri Uri.fromParts(package, com.app.test, null);
Intent intent new Intent(Intent.ACTION_DELETE, uninstallUri);
// 安装应用
Intent intent new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(/sdcard/test.apk), application/vnd.android.package-archive); // 在Android Market中查找应用
Uri uri Uri.parse(market://search?q愤怒的小鸟);
Intent intent new Intent(Intent.ACTION_VIEW, uri);