2011年12月26日 星期一

Android - Pass Data (1) --使用 static方式

想了解android IPC的觀念的話,以下有一篇Run PC的文章不錯,請參考:
http://www.runpc.com.tw/content/content.aspx?id=105757

如果要在不同activity中傳遞像int、boolean、String...等資料型態的資料非常容易,使用類似下列語法即可
Intent it = new Intent();
it.putExtra("name","Peter");
it.putExtra("age",10);

不過如果希望把整個object物件丟給另一個Activity的話,官方說法則需要使用parcelable的觀念來達成。但是如果單純的是同一支apk內的Activity要傳遞的話,可以使用static的方式來辦到。這個方法並不正統,但是相當方便撰寫程式。
假設Activity1裡面有一個類別PassObj,我們希望把這個PassObj傳到Activity2,讓Activity2可以使用這個類別的變數和方法時,利用2個java檔舉例如下:

Activity1.java程式碼如下:
public class Activity1 extends Activity {
   
    public static PassObj PassToActivity2;
   
    public class PassObj{
        private int value;
        public void setValue10(){
            value = 10;
        }
        public int getValue(){
            return value;
        }
        public int getValueAdd10(){
            value = value + 10;
            return value;
        }
    }
   
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        PassToActivity2 = new PassObj();
        PassToActivity2.setValue10();   
             
        Button btn = (Button) findViewById(R.id.btn1);    
        OnClickListener lis = new OnClickListener() {       
            public void onClick(View v) {
                Intent it = new Intent();
                it.setClass(Activity1.this, Activity2.class);
           
                startActivity(it);
            }
        };
        btn.setOnClickListener(lis);
           
        String tempString;
        tempString = Integer.toString(PassToActivity2.getValue());
        TextView txt = (TextView) findViewById(R.id.txt1);
        txt.setText(tempString);
     
    }
}

Activity2.java程式碼如下:
public class Activity2 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
       
        String tempString;
        tempString = Integer.toString(Activity1.PassToActivity2.getValue()) + "\n";
        tempString = tempString + Integer.toString(Activity1.PassToActivity2.getValueAdd10());
       
        TextView txt2 = (TextView) findViewById(R.id.txt2);
        txt2.setText(tempString);
          
        Button btn = (Button) findViewById(R.id.btn2);    
        OnClickListener lis = new OnClickListener() {       
            public void onClick(View v) {
                Intent it = new Intent();
                it.setClass(Activity2.this, Activity1.class);               
                startActivity(it);
            }
        };
        btn.setOnClickListener(lis);
       
    }
}

執行結果如下:

一開始程式執行



















值一開始是10,然後加到20



















回到Activity1時,值依然是10



















請注意的是,當Activity2返回Activity1的時候,再將value印出來,還是10,並不會因為在Activity2曾經增加value的值而改變。雖然在Activity2時value已經變成20,但是回到Activity1的時候,value還是10

1 則留言:

  1. "請注意的是,當Activity2返回Activity1的時候,再將value印出來,還是10,並不會因為在Activity2曾經增加value的值而改變。雖然在Activity2時value已經變成20,但是回到Activity1的時候,value還是10"

    請問一下是宣告成static後返回都會是10嗎?

    回覆刪除