Activity及其生命周期
- 创建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>
<action android:name="android.intent.action.MAIN" />
<category android: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的用法
public void 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
protected void 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);
}
public class Person implements Serializable {
private String userName;
private int age;
private int sex;
private List<String> infoList;
public List<String> getInfoList() {
return infoList;
}
public void setInfoList(List<String> infoList) {
this.infoList = infoList;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
public class MainActivity extends Activity {
private Person person = null;
@Override
protected void 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);
}
public void 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
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
public class ReceiverActivity extends Activity {
@Override
protected void 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
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.receiver, menu);
return true;
}
}
public class MainActivity extends Activity {
private ImageView imageView_main_headpic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main_headpic = (ImageView) findViewById(R.id.imageView_main_headpic);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void 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
protected void 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);
}
}
}
public class HeadpicActivity extends Activity {
private GridView gridView_headpic_show;
// 定义数据源
private int[] imgIds = new int[] { 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
protected void 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" }, new int[] {
R.id.text_item_gridview_picname,
R.id.imageView_item_gridview_headpic });
gridView_headpic_show.setAdapter(adapter);
gridView_headpic_show.setOnItemClickListener(new OnItemClickListener() {
@Override
public void 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
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.headpic, menu);
return true;
}
}
- 胎儿
- 婴儿
- 儿童、少年、青年、中年
- 突发变故
- 老年
- 死亡
- 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音乐播放器
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static int i = 0;
private Button button_main_play;
private Timer timer = null;
private boolean flag = false;// 设置flag标记位的目的是避免程序一开启就执行,而是等点击了按钮后才开始。
@Override
protected void 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
public void onClick(View v) {
// 点击按钮后执行播放
playMusic();
// 设置flag标记位的目的是避免程序一开启就执行。现在点击了按钮,允许程序在再次执行的时候自动执行。
flag = true;
}
});
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
// 默认flag为false,不允许自动执行,而是当点击了播放后才允许执行。
if (flag) {
playMusic();
}
}
@Override
protected void onPause() {
super.onPause();
// 当有电话进入,会回调onPause()方法,这个时候要让播放器停止。
// 定时器timer对象的cancel()方法能取消定时器。
timer.cancel();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 如果希望程序退出后,下次运行从头开始播放,可以将进度初始化为0.
// 如果点HOME退出,程序没有完全退出,下次播放应该从上次的进度继续执行。所以不应该初始化。
// 所以将初始化写在onDestroy(),而不写在onStop()中。(因为点HOME退出不会回调onDestroy()方法。)
i = 0;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void playMusic() {
// 用定时器输出数字来模拟播放器播放的效果
timer = new Timer();
// 定时器timer对象的sechedule()方法有三个参数,第一个表示定时执行的任务,第二个参数表示延迟时间,第三个参数表示间隔的时间
timer.schedule(new TimerTask() {
@Override
public void 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对象在当前的栈中只存在一个。