Android--Activity中使用Intent傳值


  Intent,又稱為意圖,是一種運行時綁定機制,它能在程序運行的過程中鏈接兩個不同的組件(Activity、Service、BroadcastReceiver)。通過Intent,程序可以向Android表達某種請求或意願,Android會根據意願的內容選擇適當的組件來請求。

    在這些組件之間的通訊中,主要是由Intent協助完成的。Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將Intent傳遞給調用的組件,並完成組件的調用。因此,Intent在這里起着一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。

  通過Intent請求Activity,必須在AndroidManifest.xml文件中對被請求的Activity新增標簽配置,否則會導致錯誤。
   
  Intent一般包含兩個主要信息,action、data。
  • action:表示這個Intent此次操作的動作。
  • data:表示這次動作涉及的數據。

 

  通過一個例子來展示Activity中使用Intent導向新Activity並傳遞數據。此程序僅在兩個頁面之間相互跳轉,但是每次跳轉會創建新的Activity,所以在startActivity()之后需要調用finish()銷毀當前Activity,如果不銷毀,多次跳轉后,程序的Activity棧中會存放多個Activity,點擊設備的返回按鈕,會發現會一直向后退。

  主要步驟:

  1. 新建Android項目,增加新布局文件other.xml,新增Activity類otherActivity.class,用於接受Intent並展示other.xml。
  2. 在MainActivity類中,聲明一個Intent類,通過Intent的構造函數指明源和目標。
  3. 獲得Intent后,使用Intent.putExtra()方法對其傳入數據。
  4. 調用Activity.startActivity啟動這個Intent。
  5. 在otherActivity類中,使用Activity.getIntent()獲得當前Activity的Intent。
  6. 獲得Intent后,使用Intent.getXxxExtra()方法獲得其中保存的數據。
  7. 在AndroidManifest.xml配置otherActivity節點。

示例代碼

步驟2--3:

 1 public class MainActivity extends Activity {
 2     private TextView textView;
 3     private Button btn;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         
 9         textView=(TextView)findViewById(R.id.textView1);
10         btn=(Button)findViewById(R.id.button1);
11         btn.setOnClickListener(new View.OnClickListener() {            
12             @Override
13             public void onClick(View v) {
14                 // Intent構造函數:Intent來源;Intent目的。
15                 Intent intent =new Intent(MainActivity.this,otherActivity.class);
16                 intent.putExtra("data", "當前是頁面2,信息來自頁面1");
17                 startActivity(intent);//啟動Activity
18          finish();
18 } 19 }); 20 } 21 }

步驟4--5:

 1 public class otherActivity extends Activity {
 2     private Button btn;
 3     private TextView textView;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         // TODO Auto-generated method stub
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.other);
 9         
10         textView=(TextView)findViewById(R.id.textView2);
11         btn=(Button)findViewById(R.id.button2);
12         
13         //通過Activity.getIntent()獲取當前頁面接收到的Intent。
14         Intent intent =getIntent();
15         //getXxxExtra方法獲取Intent傳遞過來的數據
16         String msg=intent.getStringExtra("data");
17         textView.setText(msg);
18         
19         btn.setOnClickListener(new View.OnClickListener() {            
20             @Override
21             public void onClick(View v) {                
22                 Intent intent=new Intent(otherActivity.this,MainActivity.class);
23                 startActivity(intent);
24                 finish();
25             }
26         });        
27     }
28 }

步驟7:

 1     <application
 2         android:allowBackup="true"
 3         android:icon="@drawable/ic_launcher"
 4         android:label="@string/app_name"
 5         android:theme="@style/AppTheme" >
 6         <activity
 7             android:name="cn.bgxt.IntentForAc.MainActivity"
 8             android:label="@string/app_name" >
 9             <intent-filter>
10                 <action android:name="android.intent.action.MAIN" />
11                 <category android:name="android.intent.category.LAUNCHER" />
12             </intent-filter>
13         </activity>
14         <activity android:name=".otherActivity"/>
15     </application>

 

從Activity中返回數據

  上面例子中只是介紹了Activity通過Intent傳遞數據,然而在實際應用中,不僅僅需要向Activity傳遞數據,而且要從Activity中返回數據,雖然返回數據和傳遞數據類似,但是還是有部分區別。

  主要區別如下:

  1. 傳遞數據需要使用Activity.startActivityForResult()方法啟動Activity,需要傳遞請求碼,而不是Activity.startActivity()。
  2. 返回數據的時候,調用Activity.setResult()方法設置返回Intent以及返回碼。
  3. 需要重寫源Activity的onActivityResult()方法以便於接受返回的Intent,在onActivityResult()中會判斷請求碼和響應碼。

  通過一個例子說明從Activity返回數據。此程序有兩個Activity,在MainActivity中輸入加法運算的計算數,跳轉到otherActivity中輸入計算結果,並在點擊返回后,把計算結果輸出到MainActivity中。

示例代碼

MainActivity: 

 1 public class MainActivity extends Activity {
 2 
 3     private EditText one,two,result;
 4     private Button btn;
 5     
 6     @Override
 7     protected void onCreate(Bundle savedInstanceState) {
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10         
11         one=(EditText)findViewById(R.id.one);
12         two=(EditText)findViewById(R.id.two);
13         result=(EditText)findViewById(R.id.result);
14         btn=(Button)findViewById(R.id.btnGo);
15         btn.setOnClickListener(new View.OnClickListener() {
16             
17             @Override
18             public void onClick(View v) {
19                 // TODO Auto-generated method stub
20                 int ione=Integer.parseInt(one.getText().toString());
21                 int itwo=Integer.parseInt(two.getText().toString());
22                 
23                 Intent intent=new Intent(MainActivity.this, otherActivity.class);
24                 intent.putExtra("one", ione);
25                 intent.putExtra("two", itwo);                
26                 
27                 //啟動需要監聽返回值的Activity,並設置請求碼:requestCode
28                 startActivityForResult(intent, 1);
29             }
30         }); 
31         
32     }
33     
34     @Override
35     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
36         super.onActivityResult(requestCode, resultCode, data);
37         //當otherActivity中返回數據的時候,會響應此方法
38         //requestCode和resultCode必須與請求startActivityForResult()和返回setResult()的時候傳入的值一致。
39         if(requestCode==1&&resultCode==2)
40         {
41             int three=data.getIntExtra("three", 0);
42             result.setText(String.valueOf(three));
43         }
44     }
45 
46     @Override
47     public boolean onCreateOptionsMenu(Menu menu) {
48         // Inflate the menu; this adds items to the action bar if it is present.
49         getMenuInflater().inflate(R.menu.main, menu);
50         return true;
51     }
52 }

otherActivity:

 1 public class otherActivity extends Activity {
 2     TextView tvShow;
 3     EditText etResult;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.other);
 8         
 9         tvShow=(TextView)findViewById(R.id.tvShow);
10         etResult=(EditText)findViewById(R.id.etResult);
11         
12         Intent intent=getIntent();
13         int a=intent.getIntExtra("one", 0);
14         int b=intent.getIntExtra("two", 0);
15         tvShow.setText(a+" + "+b+" = "+" ? ");        
16         
17         Button btnResult=(Button)findViewById(R.id.btnReturn);
18         btnResult.setOnClickListener(new View.OnClickListener() {            
19             @Override
20             public void onClick(View v) {
21                 //新聲明一個Intent用於存放放回的數據
22                 Intent i=new Intent();
23                 int result=Integer.parseInt(etResult.getText().toString());
24                 i.putExtra("three", result);
25                 setResult(2, i);//設置resultCode,onActivityResult()中能獲取到
26                 finish();//使用完成后結束當前Activity的生命周期
27             }
28         });                
29     }
30 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM