Activity與Activity間的通信

Activity與Activity間的通信

Activity的啓動

一個Activity啓動另一個Activity最簡單的方法就是用startActivity(Intent intent)方法,這個方法調用請求是發送給操作系統的ActivityManager負責創建Activity實例並調用其onCreat()方法。ActivityManager是通過傳入startActivity(Intent intent)方法的Intent參數知道需要啓動哪一個Activity。

ActivityManager維護着一個非特定應用獨享的回退棧。所有應用的activity都共享該回退棧。這也是將ActivityManager設計成操作系統級的activity管理器來負責啓動應用activity的原因之一。不侷限與單個應用,回退棧作爲一個整體共享給操作系統及設備使用。

描述:通過 Demo2Activity 啓動 Demo2_1Activity 或 Demo2_2Activity,Demo2_1Activity或Demo2_2Activity退出後把信息回饋到 Demo2Activity

  1. 在Demo2Activity中

    Intent intent = new Intent(Demo2Activity.this, Demo2_1Activity.class);
    intent.putExtra("Demo2Activity", "Hello,Demo2_1Acitvity,this is Demo2Activity");    
    startActivityForResult(intent, 0);
    //requestCode必須大於等於0,否則onActivityResult()方法不會執行
    //如果在Demo2_1Acitvity中沒有返回消息,那麼resultCode會等於requestCode,並且data = null
    

    這樣,就把消息傳遞給了Demo2_1Acitvity

  2. 在Demo2_1Acitvity中

    /*收到 Demo2Activity 的消息*/
    Intent intent1 = getIntent();
    Log.d("demoinfo", "Demo2_1Activity收到:  " + intent1.getStringExtra("Demo2Activity"));
    
    /*給Demo2Activity發送消息*/
    Intent intent2 = new Intent();
    intent2.putExtra("Demo2_1Activity", "I'm Demo2_1Activity!!");
    //setResult(1); 兩種方式,這個是隻傳一個resultCode
    setResult(1, intent2);
    
  3. 在Demo2Activity中重載onActivityResult(int requestCode, int resultCode, Intent data)方法

    requestCode就是之前在Demo2Activity中startActivityForResult(Intent, int)傳入的requestCode
    resultCode就是在Demo2_1Acitvity中setResult(int, Intent);傳入的int resultCode
    data就是在Demo2_1Acitvity中setResult(int, Intent);傳入的Intent
    

代碼:

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.ashzheng.studydemo.R;

public class Demo2Activity extends Activity {

    private Button bt1;
    private Button bt2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2);

        bt1 = (Button) findViewById(R.id.demo2_bt1);
        bt2 = (Button) findViewById(R.id.demo2_bt2);

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Demo2Activity.this, Demo2_1Activity.class);
                intent.putExtra("Demo2Activity", "Hello,Demo2_1Acitvity,this is Demo2Activity");
//                startActivity(intent);
                startActivityForResult(intent, 0);//requestCode必須大於等於0,否則onActivityResult()方法不會執行
            }
        });

        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Demo2Activity.this, Demo2_2Activity.class);
                intent.putExtra("Demo2Activity", "Hello,Demo2_2Acitvity,this is Demo2Activity");
//                startActivity(intent);
                startActivityForResult(intent, 0);//requestCode必須大於等於0,否則onActivityResult()方法不會執行
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.d("demoinfo", "requestCode = " + requestCode);
        Log.d("demoinfo", "resultCode = " + resultCode);
        if(null == data){
            Log.d("demoinfo", "data == null");
            return;
        }

        switch (resultCode){
            case 1:
                Log.d("demoinfo", data.getStringExtra("Demo2_1Activity"));
                break;
            case 2:
                Log.d("demoinfo", data.getStringExtra("Demo2_2Activity"));
                break;
        }

    }
}

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.ashzheng.studydemo.R;

public class Demo2_1Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2_1);

        Intent intent1 = getIntent();
        Log.d("demoinfo", "Demo2_1Activity收到:  " + intent1.getStringExtra("Demo2Activity"));


        Intent intent2 = new Intent();
        intent2.putExtra("Demo2_1Activity", "I'm Demo2_1Activity!!");
        //setResult(1);
        setResult(1, intent2);

    }


}

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.ashzheng.studydemo.R;

public class Demo2_2Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2_2);

        Intent intent1 = getIntent();
        Log.d("demoinfo", "Demo2_2Activity收到:  " + intent1.getStringExtra("Demo2Activity"));

        Intent intent2 = new Intent();
        intent2.putExtra("Demo2_2Activity", "I'm Demo2_2Activity!!");
        //setResult(2);
        setResult(2, intent2);
    }


}

參考《Android編程權威指南》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章