android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)
A.使用intent(意圖)傳值
MainActivity(源文件):
? ? ? ? 1.intent.putExtra(key,value):key一般是String,值為 java八大基本數(shù)據(jù)類型及對(duì)應(yīng)的數(shù)組,String及對(duì)應(yīng)的數(shù)組, Serializable 及對(duì)應(yīng)的數(shù)組等
? ? ? ? 2.intent.putExtras(bundle);
? ? ? ? 3.intent.putExtra(key,bundle)
DetailActivity(目標(biāo)文件):
? ? ? ? 1.intent.getXXXExtra(key)獲取值
? ? ? ? 2.bundle=intent.getExtras()
? ? ? ? 3.bundle=intent.getExtras(key)
B.使用Application全局對(duì)象傳值
1.自定義一個(gè)類MyApp繼承Application 并重寫它的onCreate()方法,將需要傳遞的值以成員變量的方式定義在MyApp 類中并提供getter和setter函數(shù)
2.在功能清單文件中指定自定義的全局應(yīng)用程序application節(jié)點(diǎn)中指定android:name=".MyApp"
3.在MainActivity 中得到自定義的Appllication類型的子類對(duì)象MyApp類型的對(duì)象
? ? ? ? MyApp myApp=(MyApp)this.getApplication();? ? ? ? myApp.setName("xxx");
? ? ? ? myApp.setAge(20)
? ? ? ? myApp.setDog(dog);
4.在詳情Activity 中得到全局應(yīng)用程序?qū)ο?/p>
?? ? ? ?MyApp myApp=(MyApp)this.getApplication();
? ? ? ? xxx=myApp.getName()? ? ? ? age=myApp.getAge()
? ? ? ? dog=myApp.getDog()
C.使用startActivityForResult()傳值 ==》(反向傳值)
1.使用startActivityForResult(intent,requestCode(大于等于0))方法激活目標(biāo)Activity
2.在目標(biāo)Activity 中調(diào)用setResult(resultCode,intent) 設(shè)置回傳到源Activity 的結(jié)果碼和意圖對(duì)象
3.在源Activity 中重寫onActivityResult(requestCode,resultCode,intent)方法得到目標(biāo)Activity 回傳的數(shù)據(jù)
這兩種方法的用法:
1.區(qū)別
StartActivityForResult:是說(shuō)明調(diào)用這個(gè)activity,關(guān)閉后可以接收到返回值
OnActivityForResult:當(dāng)activity關(guān)閉后,如果有返回值,則會(huì)在這個(gè)方法內(nèi)接收
2.聯(lián)系
這兩者是配對(duì)使用的,一個(gè)是告訴對(duì)方有接收值,一個(gè)是接收對(duì)方的返回值
反向結(jié)構(gòu)傳值示意圖
請(qǐng)求碼與作用碼示意圖
示例代碼:
DetailActivity.Java:
package com.example.tf.reversetransmission;import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText;public class DetailActivity extends AppCompatActivity {private EditText editText_name;private EditText editText_age;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.detail_main);this.editText_age = (EditText) this.findViewById(R.id.editText_age);this.editText_name = (EditText) this.findViewById(R.id.editText_name);}public void ok(View view){String name = this.editText_name.getText().toString().trim();String age = this.editText_age.getText().toString().trim();Intent data = new Intent();data.putExtra("name",name);data.putExtra("age",Integer.parseInt(age));//設(shè)置結(jié)果碼和意圖對(duì)象,會(huì)將這些值在當(dāng)前Activity銷毀后返回到激活當(dāng)前Activity的Activity(MainActivity)中this.setResult(RESULT_OK,data);//銷毀當(dāng)前Activitythis.finish();}/*** 當(dāng)用戶按手機(jī)上的返回鍵時(shí)自動(dòng)調(diào)用的方法*/@Overridepublic void finish(){String name = this.editText_age.getText().toString().trim();String age = this.editText_name.getText().toString().trim();Intent data = new Intent();data.putExtra("name",name);data.putExtra("age",Integer.parseInt(age));//同上this.setResult(RESULT_OK,data);//銷毀當(dāng)前Activity必須放到最后super.finish();} }detail.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPersonName"android:hint="請(qǐng)輸入你的姓名"android:ems="10"android:id="@+id/editText_name"android:layout_gravity="center_horizontal" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="number"android:hint="請(qǐng)輸入你的年齡"android:ems="10"android:id="@+id/editText_age" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="確定"android:onClick="ok"android:layout_gravity="center_horizontal" /></LinearLayout>MainActivity.java
package com.example.tf.reversetransmission;import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View;public class MainActivity extends AppCompatActivity {/*** 自定義請(qǐng)求碼常量,值不能是1*/private static final int REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** @parm view*/public void openDetail(View view ){Intent intent = new Intent(this,DetailActivity.class);startActivityForResult(intent,REQUEST_CODE);}//protected void onActivityResult(int requestCode,int resultCode,Intent data){//if(requestCode==REQUEST_CODE){if(requestCode==RESULT_OK){String name = data.getStringExtra("name");int age = data.getIntExtra("age",0);System.out.println("onActivityResult().name="+name+",age="+age);}}System.out.println("======MainActivity.onActivityResult(int requestCode="+requestCode+", int resultCode="+resultCode+", Intent data="+data+")======");} }activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="openDetail"android:text="以完全覆蓋的形式啟動(dòng)詳情Activity"android:layout_gravity="center_horizontal"/> </LinearLayout>注意:不能忘記在功能清單文件上注冊(cè)DetailActivity。
D.傳遞自定義類型的對(duì)象,實(shí)現(xiàn)Serializable 接口或者Parcelable 接口
?MainActivity中設(shè)置值:intent.putExtra(key,dog)
?DetailActivity 中獲取值:Dog dog=(Dog)intent.getSerializableExtra(key)
E.全局靜態(tài)變量傳值
1.自定義全局靜態(tài)變量類ContextData
2.在MainActivity中設(shè)置需要傳遞的值
? ? ? ? ContextData.setXXX(xxx);
3.在詳情Activity 中獲取值即可
? ? ? ? XXX=ContextData.getXXX()
總結(jié)
以上是生活随笔為你收集整理的android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 之intent(意图)
- 下一篇: android 之 Activity管理