Android:Intnet详解

1.Intent简介:
Intent是一种消息机制,它翻译为意图,在Android中可以声明为执行某个动作的意图,并且通常和一组数据绑定在一起。
Intent支持Android设备上可用的任意两个应用程序组件之间的交互,不管他们是哪个应用程序的一部分都是如此。
Intent最常用的用法:
显式:指定要加载的类来启动一个新的活动
隐式:对某一组数据执行某个动作,来启动新的活动。
Intent也可以用来在系统范围内广播消息。在任何应用程序中都可以注册一个广播接收器来监听和响应这些广播的Intent。
Android使用广播Intent来公布系统事件,例如网络连接状态或者电池电量的变更。

2 Intent的实际用法
2.1 显示的启动新的活动,示例代码如下:
Intent intent = new Intent(MyAcitivity.this, MyOtherActivity.class);
startActivity(intent);

2.2 隐式的Intent,需要一组数据以及在这组数据上面欲执行的动作,示例代码如下:
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("13533040225"));
startActivity(intent);

2.3 广播Intent其实很简单,在应用程序组件中,可以构建希望广播的Intent,然后使用sendBroadcast方法来发送他们。
可以对Intent的动作,数据和category进行设置,从而是广播接收器能够精确的确定他们的需求。在这种方案中,Intent的动作字符串可以用来识别要广播的事件,所以他们应该是能够识别事件的唯一字符串。习惯上,动作字符串使用与Java包相同的构建方式,如下代码所示:
public static final String NEW_LIFEFORM_DETECTED = "com.paad.action.NEW_LIFEFORM";

Intent intent = new Intent(NEW_LIFEFORM_DETECTED);
intent.putExtra("lifeforName",lifeforType);
intent.putExtra("longitude",currentLongitude);
intent.putExtra("latitude",currentLatitude);

sendBroadcast(intent);

广播接收器可以用来监听广播的Intent。要使用一个广播监听器,需要对其进行注册,既可以使用代码,也可以在应用程序清单中注册。当注册一个广播接收器的时候,必须使用一个Intent Filter来制定它要监听哪些Intent。
要创建一个新的广播接收器,需要扩展BroadcastReceiver并重写OnReceive事件。如下
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context,Intent intent){
}
}

当接收到一个广播的Intent与注册接收器的Intent Filter匹配时,就会执行onReceive方法。onReceive处理程序必须在5秒之内完成,否则会显示Application Unresponsive对话框。

下面分别说明在应用程序清单中注册广播接收器和在代码中注册广播接收器
代码清单中注册示例:
<receiver android:name=".LifeformDetectedBroadcastReceiver">
<intent-filter>
<action android:name="com.paad.action.NEW_LIFEFORM" />
</intent-filter>
</receiver>

使用代码注册广播接收器示例:
IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED);
LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();
registerReceiver(r,filter);

要注销一个广播接收器,可以在应用程序上下文中使用unregisterReceiver方法,并传递给他一个广播接收器实例。如:
unregisterReceiver(r);


3 Intent Filter
3.1 Intent Filter在应用程序清单中节点标签详解
<action> 使用android:name属性来指定欲执行的动作,动作应该是唯一的字符串,所以最好的做法是使用基于java的包命名系统。
<category> 使用android:category属性来制定应该在那种环境下为动作提供服务。每一个Intent Filter标签都可以包含多个category标签,既可以指定自己的category,也可以使用Android提供的标准值。
ALTERNATIVE:把这个动作指定为可以作为“执行在特定数据类型上的默认动作”的可选项,例如:一个联系人的默认动作是对其进行查看,而可选的动作则是对其进行编辑或者删除。
SELECTED_ALTERNATIVE:
BROWSABLE :指定一个在浏览器内部可用的动作。
DEFAULT :通过设置这个category可以使一个组件成为Intent-Filter定义的数据值的默认动作。
GADGET: 指定这个活动可以嵌入到另外一个活动中执行。
HOME: home活动是设备启动时显示的第一个活动(启动屏幕)。通过将一个Intent-Filter category设置为home,而不用制定为一个活动,就可以把它作为本地home屏幕的可选项。
LAUNCHER: 使用这个category会让一个活动出现在程序的启动器中。


<data> data标签允许指定组件可以执行的匹配数据;如果组件可以处理多种数据,那么可以包含多个模式。可以使用以下属性的任意组合来制定你的组件所支持的数据:
android:host 指定一个有效的主机名(如com.google)
android:mimetype 允许指定组件可以处理的数据类型
android:path URI的有效路径
android:port 指定主机的有效端口
android:scheme 要求一种特定的模式

3.2 Intent解析
Intent解析是指决定启动哪一个活动的过程。
解析步骤如下:
(1) Android把所有来自已安装包中可用的Intent Filter放到一个列表中。
(2) 那些与Intent被解析时,相关联的动作以及category不匹配的Intent Filter将会从列表中移除。
a.如果IntentFilter 包含了指定的动作,或者没有指定任何动作,那么就认为动作匹配了。
b.catagory匹配更加严格。 IntentFilter必须包含待解析的所有category。一个没有指定category的IntentFilter只能和没有任何category的Intent相匹配。
(3) 最后,Intent数据URI的每一个部分都和Intent Filter的data标签进行比较。如果IntentFilter定义了模式,host/authority,path或者mime类型,那么这些值就要和Intent的URI进行比较,任何不匹配都会把IntentFilter从列表中移除。没有指定数据值的IntentFilter将会和所有的IntentFilter数据值匹配。


4 启动新活动与子活动
一个使用startActivity启动的活动与它的父活动是不相关的,因此当它被关闭时,不会提供任何反馈。
另外,可以把一个活动作为子活动启动,这样它就必然会连接到它的父活动。因此当子活动被关闭时,就会触发他们的父活动的一个事件处理程序。对于一个活动为另外一个活动提供数据输入的情况,子活动是最合适的选择。
子活动的创建方式与普通的活动的创建方式是相同的,它必须在应用程序清单中进行注册。任何在清单中注册过的活动都可以作为子活动而打开。

4.1启动子活动
startActivityForResult方法的工作方式与startActivity很相似,但是有一很重要的区别。除了需要启动哪个活动的Intent之外,还需要传入一个request码。之后,这个值将用来唯一的标志返回了结果的子活动。
启动一个子活动的框架代码如下所示:
private static final int SHOW_SUBACTIVITY = 1;

Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);

和常规的活动一样,子活动也可以被显示或者隐式的启动。下面的框架使用了显示的Intent来启动一个新的子活动,从而选择一个联系人:
private static final int PICK_CONTACT_SUBACTIVITY = 2;

Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
stratActivityForResult(intent,PICK_CONTACT_SUBACTIVITY);

当子活动可以关闭的时候,则在调用finish之前调用setResult,并向调用它的活动返回一个结果。
setResult方法有两个参数:结果码和代码Intent结果的有效数据。
结果码通常是Activity.RESULT_OK或者Activity.RESULT_CANCELED。在某些情况下,可能希望使用自己的响应码来处理应用程序特定的选择;setResult支持任意的整数值。
作为结果返回的Intent可以向一个包含某些内容的URI以及一些附件来返回额外的信息。
下面的一段代码来自于一个子活动的onCreate方法,展示了一个OK按钮和一个Cancel按钮是如何向调用它的活动返回不同的结果的:
Button okButton = (Button)findViewById(R.id.ok_btn);
Button cancelButton = (Button)findViewById(R.id.cancel_btn);

okButton.setOnClickListener(new View.OnClickListener() {
public void onclick(View view){
Uri data = Uri.parse("content://horses/" + selected_horse_id);

Intent result = new Intent(null, data);
result.putExtra(IS_INPUT_CORRECT, inputCorrect);
result.putExtra(SELECTED_PISTOL, selectedPistol);
setResult(RESULT_OK, result);

finish();
}
});

cancelButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
setResult(RESULT_CANCELED, null);

finish();
}
});

4.2 处理子活动结果
当一个子活动被关闭时,它会触发其父活动的onActivityResult事件。
通过重写这个方法来处理从子活动返回的结果。onActivityResult接收多个参数:
请求码:请求码用来标志返回的子活动
结果码:子活动返回的结果码,用来说明子活动运行的结果。它可以是任意整数值,但是一般情况下是Activity.RESULT_OK和Activity.RESULT_CANCELED。
注意:如果子活动非正常的关闭或者在关闭之前没有指定结果码,那么结果码默认为Activity.RESULT_OK.
数据:Intent用来绑定所有返回的数据。根据子活动目标的不同,它会相应的包含代表从一个列表中选择的特定数据集的URI。另外子活动也可以使用“extras”机制,作为基本值返回额外的信息。
private static final int SHOW_SUB_ACTIVITY_ONE = 1;
private static final int SHOW_SUB_ACTIVITY_TWO = 2;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);

switch(requestCode){
case SHOW_SUB_ACTIVITY_ONE: // TODO
break;

case SHOW_SUB_ACTIVITY_TWO: // TODO
break;
}
}

转载于:https://www.cnblogs.com/deagle/articles/2106564.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值