Android--Intent組件帶參傳遞與返回
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
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組件帶參傳遞與返回