只有一个活动的安卓应用确实太简单了,这一节我们一起来看看如何由主活动跳转到其他的活动,以及活动的返回,参数的传递。
在活动之间穿梭主要有两种方式
1、使用显式Intent
2、使用隐式Intent
2.3.1显示Intent的实现
button1.setOnclickListenter(new View.OnclickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
}
startActivity(intent);
});
点击按钮1之后由FirstActivity跳转到SecondActivity,代码非常简单
2.3.2隐式Intent的实现
我们新建项目之后打开AndroidManifest.xml,发现主活动的代码是这样的
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
新建一个SecondActivity,它在xml文件中的代码如下
<activity android:name=".SecondActivity"></activity>
与主活动相比缺了【intent-filter】标签
【intent-filter】的字面意思就是【Intent过滤器】
所以我们可以给SecondActivity添加“过滤器”,让别的活动可以找到它。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
先给出一个代码实例
button1.setOnclickListenter(new View.OnclickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
}
startActivity(intent);
});
只有【action】和【categery】中的内容同时匹配上Intent中指定的action和category时,这个活动才能相应Intent。但上面这个例子没有写【category】,这是因为【category android:name=”android.intent.category.DEFAULT”/】是一种默认的category。
xml修改如下
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
代码如下
button1.setOnclickListenter(new View.OnclickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
}
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
});
2.3.3隐式Intent的其它用法。
比如通过【action】打开网页
button1.setOnclickListenter(new View.OnclickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
});
同时,我们还可以在【intent-filter】标签中再配置一个【data】标签,用于更精确的指定当前活动能够相应什么类型的数据。
【data】标签中主要有以下配置内容
android:scheme ; 用于指定数据的协议部分,如上例的http部分
android:host ; 用于指定数据的主机名部分, 如上例的www.baidu.com
android:port ; 用于指定数据的端口部分,一般紧跟在主机名之后,上例中是默认的80端口
android:path; 用于指定主机名和端口之后的东西
android:mimeType; 用户指定可以处理的数据类型,可以通过通配符来实现
具体的使用可以自己尝试一下。
2.3.4 向下一个活动传递数据
代码如下
在FirstActivity中
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", "hello, sir");
在SecondActivity中
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
2.3.5 返回数据给上一个活动
在FirstActivity中代码
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
startActivityForResult方法中的1是传过去的请求码,唯一即可。
在SecondActivity中代码
Intent intent = new Intent();
intent.putExtra("data_return", "Hello, FirstActivity");
setResult(RESULT_OK, intent);
finish();
同时我们需要在FirstAcitivity中重写 onActivityResult方法接受返回的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
if(resultCode == RESULT_OK) {
String returndata = data.getStringExtra("return_data");
}
}
}
什么时候返回呢?可以自定义按钮,点击按钮事件后返回。那安卓手机都会带有返回键,如果用户是通过返回键返回的怎么办呢?
重写onBackPressed方法就ok了。
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello, FirstActivity");
setResult(RESULT_OK, intent);
finish();
}