使用intent回启动activity

使用intent来启动activity

Intent最常见的用途是绑定应用程序组件,并在应用程序之间通信.Intent用来启动Activity,允许创建不同屏幕的一个工作流。

要创建并显示一个Activity,可以调用startActivity,并传递给它一个Intent,如:

startActiiy(myintent);

可以构造Intent来显示地指定要打开的Activity类,或者包含一个目标Activity必须执行的动作。在后面一种情况时,运行时将会使用一个成为"intent解析"的过程来动态选择activity.

如果想追逐来自子activity的反馈,可以使用startActivityForResult方法。

要显示地选择要启动的Activity类,可以创建一个新的Intent来指定当前activity的上下文以及要启动的Activity类,然后把这个Intent传递给startActivity.

Intent intent = new Intent(AActivity.this,MyOtherActivity.class);
startActivity(intent);

在调用activity之后,新的activity将会被创建,将会依次调用其oncreate(),onstart(),onresume(),它会移动到activity栈的顶部。

调用新Activity的finish或按下设备的返回键将关闭该activity,并把它从栈中移除。


隐式的intent和运行时迟绑定

隐式的Intent提供了一种机制,可以让匿名的应用程序组件响应动作请求。这意味着可以要求系统启动一个可执行给定动作的Activity,而不必知道需要启动哪个应用程序或activity.

例如可以使用一个隐式的intent来请求一个在电话号码(表示为一个URI)上执行动作(拨号)。

Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:13195338962"));
startActivity(intent);

android会解析这个intent,并启动一个新的Activity,该activity会提供对这个电话号码进行拨号的动作,就是我们手机自带拨号的那个界面。

当构建一个新的隐式的intent时,需要指定要执行的动作。另外,也可以提供执行那个动作需要的数据的URI。还可以通过向intent添加extra来向目标activity发送额外的数据。

当使用intent来启动一个activity时,android 将在运行时把它解析为最适合在指定的数据类型上执行所需动作的类。如果多个Activity都能够执行指定的动作,则会向用户呈现各种选项。


确定intent能否解析

在自己的应用程序中利用第三方应用程序的Activity和Service是十分方便的。但是,你无法保证用户设备上安装了特定的某个应用程序,或者设备上有能够处理你的请求的应用程序。因此,在调用startActivity之前,确定调用是否可以解析为一个Activity是一种很好的做法。

通过调用intent的resolveActivity方法,并向该方法传入包管理器,可以对包管理器进行查询,确定是否有Activity能够启动以响应intent.

PackageManager pm = getPackageManager();
if(intent.resolverActivity(pm) != null){
	startActivity(intent);
}

从activity返回结果

通过startActvity启动的Activity独立于其父activity,并且在关闭时不会提供任何反馈。

当需要反馈时,可以启动一个activity作为另一个activity的子activity,用它向父actvity传递结果。子activity只是以一种不同的方式启动的activity.因此,必须在mainfest文件中注册他们,就像其他的activity一样。

startActivityForResult(intent,1);

后面是接收返回值的标识

子activity通过设置setResult返回结果:参数为结果码和数据本身

setRsult(ACTIVITY.RESULT_OK,new Intent(Intent.ACTION_PICK,"ssss"););


父actvity通过OnaCTIVITYResult来处理子activity返回的结果。

@override
public void onActivityResult(int requestCode,int resultCode,Intent data){
super....
	switch(requestCode){
	case (1):
		if(rsultCode == Activity.RESULT_OK){
		String s = data.getData();
	}
}
}