安卓学习(二) Inten传值

(接上篇。。。)

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

  

  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,则就是调用拨号。。如此这般。。。

第一页给第二页传值

  首先铺垫一下,通过第一页上的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进行简单的跳转、翻页、传值就结束了。。