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的声明周期  



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

原文地址:https://www.cnblogs.com/ful1021/p/4804327.html