Activity及其生命周期

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

时间: 2024-11-08 21:30:57

Activity及其生命周期的相关文章

第一章:Activity的生命周期和启动模式

Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 说明 (1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop (3)返回原Activity时,回调如下:onRestart->on

Activity的生命周期

Android学习之Activity的生命周期 Android应用程序的不能自己控制他们自己的进程,但是Android运行时可以管理每个进程.因此正确的理解Activity的生存期,对于保证用户有个良好的体验有着很大的帮助. 1. Activity栈及状态 Activity栈是当前正在运行的所有Activity后进先出的集合.新启动的Activity始终在栈顶.Activity有四种种状态. 活动状态   当Activity处于栈顶,也就是Activity是可见的,具有焦点的Activity,此

Android:Activity的生命周期

Activity的生命周期 oncreate:Activity对象创建完毕,但此时不可见 onstart:Activity在屏幕可见,但是此时没有焦点 onResume:Activity在屏幕可见,并且获得焦点 onPause:Activity此时在屏幕依然可见,但是已经没有焦点 onStop:Activity已经不可见了,但是此时的Activity的对象还在内存中 onDestroy:Activity对象被销毁

【Android基础篇】Activity的生命周期

Google开发者文档 http://developer.android.com/reference/android/app/Activity.html 应用的每个页面都是一个Activity,这些Activity都存放在一个Activity栈中,每次进入某个应用或者应用的某个界面时,新界面这个Activity就压入到Activity栈的顶部:退出或返回的时候就把栈顶的Activity弹出,之前的Activity就又到了栈顶. Activity生命周期里的四个状态 - Running : Act

014_01关于Activity的生命周期

关于生命周期图资源很多,不再粘贴.从代码运行来看看Activity的生命周期. 1 package com.example.day14_01activitylifecycle; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 9 public c

无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCreate()开始,直到调用onDestory()为止.Activity在onCreate()中设置所有“全局”状态以完成初始化. 而在onDestory()中释放所有系统资源.例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程, 而在onDestory()销

android开发学习笔记(二)-activity的生命周期

一:activity的生命周期: 二:created->resumed 当一个应用程序的启动图标被用户点击后,应用程序开始从Activity的onCreate()方法开始执行.(当有多个activity文件时,执行Manifest文件中指定的主activity文件). 当执行完onCreate()方法后,迅速调用onStart(),onResume()方法,用户就可以进行相关的操作. 在onCreate()方法中尽量少执行操作,防止程序运行很久都进入不了界面. 三:Resumed->Pause

Android——Activity和Intent及Activity的生命周期

实验Activity的生命周期 package com.example.chenshuai.test; import android.app.Activity; import android.os.Bundle; import android.util.Log; /** * Created by chenshuai on 2016/3/16. */ public class Axtivity2 extends Activity { //回调方法 @Override protected void

Activity的生命周期方法

简介: Activity类作为Android的系统组件,它由系统创建它的对象, 当这个对象已经创建完成之后,系统会调用一系列指定的方法,这些方法我们 称之为生命周期方法. 什么是生命周期? ·生命周期 是指一个事物(可能是没有实体的)从无到有,然后从有到无 的过程,它的基本意义可以通俗的理解为"从摇篮到坟墓"的整个过程,根据事物不同,经历的阶段所不同. ·Activity是由Android系统进行维护的,它的对象的创建,销毁过程都由Android系统来完成, 并且在创建到销毁的这个阶段

[安卓基础] 007.管理Activity的生命周期

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin