Activity传递数据的几种方式及返回结果

来源:互联网 发布:软件卸载大师 编辑:程序博客网 时间:2024/05/17 14:27

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



0 0