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">

<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清单文件中,如果不设置默认启动页,会报错吗?
  
   (三)、启动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;

   @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("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 {

   @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());

   }

}

二、Activity——调用另一个Activity并返回结果:

(一)、概念:

甲页面调用乙页面,当用户在乙页面完成任务后,程序自动返回到甲页面,而甲页面必须能够获取到用户在完成乙页面后传递的数据结果。

(二)、做法:

与普通的页面交换数据不同的是,要使用startActivityForResult()方法来启动另一个Activity。

(三)、示例代码:

1、MainActivity页面:
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);

   }

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);

           }

   }

}

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 };

  @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;

   }

}

三、Activity生命周期:
     (一)、人的生命周期是怎么样的?
  • 胎儿
  • 婴儿
  • 儿童、少年、青年、中年
  • 突发变故
  • 老年
  • 死亡
(二)、Activity生命周期:
1、Activity一生中有七种不同的状态。
  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()
2、定义生命周期的作用:
  • ①当用户接一个电话或切换到另一个程序不会崩溃
  • ②当用户后台运行程序时不会销毁有价值的系统资源
  • ③当用户离开再返回你的应用时不会丢失用户的进程
  • ④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程
3、生命周期的金字塔图
(三)、实例代码操作:
模仿以下操作,观察输出日志,找寻生命周期方法依次回调的规律:
  1. 打开主界面,后退键退出
  2. 打开主界面,进入第二个页面
  3. 打开主界面,模拟电话进入及挂机,再次显示主界面
  4. 打开主界面,HOME键退出
  5. 打开主界面,HOME键退出,再次启动app
  6. 打开主界面,点击该界面中捆绑退出事件的按钮后退出
  7. 打开主界面,切换横屏竖屏。
  • 生命周期执行的顺序:
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标记位的目的是避免程序一开启就执行,而是等点击了按钮后才开始。

   

  @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;

   }

publicvoid playMusic() {

           // 用定时器输出数字来模拟播放器播放的效果

timer = new Timer();

// 定时器timer对象的sechedule()方法有三个参数,第一个表示定时执行的任务,第二个参数表示延迟时间,第
三个参数表示间隔的时间.

timer.schedule(new TimerTask() {

                       @Override

publicvoid 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">

<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清单文件中,如果不设置默认启动页,会报错吗?
  
   (三)、启动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;

   @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("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 {

   @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());

   }

}

二、Activity——调用另一个Activity并返回结果:

(一)、概念:

甲页面调用乙页面,当用户在乙页面完成任务后,程序自动返回到甲页面,而甲页面必须能够获取到用户在完成乙页面后传递的数据结果。

(二)、做法:

与普通的页面交换数据不同的是,要使用startActivityForResult()方法来启动另一个Activity。

(三)、示例代码:

1、MainActivity页面:
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);

   }

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);

           }

   }

}

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 };

  @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;

   }

}

三、Activity生命周期:
     (一)、人的生命周期是怎么样的?

  • 胎儿
  • 婴儿
  • 儿童、少年、青年、中年
  • 突发变故
  • 老年
  • 死亡
(二)、Activity生命周期:
1、Activity一生中有七种不同的状态。
  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()
2、定义生命周期的作用:
  • ①当用户接一个电话或切换到另一个程序不会崩溃
  • ②当用户后台运行程序时不会销毁有价值的系统资源
  • ③当用户离开再返回你的应用时不会丢失用户的进程
  • ④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程
3、生命周期的金字塔图
(三)、实例代码操作:
模仿以下操作,观察输出日志,找寻生命周期方法依次回调的规律:
  1. 打开主界面,后退键退出
  2. 打开主界面,进入第二个页面
  3. 打开主界面,模拟电话进入及挂机,再次显示主界面
  4. 打开主界面,HOME键退出
  5. 打开主界面,HOME键退出,再次启动app
  6. 打开主界面,点击该界面中捆绑退出事件的按钮后退出
  7. 打开主界面,切换横屏竖屏。
  • 生命周期执行的顺序:

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标记位的目的是避免程序一开启就执行,而是等点击了按钮后才开始。

   

  @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;

   }

publicvoid playMusic() {

           // 用定时器输出数字来模拟播放器播放的效果

timer = new Timer();

// 定时器timer对象的sechedule()方法有三个参数,第一个表示定时执行的任务,第二个参数表示延迟时间,第
三个参数表示间隔的时间.

timer.schedule(new TimerTask() {

                       @Override

publicvoid 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、用定时器模拟手机音乐播放器,要实现当电话进入时,该播放器停止。当电话结束,播放器继续播放。当返回退出,播放器关闭。

Activity及其生命周期相关推荐

  1. Activity的生命周期是谁调用的?

    我们知道Activity的生命周期包括onCreate.onStart.onResume.onRestart.onStop.onDestory.onSaveInstanceState.onRestor ...

  2. 横竖屏切换时候Activity的生命周期

    曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期.现在给大家分析一下他切换时具体的生命周期是怎么样的: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activi ...

  3. Android开发---Activity的生命周期

    在Android开发中,第一步学习的应该是最基础的东西,即Activity的声明周期,相信Activity对于从事Android开发的朋友都很熟悉,这里作者不多做解释.Android的生命周期可以用如 ...

  4. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  5. Activity的生命周期理解

    Activity拥有4个基本状态: 活动状态:当前Activity位于前台,可以看见也可以获得焦点,可以接受用户输入的 暂停状态:其他Activity位于前台,该Activity依然可见,但是不能获得 ...

  6. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...

    android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...

  7. Android学习笔记系列四2 —— Activity的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...

  8. activity 生命周期_从0系统学Android-2.4 Activity 的生命周期

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 本系列持续更新中-. 2.4 Activity 的生命周期 掌握 Activity 的生命周期对于开发者来说是非常 ...

  9. Android下Activity的生命周期

    Activity的生命周期如上图所示.当系统调用一个活动时,每个回调函数依次调用. 转载于:https://www.cnblogs.com/hainange/archive/2013/04/25/61 ...

  10. android activity 回调函数,Android Activity的生命周期

    Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...

最新文章

  1. linux libcurl 库使用方法
  2. Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍
  3. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)
  4. JavaScript 是如何工作的:解析、抽象语法树(AST)+ 提升编译速度5个技巧
  5. iOS开发实战小知识点(五)——获取JS meta异常
  6. 【WC2016】挑战NPC 【带花树】【建图】
  7. Linux命令中的$()和${}的区别
  8. ftp加速传输java_Java FTPClient 大量数据传输的问题(未解决)
  9. C# 取Visio模型信息的简易方法
  10. 【OCP题库-12c】最新CUUG OCP 071考试题库(69题)
  11. GAMIT新版本10.71发布了
  12. MATLAB安装错误:Check your internet connection and proxy settings in MATLAB Web preferences
  13. win7调整屏幕亮度_win7系统设置护眼色后,不生效怎么办?
  14. 阿里云企业邮箱2019
  15. Git版本回退的两种方式及回退方式推荐
  16. C语言练习9—统计单词中字母个数
  17. windows系统查看USB设备序列号方法汇总
  18. python_matplotlib改变横坐标和纵坐标上的刻度(ticks)
  19. 动态规划-最少硬币组合问题(Java)
  20. 【Pandas入门教程】如何重塑表格布局

热门文章

  1. 软考笔记(九)高级系统架构师/分析师:软件工程与项目管理
  2. python计算一段时间内的工作日(除周末、除中国节假日、加调休)和所有日期
  3. 【尚硅谷_数据结构与算法】一、数据结构与算法概述
  4. led点阵c语言程序,51单片机驱动LED点阵扫描显示C语言程序
  5. iphone捷径大全_iPhone捷径,助您一臂之力
  6. 计算机解八元一次方程,如何用matlab求解8元一次,含参数的方程组(共八个一次方程)...
  7. 消元法解n元一次方程组 c++实现
  8. ubuntu1604 grep sed 正则表达式
  9. 推荐系统之隐语义模型(LFM)及Python实现
  10. 电脑卡住了怎么保存excel_电脑卡死了excel没保存怎么办啊