Activity及其生命周期
一、Activity初步认识:【创建、配置、启动Activity】
(一)、创建Activity:
创建Activity:继承于Activity或其子类,重写onCreate()方法。
(二)、Activity的注册配置:
作为四大组件之一的Activity,必须要在AndroidManifest清单文件中进行注册。如果没有配置,而又在程序中启动了该Activity,将抛出异常(ActivityNotFoundException)。
注册配置的核心代码:
<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>android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN" /><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name=".HeadpicActivity"android:label="@string/title_activity_headpic" ></activity></application>
【附加思考】:
①. 当在AndroidManifest清单文件中,设置多个页面都是默认启动页,会报错吗?如果不报错,到底是 执行哪个页面呢?
②. 当在AndroidManifest清单文件中,如果不设置默认启动页,会报错吗?
(三)、启动Activity:
①. 在Android应用里各组件之间通信使用Intent。一个Activity通过Intent来表达自己的“意图”。
②. 常用有两种方式:
- Intent intent = new Intent(MainActivity.this , NextActivity.class);
- Intent intent = new Intent();
- intent.setClass(MainActivity.this , NextActivity.class);
③.常用启动方式有两种:
- startActivity();
- startActivityForResult();
(四)、Activity之间交换数据:
①. 第一种方式:
甲页面利用intent对象的putExtra()方法传值,乙页面利用getStringExtra()、
getIntExtra()等系列方法来一一接收值;
②. 第二种方式:【常用】
甲页面利用bundle对象来保存所有需要传递的数值,通过intent的putExtras()方法传值,
乙页面利用intent对象的getExtras()方法返回bundle对象,将所有接收的数据放在bundle对象中,
利用bundle的get系列方法一一去取数据。
【备注:】如果甲页面使用putExtras()方法传值,则乙页面使用getExtras()接收值。
如果甲页面使用putExtra()方法传值,则乙页面要使用getBundleExtra()方法接收值。
③. Activity之间是否可以传递对象呢?【掌握Serializable的用法】
- Serializable的用法
- Parcelable的用法
1、传递一般数据的核心代码:
(1)、MainActivity页面:
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;default:break;}}
(2)、NextActivity页面:
@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); }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);}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);}
2、传递对象数据的核心代码:
(1)、Person对象核心代码:
publicclass Person implementsSerializable{private String userName;privateintage;privateintsex;private List<String> infoList;public List<String> getInfoList() {return infoList;}publicvoid setInfoList(List<String> infoList) {this.infoList = infoList;}public String getUserName() {return userName;}publicvoid setUserName(String userName) {this.userName = userName;}publicint getAge() {returnage;}publicvoid setAge(int age) {this.age = age;}publicint getSex() {returnsex;}publicvoid setSex(int sex) {this.sex = sex;}}
(2)、MainActivity页面:
publicclass MainActivity extends Activity {private Person person = null;@Overrideprotectedvoid 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("asan");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;
}}}
(3)、ReceiverActivity 页面:
publicclass ReceiverActivity extends Activity {@Overrideprotectedvoid 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());}}
二、Activity——调用另一个Activity并返回结果:
(一)、概念:
甲页面调用乙页面,当用户在乙页面完成任务后,程序自动返回到甲页面,而甲页面必须能够获取到用户在完成乙页面后传递的数据结果。
(二)、做法:
与普通的页面交换数据不同的是,要使用startActivityForResult()方法来启动另一个Activity。
(三)、示例代码:
1、MainActivity页面:
publicclass MainActivity extends Activity {private ImageView imageView_main_headpic;@Overrideprotectedvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView_main_headpic = (ImageView) findViewById(R.id.imageView_main_headpic);}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;}
}@Overrideprotectedvoid 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);}}}2、HeadpicActivity页面:
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 };@Overrideprotectedvoid 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() {@Overridepublicvoid 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();}});}@Overridepublicboolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.headpic, menu);returntrue;}}
三、Activity生命周期:
(一)、人的生命周期是怎么样的?
- 胎儿
- 婴儿
- 儿童、少年、青年、中年
- 突发变故
- 老年
- 死亡
(二)、Activity生命周期:
1、Activity一生中有七种不同的状态。
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onRestart()
- onDestroy()
2、定义生命周期的作用:
- ①当用户接一个电话或切换到另一个程序不会崩溃
- ②当用户后台运行程序时不会销毁有价值的系统资源
- ③当用户离开再返回你的应用时不会丢失用户的进程
- ④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程
3、生命周期的金字塔图
(三)、实例代码操作:
模仿以下操作,观察输出日志,找寻生命周期方法依次回调的规律:
- 打开主界面,后退键退出
- 打开主界面,进入第二个页面
- 打开主界面,模拟电话进入及挂机,再次显示主界面
- 打开主界面,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执行了【思考:】
两个Activity页面,点第一个中的按钮,进入第二个页面,此时点HOME退出程序。随后再次启动app,依次会执行哪些生命周期的回调方法。如果再点击返回,继续会执行哪些生命周期的回调方法?
请自己将依次调用的方法写在下面,不要借助机器调试。
(四)、Activty生命周期的应用场景
- 游戏过程中电话进入
- Android音乐播放器
1、模拟Android音乐播放器,练习Activity生命周期的示例代码:
【目的:练习Activity生命周期,要明白不是所有的代码都写在onCreate()方法中,而是需要根据需求写在生命周期的不同的回调方法中。】
publicclass MainActivity extends Activity {privatestaticfinal String TAG = "MainActivity";privatestaticinti = 0;private Button button_main_play;private Timer timer = null;privatebooleanflag = false;// 设置flag标记位的目的是避免程序一开启就执行,而是等点击了按钮后才开始。@Overrideprotectedvoid 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() {@Overridepublicvoid onClick(View v) {// 点击按钮后执行播放playMusic();// 设置flag标记位的目的是避免程序一开启就执行。现在点击了按钮,允许程序在再次执行的时候自动执行flag = true;}});}@Overrideprotectedvoid onStart() {super.onStart();}@Overrideprotectedvoid onResume() {super.onResume();// 默认flag为false,不允许自动执行,而是当点击了播放后才允许执行。if (flag) {playMusic();}}@Overrideprotectedvoid onPause() {super.onPause();// 当有电话进入,会回调onPause()方法,这个时候要让播放器停止。// 定时器timer对象的cancel()方法能取消定时器。timer.cancel();}@Overrideprotectedvoid onStop() {super.onStop();}@Overrideprotectedvoid onRestart() {super.onRestart();}@Overrideprotectedvoid onDestroy() {super.onDestroy();// 如果希望程序退出后,下次运行从头开始播放,可以将进度初始化为0.// 如果点HOME退出,程序没有完全退出,下次播放应该从上次的进度继续执行,所以不应该初始化。// 所以将初始化写在onDestroy(),而不写在onStop()中。(因为点HOME退出不会回调onDestroy()方法。)i = 0;}publicvoid playMusic() {// 用定时器输出数字来模拟播放器播放的效果timer = new Timer();// 定时器timer对象的sechedule()方法有三个参数,第一个表示定时执行的任务,第二个参数表示延迟时间,第三个参数表示间隔的时间.timer.schedule(new TimerTask() {@Overridepublicvoid run() {Log.i(TAG, "==i=" + i);i++;}}, 0, 1000);}}
(五)、阅读英文API文档
The entire lifetime:onCreate() --- onDestroy() 完整生命周期The visible lifetime:onStart() --- onStop() 可见生命周期
The foreground lifetime: onResume() --- onPause() 前沿生命周期
08-29 06:39:57.770: I/MainActivity(2864): MainActivity中的onCreate方法执行了...
08-29 06:39:57.786: I/MainActivity(2864): MainActivity中的onStart方法执行了...
08-29 06:39:57.786: I/MainActivity(2864): MainActivity中的onResume方法执行了...
08-29 06:40:27.786: I/MainActivity(2864): MainActivity中的onPause方法执行了...
08-29 06:40:27.906: E/MainActivity(2864): OtherActivity中的onCreate方法执行了...
08-29 06:40:27.906: E/MainActivity(2864): OtherActivity中的onStart方法执行了...
08-29 06:40:27.922: E/MainActivity(2864): OtherActivity中的onResume方法执行了...
08-29 06:40:28.822: I/MainActivity(2864): MainActivity中的onStop方法执行了...
08-29 06:51:32.177: E/MainActivity(2864): OtherActivity中的onPause方法执行了...
08-29 06:51:32.193: I/MainActivity(2864): MainActivity中的onRestart方法执行了...
08-29 06:51:32.193: I/MainActivity(2864): MainActivity中的onStart方法执行了...
08-29 06:51:32.197: I/MainActivity(2864): MainActivity中的onResume方法执行了...
08-29 06:51:32.869: E/MainActivity(2864): OtherActivity中的onStop方法执行了...
08-29 06:51:32.869: E/MainActivity(2864): OtherActivity中的onDestroy方法执行了...
Activity及其生命周期
一、Activity初步认识:【创建、配置、启动Activity】
(一)、创建Activity:
创建Activity:继承于Activity或其子类,重写onCreate()方法。
(二)、Activity的注册配置:
作为四大组件之一的Activity,必须要在AndroidManifest清单文件中进行注册。如果没有配置,而又在程序中启动了该Activity,将抛出异常(ActivityNotFoundException)。
注册配置的核心代码:
<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>android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN" /><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name=".HeadpicActivity"android:label="@string/title_activity_headpic" ></activity></application>
【附加思考】:
①. 当在AndroidManifest清单文件中,设置多个页面都是默认启动页,会报错吗?如果不报错,到底是 执行哪个页面呢?
②. 当在AndroidManifest清单文件中,如果不设置默认启动页,会报错吗?
(三)、启动Activity:
①. 在Android应用里各组件之间通信使用Intent。一个Activity通过Intent来表达自己的“意图”。
②. 常用有两种方式:
- Intent intent = new Intent(MainActivity.this , NextActivity.class);
- Intent intent = new Intent();
- intent.setClass(MainActivity.this , NextActivity.class);
③.常用启动方式有两种:
- startActivity();
- startActivityForResult();
(四)、Activity之间交换数据:
①. 第一种方式:
甲页面利用intent对象的putExtra()方法传值,乙页面利用getStringExtra()、
getIntExtra()等系列方法来一一接收值;
②. 第二种方式:【常用】
甲页面利用bundle对象来保存所有需要传递的数值,通过intent的putExtras()方法传值,
乙页面利用intent对象的getExtras()方法返回bundle对象,将所有接收的数据放在bundle对象中,
利用bundle的get系列方法一一去取数据。
【备注:】如果甲页面使用putExtras()方法传值,则乙页面使用getExtras()接收值。
如果甲页面使用putExtra()方法传值,则乙页面要使用getBundleExtra()方法接收值。
③. Activity之间是否可以传递对象呢?【掌握Serializable的用法】
- Serializable的用法
- Parcelable的用法
1、传递一般数据的核心代码:
(1)、MainActivity页面:
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;default:break;}}
(2)、NextActivity页面:
@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); }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);}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);}
2、传递对象数据的核心代码:
(1)、Person对象核心代码:
publicclass Person implementsSerializable{private String userName;privateintage;privateintsex;private List<String> infoList;public List<String> getInfoList() {return infoList;}publicvoid setInfoList(List<String> infoList) {this.infoList = infoList;}public String getUserName() {return userName;}publicvoid setUserName(String userName) {this.userName = userName;}publicint getAge() {returnage;}publicvoid setAge(int age) {this.age = age;}publicint getSex() {returnsex;}publicvoid setSex(int sex) {this.sex = sex;}}
(2)、MainActivity页面:
publicclass MainActivity extends Activity {private Person person = null;@Overrideprotectedvoid 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("asan");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;
}}}
(3)、ReceiverActivity 页面:
publicclass ReceiverActivity extends Activity {@Overrideprotectedvoid 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());}}
二、Activity——调用另一个Activity并返回结果:
(一)、概念:
甲页面调用乙页面,当用户在乙页面完成任务后,程序自动返回到甲页面,而甲页面必须能够获取到用户在完成乙页面后传递的数据结果。
(二)、做法:
与普通的页面交换数据不同的是,要使用startActivityForResult()方法来启动另一个Activity。
(三)、示例代码:
1、MainActivity页面:
publicclass MainActivity extends Activity {private ImageView imageView_main_headpic;@Overrideprotectedvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView_main_headpic = (ImageView) findViewById(R.id.imageView_main_headpic);}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;}
}@Overrideprotectedvoid 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);}}}2、HeadpicActivity页面:
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 };@Overrideprotectedvoid 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() {@Overridepublicvoid 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();}});}@Overridepublicboolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.headpic, menu);returntrue;}}
三、Activity生命周期:
(一)、人的生命周期是怎么样的?
- 胎儿
- 婴儿
- 儿童、少年、青年、中年
- 突发变故
- 老年
- 死亡
(二)、Activity生命周期:
1、Activity一生中有七种不同的状态。
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onRestart()
- onDestroy()
2、定义生命周期的作用:
- ①当用户接一个电话或切换到另一个程序不会崩溃
- ②当用户后台运行程序时不会销毁有价值的系统资源
- ③当用户离开再返回你的应用时不会丢失用户的进程
- ④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程
3、生命周期的金字塔图
(三)、实例代码操作:
模仿以下操作,观察输出日志,找寻生命周期方法依次回调的规律:
- 打开主界面,后退键退出
- 打开主界面,进入第二个页面
- 打开主界面,模拟电话进入及挂机,再次显示主界面
- 打开主界面,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执行了【思考:】
两个Activity页面,点第一个中的按钮,进入第二个页面,此时点HOME退出程序。随后再次启动app,依次会执行哪些生命周期的回调方法。如果再点击返回,继续会执行哪些生命周期的回调方法?
请自己将依次调用的方法写在下面,不要借助机器调试。
(四)、Activty生命周期的应用场景
- 游戏过程中电话进入
- Android音乐播放器
1、模拟Android音乐播放器,练习Activity生命周期的示例代码:
【目的:练习Activity生命周期,要明白不是所有的代码都写在onCreate()方法中,而是需要根据需求写在生命周期的不同的回调方法中。】
publicclass MainActivity extends Activity {privatestaticfinal String TAG = "MainActivity";privatestaticinti = 0;private Button button_main_play;private Timer timer = null;privatebooleanflag = false;// 设置flag标记位的目的是避免程序一开启就执行,而是等点击了按钮后才开始。@Overrideprotectedvoid 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() {@Overridepublicvoid onClick(View v) {// 点击按钮后执行播放playMusic();// 设置flag标记位的目的是避免程序一开启就执行。现在点击了按钮,允许程序在再次执行的时候自动执行flag = true;}});}@Overrideprotectedvoid onStart() {super.onStart();}@Overrideprotectedvoid onResume() {super.onResume();// 默认flag为false,不允许自动执行,而是当点击了播放后才允许执行。if (flag) {playMusic();}}@Overrideprotectedvoid onPause() {super.onPause();// 当有电话进入,会回调onPause()方法,这个时候要让播放器停止。// 定时器timer对象的cancel()方法能取消定时器。timer.cancel();}@Overrideprotectedvoid onStop() {super.onStop();}@Overrideprotectedvoid onRestart() {super.onRestart();}@Overrideprotectedvoid onDestroy() {super.onDestroy();// 如果希望程序退出后,下次运行从头开始播放,可以将进度初始化为0.// 如果点HOME退出,程序没有完全退出,下次播放应该从上次的进度继续执行,所以不应该初始化。// 所以将初始化写在onDestroy(),而不写在onStop()中。(因为点HOME退出不会回调onDestroy()方法。)i = 0;}publicvoid playMusic() {// 用定时器输出数字来模拟播放器播放的效果timer = new Timer();// 定时器timer对象的sechedule()方法有三个参数,第一个表示定时执行的任务,第二个参数表示延迟时间,第三个参数表示间隔的时间.timer.schedule(new TimerTask() {@Overridepublicvoid run() {Log.i(TAG, "==i=" + i);i++;}}, 0, 1000);}}
(五)、阅读英文API文档
The entire lifetime:onCreate() --- onDestroy() 完整生命周期The visible lifetime:onStart() --- onStop() 可见生命周期
The foreground lifetime: onResume() --- onPause() 前沿生命周期
08-29 06:39:57.770: I/MainActivity(2864): MainActivity中的onCreate方法执行了...
08-29 06:39:57.786: I/MainActivity(2864): MainActivity中的onStart方法执行了...
08-29 06:39:57.786: I/MainActivity(2864): MainActivity中的onResume方法执行了...
08-29 06:40:27.786: I/MainActivity(2864): MainActivity中的onPause方法执行了...
08-29 06:40:27.906: E/MainActivity(2864): OtherActivity中的onCreate方法执行了...
08-29 06:40:27.906: E/MainActivity(2864): OtherActivity中的onStart方法执行了...
08-29 06:40:27.922: E/MainActivity(2864): OtherActivity中的onResume方法执行了...
08-29 06:40:28.822: I/MainActivity(2864): MainActivity中的onStop方法执行了...
08-29 06:51:32.177: E/MainActivity(2864): OtherActivity中的onPause方法执行了...
08-29 06:51:32.193: I/MainActivity(2864): MainActivity中的onRestart方法执行了...
08-29 06:51:32.193: I/MainActivity(2864): MainActivity中的onStart方法执行了...
08-29 06:51:32.197: I/MainActivity(2864): MainActivity中的onResume方法执行了...
08-29 06:51:32.869: E/MainActivity(2864): OtherActivity中的onStop方法执行了...
08-29 06:51:32.869: E/MainActivity(2864): OtherActivity中的onDestroy方法执行了...
六、作业:
1、完善注册页面,将选择头像嵌入到注册页面中。
2、用定时器模拟手机音乐播放器,要实现当电话进入时,该播放器停止。当电话结束,播放器继续播放。当返回退出,播放器关闭。