zoukankan      html  css  js  c++  java
  • Activity传递数据的几种方式及返回结果

    1. 使用全局变量传递数据

    1). 新建MyAPP.java  继承 Application 类

    /* 
     * 查看Android官方文档。 
     * Application 是所有那些需要维护全局application状态的基类。你可以提供你自己的实现机制通过在在AndroidManifest.xml中提供你自己的需要声明 
     * 的标记你自己的标签。 
     * onCreate()方法是在应用程序启动的时候被回调的。 
     */  
    public class MyApp extends Application {  
         
        public String name;  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
          
        @Override  
        public void onCreate() {  
            // TODO Auto-generated method stub   
            super.onCreate();  
            setName("AHuier");  
        }  
    }  
    2).配置AndroidManifest.xml  清单文件,使用 android:name=".MyApp" 来指定全局变量名称。

    <application  
        android:name=".MyApp"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name" >  
        <activity  
            android:name="com.android.intentglobal.Main"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
      
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
        <activity android:name="com.android.intentglobal.Other"></activity>  
    </application>  
    3). 传递数据

    private MyApp myApp;  
     ...  
    myApp = (MyApp)getApplication();  
    myApp.setName("kunhuixu"); //修改之后的名称   
    Intent intent = new Intent(Main.this, Other.class);  
    startActivity(intent);  

    4).接受数据

    private MyApp myApp;  
    private TextView textView;  
     ...  
    myApp = (MyApp)getApplication();  
    textView.setText("--- The app name ---" + myApp.getName());  




    2. 使用剪切板传递数据

    备注:如果需要传递对象,可先将对象序列化为字符串传递,此处使用对象举例

    1).  新建可序列化对象MyData.java 类

    public class MyData implements Serializable {  
      
        private String name;  
        private int age;  
      
        public MyData(String name, int age) {  
            super();  
            this.name = name;  
            this.age = age;  
        }  
      
        // 提供一个toString()方法   
        @Override  
        public String toString() {  
            return "MyData [name=" + name + ", age=" + age + "]";  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
      
        public int getAge() {  
            return age;  
        }  
      
        public void setAge(int age) {  
            this.age = age;  
        }  
      
    }  

    2). 传递数据

    MyData myData = new MyData("AHuier", 22);               
    //将对象转换成字符串   
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
    String base64String = "";  
    try {  
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);  
        objectOutputStream.writeObject(myData);  
    //使用Android中提供的 Base64 工具类,这个类主要是用来对对象进行压缩也解码的过程,使用默认方式   
        base64String = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);  
        objectOutputStream.close();  
    } catch (Exception e) {  
        // TODO: handle exception   
    }  
    ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);  
    clipboardManager.setText(base64String);  
    Intent intent = new Intent(IntentDemo.this, Other.class);  
    startActivity(intent);  
    

    3). 接受数据

         ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);  
         String msgString = clipboardManager.getText().toString();  
           
    //将字符串 msgString 还原为对象   
         byte[] base64_byte = Base64.decode(msgString, Base64.DEFAULT);  
         ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte);  
         try {  
             ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);  
             MyData myData = (MyData)objectInputStream.readObject();  
             textView.setText(myData.toString());  
         } catch (Exception e) {  
             // TODO: handle exception   
         }  




    3.使用Intent传递数据

    1) 传递数据

                    Intent intent = new Intent(IntentDemo.this, Other.class);  
                    // 在Intent中传递数据   
                    intent.putExtra("name", "AHuier");  
                    intent.putExtra("age", 22);  
                    intent.putExtra("address", "XiaMen");  
                    // 启动Intent   
                    startActivity(intent);  

    2) 接受数据

            Intent intent = getIntent();  
            int age = intent.getIntExtra("age", 0);  
            String name = intent.getStringExtra("name");  
            String address = intent.getStringExtra("address");  




    4.使用静态变量传递数据

    备注:使用Intent可以很方便的在不同的Activity之间传递数据,这个也是官方推荐的方式(方式3),但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题。

    1). 新建静态变量类Other.java
    public static int age;  
    public static String name;  
    public static String address;  

    2). 传递数据
    Intent intent = new Intent();  
    intent.setClass(IntentDemo.this, Other.class);  
    Other.age = 22;  
    Other.name = "AHuier";  
    Other.address = "XiaMen";  
    startActivity(intent);  

    3). 接受数据
    <pre name="code" class="java">        int age = <span style="font-family: 'Courier New';">Other.age</span>
            String name = <span style="font-family: 'Courier New';">Other.name</span>
            String address = <span style="font-family: 'Courier New';">Other.address;  </span>
     
    
    


    5. 传递数据并接受返回结果
    备注:计算器等情景,在A中输入,在B中计算,再返回到A中显示。
    1). 从A中传递数据(传递方式可以使用以上4种方案)
                    int a = Integer.parseInt(inputA.getText().toString());  
                    int b = Integer.parseInt(inputB.getText().toString());  
      
                    Intent intent = new Intent(IntentResult.this, Other.class);  
                    intent.putExtra("a", a);  
                    intent.putExtra("b", b);  
                    startActivityForResult(intent, RESQUESTCODE); // 如果RESQUESTCODE  
                                                                  // >= 0,表示可以返回结果  

    2). 在A中重写 onActivityResult  处理返回数据
        @Override  
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            super.onActivityResult(requestCode, resultCode, data);  
            // resultCode == RESULT_OK 表示另外一个Activity已经结束了功能  
            if (resultCode == RESULTCODE_TO_INTENTRESULT) {  
                if (requestCode == RESQUESTCODE) {  
                    int returnResult = data.getIntExtra("result", 0);  
                    result.setText(String.valueOf(returnResult));  
                }  
      
            }  
        }  

    3). 从B中返回数据
                    int result = Integer.parseInt(inputResult.getText().toString());  
                    Intent intent = new Intent();  
                    intent.putExtra("result", result);  
                    // 通过Intent对象返回结果,setResult方法  
      
                    // 注意:在setResult(resultCode,  
                    // data)方法中,resultCode表示从Other这个Activity跳转到IntentResult这个Activity的标记,必须是大于1的整数  
                    // 注意的时候resultCode 必须与IntentResult中的 onActivityResult(int  
                    // requestCode, int resultCode, Intent data)的参数resultCode要一致的。  
      
                    setResult(RESULTCODE_TO_INTENTRESULT, intent);  
                    finish();// 结束当前的Activity的声明周期  



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    MySql之基础
    web篇---jQuery
    前端篇---CSS
    前端篇--HTML
    Python篇1.17---多进程
    Python篇1.16---socket编程
    Python篇1.15---模块与包
    Python番外篇---函数
    python番外篇---变量与数据类型
    【认真的完整版翻唱!】红莲之箭【あるふぁきゅん。】
  • 原文地址:https://www.cnblogs.com/ful1021/p/4804327.html
Copyright © 2011-2022 走看看