安卓学习(二)

(接上篇。。。)

隐式Intent

一种隐式转换

  还是存在两个Activity,但是现在不是在代码中通过new Intent中明显的写出当前context和要跳转的class。而是可以通过“暗语”(类似于消息?)来触发Activity的Intent。

  首先,可以在要跳转过去的AndroidManifest.xml的XML中对于activity_main_activity2(要跳转过去的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的标记






//这个是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),比如调用浏览器,调用拨号器等等,我们可以这样实现:

  

  1. 不用新建Activity了(因为要调用的是浏览器之类的,已经存在了。。。而且是别人的Activity)。

  2. 在诸如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进行简单的跳转、翻页、传值就结束了。。

posted @ 2015-07-04 20:44  二刀  阅读(236)  评论(0)    收藏  举报