• 安卓学习(二)


    (接上篇。。。)

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

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

  • 相关阅读:
    chrome 开发者工具——前端实用功能总结
    而立之年——回顾我的前端转行之路
    编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)
    手把手带你入门前端工程化——超详细教程
    手把手教你搭建 Vue 服务端渲染项目
    前端项目自动化部署——超详细教程(Jenkins、Github Actions)
    前端国际化辅助工具——自动替换中文并翻译
    深入了解 webpack 模块加载原理
    实现一个 webpack loader 和 webpack plugin
    博客本地编辑器-OpenLiveWriter安装使用
  • 原文地址:https://www.cnblogs.com/tilv37/p/4621225.html
Copyright © 2020-2023  润新知