1. 程式人生 > >Android--Intent組件帶參傳遞與返回

Android--Intent組件帶參傳遞與返回

puts 例子 ast pause onstop 圖標 訪問 數據頁面 .com

Android 是 單例模式:

  表示 application 唯一的。每個應用被啟動的時候,其實是 application 被創建。

Context 上下文:

  context 是 Application 和 activity 的父類。很多方法中,傳遞的都是上下文,而不是具體的 Activity 或者 Application。

AndroidManifest.xml :

  每一個 activity 都必須在 AndroidManifest.xml 中配置。否則出現 ActivityNotFound 異常。

  常用主題:

    默 認: @android:style/Theme.Holo.Light.DarkActionBar

    啟動頁: @android:style/Theme.Holo.Light.NoActionBar.Fullscreen

    窗體化: @android:style/Theme.Holo.Light.Dialog

      exported :可以被其他應用程序訪問。

      launchMode :啟動模式

        && lable 決定應用程序桌面的名稱, icon 決定應用程序圖標。 activity 中的屬性設置 會覆蓋 application 中的屬性。

Activity 的生命周期:

   onCreate --> onStart

--> onResume 正常運行期 (又稱 “可見期 ”、“ 聚焦期 ”)

   onPause --> 暫停期 (“ 失焦期 ”):指 activity 被覆蓋了一部分 (或者 有透明窗體中上面 ) ,準備退出時執行。

   onStop --> 停止期 : 指 activity 完全看不到了

   onDestory --> activity 已經被銷毀

      && onRestart --> 從 onPause 回到 onResume 或者 從 onStop 回到 onStart

      && 想要在 創建 時 銷毀,只需要在 onCreate 方法中調用 onDestory

              技術分享

創建一個Activity:

   1、新建 java 類 --> 繼承 Activity

   2、重寫 onCreate 方法, 加載布局 (setContentView)

   3、在androidManifest 中註冊該 activity

     && finish() 關閉一個activity 。

onBackPressed() :

   -- 當 activity 中 返回鍵 被按下時調用該方法。

     例如: 雙擊退出當前頁面, 代碼如下:

long lastTime = 0;
        if (System.currentTimeMillis() - lastTime < 2000) {
            finish();
        } else {
            Toast.makeText(this, "再按一次推出", Toast.LENGTH_SHORT).show();
            lastTime = System.currentTimeMillis();
        }
//思路: 當前系統時間 - 按返回鍵時的系統時間,若間隔小於兩秒,退出。

監聽事件:

   每個組件 都有 監聽事件。

   View有 三個監聽器:

    1、onClickListener 點擊事件

    2、onLongClickListener 長按事件

    3、onTouchListener 觸摸監聽

Activity 帶參跳轉 :

    Bundle: 專門用來攜帶數據的一個類,裏面可以存放各種基本數據類型 和 序列化 的對象。

    Intent : intent 有一個 Bundle 的成員變量, 所有數據實際存放在 Bundle。

    所以,Intent 可以傳遞 (put) 的數據類型有: 8種基本數據類型 及其 數組、String 和 String數組、兩種序列化對象 Serializable 、Parcelable

  

  例子,代碼如下:

  // 第一個頁面

public class MainActivity extends Activity implements OnClickListener {

    private EditText et_user, et_pwd;
    private Button btn_login;

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

    private void init() {
        et_user = (EditText) findViewById(R.id.et_user);
        et_pwd = (EditText) findViewById(R.id.et_pwd);
        btn_login = (Button) findViewById(R.id.btn_login);

        btn_login.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        Intent intent = new Intent(MainActivity.this, MainActivity2.class);

        String name = et_user.getText().toString();
        String password = et_pwd.getText().toString();
        
        intent.putExtra("username", name);
        intent.putExtra("password", password);
        // 傳遞基本數據類型
        intent.putExtra("name", "張三");
        intent.putExtra("age", 50);

        // 傳遞ArrayList數組
        ArrayList<String> list = new ArrayList<String>();
        list.add("中國");
        list.add("廣東");
        list.add("深圳");
        list.add("南山");
        intent.putStringArrayListExtra("list", list);

        // 傳遞 User類型的對象 必須是 序列化對象
        User user = new User("李四", "123456");
        intent.putExtra("user", user);

        // 傳遞 一組User類型的對象,用ArrayList裝載
        ArrayList<User> userList = new ArrayList<User>();
        userList.add(new User("王五", "000000"));
        userList.add(new User("趙六", "111111"));
        userList.add(new User("田七", "222222"));
        userList.add(new User("王八", "333333"));
        intent.putExtra("userList", userList);

        startActivity(intent);
    }
}

  // 第二個頁面

public class MainActivity2 extends Activity implements OnClickListener {

    private TextView tv_userName, tv_password, tv_list, tv_user, tv_userLiset,
            tv_zhangsan, tv_choose, tv_choose2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity2_main);
        init();
        show();
    }
    private void show() {
        // 獲取Intent 中傳遞的數據 getIntent()
        Intent intent = getIntent();
        String username = intent.getStringExtra("username");
        String password = intent.getStringExtra("password");

        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 1);

        // 接收ArrayList數組  getStringArrayListExtra()
        ArrayList<String> list = intent.getStringArrayListExtra("list");

        // 接收序列化對象 getSerializableExtra()
        User user = (User) intent.getSerializableExtra("user");

        @SuppressWarnings("unchecked")
        // 接收 序列化 數組對象 getSerializableExtra()
        ArrayList<User> userList = (ArrayList<User>) intent
                .getSerializableExtra("userList");

        // 將獲取到的數據 設置到相應的 組件上
        tv_userName.setText(username);
        tv_password.setText(password);
        tv_zhangsan.setText(name + "  " + age);
        tv_list.setText(list.toString());
        System.out.println(list);
        tv_user.setText(user.toString());
        tv_userLiset.setText(userList.toString());
    }

    private void init() {
        tv_userName = (TextView) findViewById(R.id.username);
        tv_password = (TextView) findViewById(R.id.password);
        tv_list = (TextView) findViewById(R.id.list);
        tv_user = (TextView) findViewById(R.id.user);
        tv_userLiset = (TextView) findViewById(R.id.userlist);
        tv_zhangsan = (TextView) findViewById(R.id.zhangsan);
        tv_choose = (TextView) findViewById(R.id.tv_choose);
        tv_choose2 = (TextView) findViewById(R.id.tv_choose2);
    }
}

重點方法 摘要:

    intent.put(key,value); -- put 方法,根據所傳類型的不同,調用不同的傳遞方法。如: putStringArrayListExtra

    getIntent(); -- get 方法, 根據所獲取的數據類型,選用不同的方法。如: getStringArrayListExtra 、getSerializableExtra

Activity 帶參返回:

    啟動方法為 : startActivityForResult(intent,requestCode); -- requestCode,請求識別碼

    需要重寫 Activity 的 onActivityResult 的方法來接收 返回數據

    在返回數據的頁面中 調用 setResult(resultCode,data); -- resultCode 結果識別碼, data 返回的數據,同樣以 Intent 傳遞

 

  例子,代碼如下:

  // 接收頁面部分代碼(第一個頁面)

@Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_car) {
            Intent intent = new Intent(MainActivity2.this,BrandMainActivity.class);
            // 特殊的啟動方法  startActivityForResult
            startActivityForResult(intent, BRAND_RESULT_CODE);
        }
    }
    
    //需要重寫的方法 onActivityResult --用於接收數據  requestCode 請求碼, resultCode 結果碼, data Intent傳遞的數據
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == BRAND_RESULT_CODE){
            if(resultCode == RESULT_OK){
                String brand = data.getStringExtra("result");
                tv_choose.setText(brand);
            }
        }
    }

  // 返回數據頁面部分代碼(第二個頁面)

Intent intent = new Intent();
        // intent 依舊傳遞數據 put方法 ,區別在於,不需要指定頁面跳轉 如:Intent intent = new Intent(MainActivity.this, MainActivity2.class);
        intent.putExtra("result", result);
        // 返回結果的特殊方法 setResult  
        setResult(RESULT_OK, intent);
        // 必須調用該方法,結束當前頁面
        finish();

重點方法 摘要:

   startActivityForResult -- 特殊的啟動方法

   onActivityResult -- 接收返回數據 所 需要重寫的 方法

   setResult -- 將數據 返回 的特殊方法

反射:

   通過 for循環 反射 來獲取對象。 (只是簡化我們的代碼,實際效率比普通方法低)

   可以減少 findViewById 、 setOnClickListener 等方法的次數。 

   代碼如下: 

// 使用反射來關聯對象
    TextView[] subject = new TextView[10];

// 反射方式獲取組件
    private void reflectFindViewById() {
        for (int i = 0; i <= subject.length; i++) {
            try {
                // 反射的反射 獲取 R 文件中的 .class文件 ,返回Int值
                int id = R.id.class.getField("tv_subject_" + (i+1)).getInt(null);
                subject[i] = (TextView) findViewById(id);
                subject[i].setOnClickListener(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

  // 普通方法 代碼如下:

// 普通的方法獲取組件
    private void NomfindViewById() {
         subject[0] = (TextView) findViewById(R.id.tv_subject_1);
         subject[1] = (TextView) findViewById(R.id.tv_subject_2);
         subject[2] = (TextView) findViewById(R.id.tv_subject_3);
         subject[3] = (TextView) findViewById(R.id.tv_subject_4);
         subject[4] = (TextView) findViewById(R.id.tv_subject_5);
         subject[6] = (TextView) findViewById(R.id.tv_subject_6);
         subject[7] = (TextView) findViewById(R.id.tv_subject_7);
         subject[8] = (TextView) findViewById(R.id.tv_subject_8);
         subject[9] = (TextView) findViewById(R.id.tv_subject_9);
         subject[10] = (TextView) findViewById(R.id.tv_subject_10);
         subject[0].setOnClickListener(this);
         subject[1].setOnClickListener(this);
         subject[2].setOnClickListener(this);
         subject[3].setOnClickListener(this);
         subject[4].setOnClickListener(this);
         subject[5].setOnClickListener(this);
         subject[6].setOnClickListener(this);
         subject[7].setOnClickListener(this);
         subject[8].setOnClickListener(this);
         subject[9].setOnClickListener(this);
         subject[10].setOnClickListener(this);
    }

  && 註意: 組件 ID 必須要 有序 -- R.id.class.getField().getInt()

Android--Intent組件帶參傳遞與返回