安卓app,一般会有多个页面,即多个活动,在各个活动之间穿梭,怎么实现呢?这里就用到了Intent
1.显示的使用intent
首先我们创建一个项目,然后添加一个简单的activity,里面添加一个Button,并设置静听事件。这个比较简单,如果不会做,可以参考我安卓学习的第一篇博客。
在监听事件中添加如下代码使用Intent:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "click button 1", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
我首先构造出一个Intent,调用了Intent的构造方法,传入了两个参数:当前上下文,与目标活动。这里需要注意一点,当前上下文需要指定为FirstActivity.this,我之前觉得,这个方法是写在FirstActivity.java中,直接使用this不就可以了嘛,但是后来发现出bug了,问了麻老师,了解到,当前代码是写在内名内部类View.OnClickListener(){}中,因此必须写FirstActivity.this。 然后嗲用startActivity(intent)方法。根据字面意思就可以知道,这个方法的作用是开始一个活动,执行intent。
这就是现实使用intent,当然也可以传参,后面再说。
2.隐式Intent
隐式Intent比较含蓄,不明确指出要启动哪个活动,而是通过两个参数:action与category,由系统分析intent,找到合适的intent去启动。具体怎么做呢?
首先打开AndroidManifest.xml,添加如下代码:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="abc"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="def"/>
</intent-filter>
</activity>
首先赋值给action,或许专业的开发人员,不会这么写,但是我这是为了测试各个参数的作用,因此可能不太规整,取名“abc”,当然也为了更好的明白这个地方对应actiivity中的什么地方。
接下来设置category,android.intent.category.DEFAULT的作用貌似是匹配那些没有赋值category的intent。而def则是对应activity中的category参数,下面是activity中的代码,对比看可能更明白。
Intent intent2 = new Intent(abc);
intent2.addCategory("def");
startActivity(intent2);
这个是隐式的使用intent,在构造方法传入的参数就是上面的action中内容。然后下面addCategory可以添加参数,这里添加了def,就会被前面的<category android:name="def">进行拦截。然后调用startActivity(intent2)执行intent2。
3 向下一个活动传值
intent还可以在传参数给下一个活动,具体操作如下:
Intent intent = new Intent(this, SecondActivity.class);
String data = "test my data!!!!";
intent.putExtra("extra_data", data);
startActivity(intent);
intent中提供了putExtra()方法,可以让我们把想传的参数放入intent,启用了下一个活动时,可以从intent中取得这些数据。代码比较简单,就不讲咯。
接下来查看接收方:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
首先通过getIntent()获取到intent对象,然后通过getStringExtra获取到存储的String对象,然后Log打印。当然如果时int型数据可以使用getIntExtra()方法,布尔型可以getBooleanExtra()获取。
4.返回数据给上一个活动
在开发项目的时候,经常有返回数据给上一个项目,这个怎么做呢?activity中有一个方法startActivityForResult()专门用于在活动销毁时,返回参数给上一个活动。
直接上代码:
首先在第一个activity(FirstActivity)中,我们通过一个startActivityForResult()方法启动新的活动:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "click button 1", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
});
需要两个参数:第一个参数就是Intent,类似前面讲的,这里不赘述了;第二个参数是请求码,唯一就可以,具体作用后面的看到代码就知道了。
下面我们看一下跳转之后的活动怎么在关闭时返回参数给前一个活动:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data", "hahahaha");
setResult(RESULT_OK, intent);
finish();
}
});
可以看到,我们依旧构建了一个intent,只不过这个intent只用于传参数,没有实现跳转活动。首先我们传入参数,然后调用了setResult()方法,这个方法比较重要,专门用于返回数据给上个活动。需要两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED两个值;第二个参数把带有参数的intent传回去。然后调用finish销毁了当前的活动。
然后就需要在第一个活动中接收处理这些返回的数据,需要重写防范onActivityResult();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String resultData = data.getStringExtra("data");
Toast.makeText(FirstActivity.this, resultData, Toast.LENGTH_SHORT).show();
Log.d("FirstActivity", resultData);
}
break;
default:
}
}
方法需要三个参数,第一个参数是我们在启动活动时传入的请求码,即 1;第二个参数时返回的处理结果,即RESULT_OK,第三个参数时带有返回数据的intent。因为一个活动中,可能有多个startActivityForResult()方法,因此需要根据requestCode来判断数据来源。确定来源之后,判断结果是否成功,最后再取值打印。
太晚了,先这样吧。good night!