- 創建Activity:繼承於Activity或其子類,重寫onCreate()方法。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".HeadpicActivity"
android:label="@string/title_activity_headpic" >
</activity>
</application>
- 當在AndroidManifest清單文件中,設置多個頁面都是默認啓動頁,會報錯嗎?如果不 報錯,到底是執行哪個頁面呢?
- 當在AndroidManifest清單文件中,如果不設置默認啓動頁,會報錯嗎?
- 在Android應用裏各組件之間通信使用Intent。一個Activity通過Intent來表達自己的“意圖”。
- 常用有兩種方式:
- Intent intent = new Intent(MainActivity.this , NextActivity.class);
- Intent intent = new Intent();
-
- intent.setClass(MainActivity.this , NextActivity.class);
- 常用啓動方式有兩種:
- startActivity();
- startActivityForResult();
- 第一種方式:
-
- 甲頁面利用intent對象的putExtra()方法傳值,乙頁面利用getStringExtra()、getIntExtra()等系列方法來一一接收值;
- 第二種方式:【常用】
-
- 甲頁面利用bundle對象來保存所有需要傳遞的數值,通過intent的putExtras()方法傳值,乙頁面利用intent對象的getExtras()方法返回bundle對象,將所有接收的數據放在bundle對象中,利用bundle的get系列方法一一取出數據。
- Activity之間是否可以傳遞對象呢?【掌握Serializable的用法】
-
- Serializable的用法
- Parcelable的用法
publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_tonext:
Intent intent = new Intent(MainActivity.this, NextActivity.class);
Bundle bundle = new Bundle();
bundle.putString("myname", "hehaitao");
bundle.putInt("age", 16);
intent.putExtras(bundle);
startActivity(intent);
break;
}
}
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
// 接收第一個頁面的傳值
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("myname");
int age = bundle.getInt("age");
this.setTitle(name + ":" + age);
}
publicclassPersonimplements Serializable {
private String userName;
privateintage;
privateintsex;
private List<String> infoList;
public List<String> getInfoList() {
returninfoList;
}
publicvoid setInfoList(List<String> infoList) {
this.infoList = infoList;
}
public String getUserName() {
returnuserName;
}
publicvoid setUserName(String userName) {
this.userName = userName;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getSex() {
returnsex;
}
publicvoid setSex(int
this.sex = sex;
}
}
publicclass MainActivity extends Activity {
private Person person = null;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
person = new Person();
person.setUserName("wangxiangjun");
person.setAge(40);
person.setSex(1);
person.setInfoList(list);
}
publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_submit:
Intent intent = new Intent(MainActivity.this,
ReceiverActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
intent.putExtras(bundle);
startActivity(intent);
break;
}
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
}
publicclass ReceiverActivity extends Activity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receiver);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
// 接收Serializable對象
Person data = (Person) bundle.getSerializable("person");
setTitle(data.getUserName() + ":" + data.getAge() + ":"
+ data.getInfoList());
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.receiver, menu);
returntrue;
}
}
publicclass MainActivity extends Activity {
private ImageView imageView_main_headpic;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main_headpic = (ImageView) findViewById(R.id.imageView_main_headpic);
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_selectpic:
Intent intent = new Intent(MainActivity.this, HeadpicActivity.class);
startActivityForResult(intent, 0);
break;
}
}
@Override
protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == 1) {
Bundle bundle = data.getExtras();
int imgid = bundle.getInt("imgId");
imageView_main_headpic.setImageResource(imgid);
}
}
}
publicclass HeadpicActivity extends Activity {
private GridView gridView_headpic_show;
// 定義數據源
privateint[] imgIds = newint[] { R.drawable.img01, R.drawable.img02,
R.drawable.img03, R.drawable.img04, R.drawable.img05,
R.drawable.img06, R.drawable.img07, R.drawable.img08,
R.drawable.img09 };
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_headpic);
gridView_headpic_show = (GridView) findViewById(R.id.gridView_headpic_show);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imgIds.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("headpic", imgIds[i]);
map.put("picname", "頭像—" + i);
list.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.item_gridview_headpic, new String[] { "picname",
"headpic" }, newint[] {
R.id.text_item_gridview_picname,
R.id.imageView_item_gridview_headpic });
gridView_headpic_show.setAdapter(adapter);
gridView_headpic_show.setOnItemClickListener(new OnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putInt("imgId", imgIds[position]);
intent.putExtras(bundle);
setResult(1, intent);
finish();
}
});
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.headpic, menu);
returntrue;
}
}
- 胎兒
- 嬰兒
- 兒童、少年、青年、中年
- 突發變故
- 老年
- 死亡
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onRestart()
- onDestroy()
- onCreate、onStart、onResume:啓動應用程序
- onPause、onStop:失去焦點
- onRestart、onStart、onResume:重新獲得焦點
- onPause、onStop、onDestroy :退出應用程序
- onCreate() --- onDestroy() 完整生命週期 The entire lifetime
- onStart() --- onStop() 可見生命週期 The visible lifetime:
- onResume() --- onPause() 前沿生命週期(焦點生命週期) The foreground lifetime:
- ①當用戶接一個電話或切換到另一個程序不會崩潰
- ②當用戶後臺運行程序時不會銷燬有價值的系統資源
- ③當用戶離開再返回你的應用時不會丟失用戶的進程
- ④當手機屏幕進行橫豎屏切換的時候不會崩潰或者丟掉用戶的進程
- 打開主界面,後退鍵退出
- 打開主界面,進入第二個頁面
- 打開主界面,模擬電話進入及掛機,再次顯示主界面
- 打開主界面,HOME鍵退出
- 打開主界面,HOME鍵退出,再次啓動app
- 打開主界面,點擊該界面中捆綁退出事件的按鈕後退出
- 打開主界面,切換橫屏豎屏。
- 生命週期執行的順序:
04-23 03:51:29.750: I/MainActivity(741): ==MainActivity onCreate執行了 04-23 03:51:29.759: I/MainActivity(741): ==MainActivity onStart執行了 04-23 03:51:29.759: I/MainActivity(741): ==MainActivity onResume執行了 04-23 03:52:04.780: I/MainActivity(741): ==MainActivity onPause執行了 04-23 03:52:04.791: I/MainActivity(741): ==MainActivity onStop執行了 04-23 03:52:04.791: I/MainActivity(741): ==MainActivity onDestroy執行了 04-23 03:52:05.200: I/MainActivity(741): ==MainActivity onCreate執行了 04-23 03:52:05.209: I/MainActivity(741): ==MainActivity onStart執行了 04-23 03:52:05.329: I/MainActivity(741): ==MainActivity onResume執行了
- 遊戲過程中電話進入
- Android音樂播放器
publicclass MainActivity extends Activity {
privatestaticfinal String TAG = "MainActivity";
privatestaticinti = 0;
private Button button_main_play;
private Timer timer = null;
privatebooleanflag = false;// 設置flag標記位的目的是避免程序一開啓就執行,而是等點擊了按鈕後纔開始。
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_main_play = (Button) findViewById(R.id.button_main_play);
button_main_play.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
// 點擊按鈕後執行播放
playMusic();
// 設置flag標記位的目的是避免程序一開啓就執行。現在點擊了按鈕,允許程序在再次執行的時候自動執行。
flag = true;
}
});
}
@Override
protectedvoid onStart() {
super.onStart();
}
@Override
protectedvoid onResume() {
super.onResume();
// 默認flag爲false,不允許自動執行,而是當點擊了播放後才允許執行。
if (flag) {
playMusic();
}
}
@Override
protectedvoid onPause() {
super.onPause();
// 當有電話進入,會回調onPause()方法,這個時候要讓播放器停止。
// 定時器timer對象的cancel()方法能取消定時器。
timer.cancel();
}
@Override
protectedvoid onStop() {
super.onStop();
}
@Override
protectedvoid onRestart() {
super.onRestart();
}
@Override
protectedvoid onDestroy() {
super.onDestroy();
// 如果希望程序退出後,下次運行從頭開始播放,可以將進度初始化爲0.
// 如果點HOME退出,程序沒有完全退出,下次播放應該從上次的進度繼續執行。所以不應該初始化。
// 所以將初始化寫在onDestroy(),而不寫在onStop()中。(因爲點HOME退出不會回調onDestroy()方法。)
i = 0;
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
publicvoid playMusic() {
// 用定時器輸出數字來模擬播放器播放的效果
timer = new Timer();
// 定時器timer對象的sechedule()方法有三個參數,第一個表示定時執行的任務,第二個參數表示延遲時間,第三個參數表示間隔的時間
timer.schedule(new TimerTask() {
@Override
publicvoid run() {
Log.i(TAG, "==i=" + i);
i++;
}
}, 0, 1000);
}
}
(二)、Activity的四種啓動模式:
1. standard(備註:standard是系統默認的啓動模式。)
標準啓動模式,每次激活Activity時都會創建Activity,並放入任務棧中。每個窗體的getTaskId()保持不變,但是this.hashCode()發生改變。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity對象,不過它會調用onNewIntent()方法。如果棧頂部不存在就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。會回調onNewIntent()方法。
3. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求創建的,而singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢測到的我們需要的Activity置爲棧頂。
4. singleInstance
與singleTask模式的區別是存放singleInstance模式窗口對象的回退棧不能有其他任何窗口對象。因此如果該窗口不存在,則要新建任務來存放該singleInstance模式窗口。也就是說getTaskId()會發現任務id發生了變化。
此啓動模式和我們使用的瀏覽器工作原理類似,在多個程序中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,因爲他能保證要請求的Activity對象在當前的棧中只存在一個。