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();
            }
        }
  • 相关阅读:
    C# 操作Excel,使用EPPlus
    结构型设计模式之代理模式(Proxy)
    结构型设计模式之组合模式(Composite)
    结构型设计模式之桥接模式(Bridge)
    C#操作windows事件日志项
    C#操作XML序列化与反序列化
    日志组件Log4Net
    UI Automation 简介
    Selenium
    Selenium
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329912.html
Copyright © 2011-2022 走看看