(接上篇。。。)
隐式Intent
一种隐式转换
还是存在两个Activity,但是现在不是在代码中通过new Intent中明显的写出当前context和要跳转的class。而是可以通过“暗语”(类似于消息?)来触发Activity的Intent。
首先,可以在要跳转过去的AndroidManifest.xml的XML中对于activity_main_activity2(要跳转过去的Activity)加入如下代码:
<activity
android:name=".MainActivity2Activity"
android:label="@string/title_activity_main_activity2" >
<intent-filter>
<action android:name="com.example.dingshuo.textviewdemo.ACTION_START111"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
主要关注的是intent-fliter标签中的内容,action中就想到于一个“消息,通知”,表示MainActivity2Activity这个Activity在收到这个“消息”的时候,就是做出相应的action(动作),写了几次,发现这个“消息”应该不是一个系统规定的,可以是任意的,比如写个“ABC”??
实现代码如下:(以下代码实在MainActivity中写的)
nBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.dingshuo.textviewdemo.ACTION_START111");
startActivity(intent);
}
});
category则是一个更精准的条件,只有当action和category中的内容同时匹配,才可以使用Intent。可以先修改一下category中的内容。(category试验发现,也是可以填写任意字符串)
万分注意:一定要加默认的category,直接修改默认category会造成程序崩溃!!!!!
//这个是AndroidManifest.xml对于活动2的标记
<activity
android:name=".MainActivity2Activity"
android:label="@string/title_activity_main_activity2" >
<intent-filter>
<action android:name="com.example.dingshuo.textviewdemo.ACTION_START111"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="ABC"/>
</intent-filter>
</activity>
//这个是MainActivity里的代码
nBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.dingshuo.textviewdemo.ACTION_START111");
intent.addCategory("ABC");
startActivity(intent);
}
});
另一种隐式Intent
可以简单的认为,这种Intent的消息是用来打开其他活动的(非当前app),比如调用浏览器,调用拨号器等等,我们可以这样实现:
-
不用新建Activity了(因为要调用的是浏览器之类的,已经存在了。。。而且是别人的Activity)。
-
在诸如Button的Click事件中添加Intent响应即可。
intentBtn2.setOnClickListener(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.ACTION_VIEW是一个系统的action常量。SetData用来指定通过Uri内容来指定intent的操作对象。Uri中包含协议和内容,如上看分析出协议是http,内容是baidu.com,则实际功能就是调用外部可响应Http协议的程序打开百度页面。如果将Uri内参数改为tel:10086,则就是调用拨号。。如此这般。。。
Inten传值
第一页给第二页传值
首先铺垫一下,通过第一页上的Button开启第二页,然后第二页接收到第一页送出去的值。
//主活动上的Button点击事件
//建立显示Intent,使用putExtra函数构建要传的值,第一个参数是“键”,第二个是“值”
intentBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data=" 这是主活动传递过来的值";
Intent intent=new Intent(MainActivity.this,MainActivity2Activity.class);
intent.putExtra("MainIntentValue1",data);
startActivity(intent);
}
});
//这是第二页活动代码
//在OnCreate中加入以下代码,实例化一个intent,用getIntent来获取使第二页打开的intent
//用getStringExtra函数通过键值取得传递值,用TextView进行显示
Intent intent=getIntent();
String data=intent.getStringExtra("MainIntentValue1");
textView=(TextView)findViewById(R.id.intenValueText);
textView.setText(data);
第二页返回第一页传值
具体流程是这样,第一页开启第二页,第二页开启后点击按钮关闭本页,回退到第一页,此时第一页上显示出第二页回传给第一页的值。
//MainActivity代码
intentBtn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//使用显示Intent
Intent intent=new Intent(MainActivity.this,MainActivity2Activity.class);
//用于接受下一步的Activity,1相当于一个请求码,用来判断回调的
startActivityForResult(intent,1);
}
});
//MainActivity2Activity代码
Btn2=(Button)findViewById(R.id.button3);
Btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//本Intent只为了传值,不进行实际跳转
intent.putExtra("data_return","这是回调的传值");
//注意参数2 ,这个intent一般是带有传值的,函数将这个intent的值回传出去
setResult(RESULT_OK,intent);
//相当真机的back键,销毁该页面
finish();
}
});
在上两段代码写完后,还有一个重要的步骤,那就是在MainActivity中重写父类的onActivityResult方法,原因是在主活动中我们是通过startActivityForResult启动的副活动,尔当服活动销毁后,会回调onActivityResult方法,所以需要在这个函数中获取回传的值。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// requestCode对应startActivityForResult(intent,1)的1
//第二个参数对于副活动 setResult(RESULT_OK,intent)中的RESULT_OK
//第三个参数就是携带的数据的返回intent了
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnedData=data.getStringExtra("data_return");
returnValue.setText(returnedData);
}
}
}
上述方法是通过第二页的finish()来触发的。如果通过实体的back键,则无改效果。
需要崇业onBackPress方法
//MainActivity2Activity代码
@Override
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("data_return","这是通过back键返回数据");
setResult(RESULT_OK,intent);
finish();
}
到此,通过Intent进行简单的跳转、翻页、传值就结束了。。