zoukankan      html  css  js  c++  java
  • Android教程 -04 启动其它Activity,静态工厂设计模式传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    意图 Intent

    一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity。启动Activity有多种方式。我在这简单总结下:

    学习开启其它的Activity,首先需要了解意图:
    Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。Intent代表一个应用”想去做什么事”,你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。

    显示意图

    这里写图片描述

    显示意图顾名思义, 其实就是把要开启的Activity的名字赤裸裸的写在代码中。
    如下面代码就是要启动Demo2Activity,当然肯定需要上下文(Context)这个上帝类。需要注意的是要启动的activity必须要在清单文件(AndroidManifest.xml)中进行配置。

            //  初始化Button控件
            button= (Button) findViewById(R.id.button);
            //  设置button的点击事件
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //  声明Button的点击事件 跳转到Demo2Activity
                    //  参数1 上下文  参数2 跳转Activity的字节码
                    Intent intent = new Intent(getApplicationContext(), Demo2Activity.class);
                    startActivity(intent);
                }
            });

    显示意图启动Activity的速度略快,不过有些局限性,只能开启自己程序中的Activity

    隐式意图

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    1. 相对于显示意图更加含蓄
    2. 需要指定当前Activity 能够响应的action或category。

    每个Activity要想能被开启都需要在清单文件(AndroidManifest.xml)中进行配置,当配置完成,程序部署到手机的时候,该Activity会加入到系统的列表中。在配置的时候,我们可以对activity进行一些描述(添加action或category),另一个Activity通过这些描述就可以开启这个Activity。
    参考下图:
    这里写图片描述

    代码如下

        <!--在清单文件中描述Demo2Activity-->
        <activity
            android:name=".Demo2Activity"
            android:label="@string/title_activity_demo2" >
            <intent-filter>
                <action android:name="aaa.bbb.ccc" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
         //  初始化Button控件
           button = (Button) findViewById(R.id.button);
           //  设置button的点击事件
           button.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   //通过隐式意图开启activity
                   Intent intent = new Intent();
                   intent.setAction("aaa.bbb.ccc");
                   intent.addCategory("android.intent.category.DEFAULT");
                   startActivity(intent);
               }
           });

    隐式意图不仅可以开启自己程序的Activity,还可以开启其它程序的Activity,一般的原则是开启自己程序的Activity多用显示意图。

    隐式意图的常见操作

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    拨打电话

        /**
         * 拨打电话
         */
        public void dail(View v){
            Intent intent=new Intent();
            intent.setAction(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:1333333333"));
            startActivity(intent);
        }

    打开浏览器

        /**
         * 打开浏览器
         */
        public void goToBrowser(View v){
            Intent intent=new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.baidu.com"));
            startActivity(intent);
        }

    分享文本

       /**
        * 分享
        */
       public void share(View v){
           Intent intent=new Intent();
           intent.setAction(Intent.ACTION_SEND);
           // 指定参数的类型
           intent.setType("text/plain"); // "image/png"
           // 设置要分享的文本
           intent.putExtra(Intent.EXTRA_TEXT,"于连林很帅");
           startActivity(intent);
       }

    需要注意的是,如果想让你的程序具备分享其他程序文本的功能,需要在你想要分享的Activity添加如下配置:

        <activity
             android:name=".MainActivity"
            >
             <intent-filter>
                 <action android:name="android.intent.action.SEND" />
                 <data android:mimeType="text/plain" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>

    这样我们程序的MainActivity就具备分享文本的功能了。

    Activity之间传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    Activity之间传递数据是很常见的操作,传递数据核心的方法就是通过Intent的putExtra方法传递,可以传递的类型包括八大基本类型,字符串和实现Serializable或Parcelable接口的对象,也可以传递ArrayList集合(集合里对类型有约束,允许的类型包括String,Parcelable)。
    写法和用map集合添加数据一样, 需要用到key-value键值对。

    我们以SendDataActivity和RDataActivity为例演示一下代码:

        //  SendDataActivity传递数据给RDataActivity
        public void sendData(View v){
            Intent intent=new Intent(this,RDataActivity.class);
             intent.putExtra("key","要传递的数据");
            // 打开Activity
            startActivity(intent); 
        }

    下面是RDataActivity接受数据:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_rdata);
            // 获取到开启当前Activity的意图
            Intent intent =getIntent(); 
            // Value就是我们接受的数据
            String  value=intent.getStringExtra("key");
            //...
        }

    需要注意的是两个Activity的key(就是代码中”key”) 必须保持一致。但是这种写法有个潜在的问题。

    静态工厂设计模式传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    在实际开发的过程中,往往同时有多个程序员写不同的Activity。经常会出现传递数据的Activity和接受数据的Activity不是一个程序员写的。为了保持key统一,就需要两个程序员之间进行沟通,这样大大提高了程序的耦合性,程序变的不那么容易维护。

    安卓中的基本问题之一就是对键/值对的持有。因为bundle 需要键/值对,所以你总是需要一个key。然而问题是哪里保存这些key?

    与其创建另一个类的对象,不如让对应的类自己创建对象。

    我们接下来修改一下RDataActivity的代码,添加一个静态方法,其余不用变。让RDataActivity自己创建自己的Intent

        public static Intent newIntent(Context context,String value){
            Intent intent=new Intent(context,RDataActivity.class);
            intent.putExtra("key",value);
            return intent;
        }

    调用者类无需知道intent以及key的任何事情。SendDataActivity只需告诉RDataActivity,”嘿,我需要一个带有这个数据的intent”。就是这样,RDataActivity会做完其它的事情。我们接下来修改下SendDataActivity的sendData方法

      public void sendData(View v){
           Intent intent=RDataActivity.newIntent(this,"value");
           startActivity(intent);  // 开启RDataActivity
       }

    这样改完以后代码就变的容易维护了。

    返回数据给之前的Activity

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷

    回传数据

    这时候就用到两个核心的方法:
    1. startActivityForResult()
    2. onActivityResult()

    开启Activity要用startActivityForResult了,我们继续把上面的代码改造下:

        //  SendDataActivity传递数据给RDataActivity
        public void sendData(View v){
             Intent intent=RDataActivity.newIntent(this,"value");
             // 修改开启Activity的方法
            startActivityForResult(intent,0);  //参数2是 requestCode请求码
        }

    RDataActivity添加代码:

        // 退出按钮点击事件, 点击退出
        public void exit(View v){
            Intent  intent=new Intent();
            intent.putExtra("result","resultData"); //回传的数据
            setResult(0, intent); //参数1: resultCode 结果码
            finish();  // 主动关闭当前Activity
        }

    当RDataActivity退出的时候就会调用SendDataActivity的onActivityResult()方法

       @Override
       // requestCode 请求码   resultCode结果码  data传递的数据
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(resultCode==0&&data!=null){
                String result=data.getStringExtra("result");
                Toast.makeText(this,result,Toast.LENGTH_LONG).show();
            }
        }
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329912.html
Copyright © 2011-2022 走看看