Android-Activity详解与汇总
注意的是,Activity的使用需要在Manifest文件中添加相应的<Activity>,并设置其属性和intent-filter。
1、关于生命周期
Activty的生命周期的也就是它所在进程的生命周期。
<ignore_js_op>
一个Activity的启动顺序:
onCreate()——>onStart()——>onResume()
当另一个Activity启动时:
第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume() ——>第一个Activity onStop()
当返回到第一个Activity时:
第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() ——>第二个Activity onStop()——>onDestroy()
一个Activity的销毁顺序:
(情况一)onPause()——><Process Killed>
(情况二)onPause()——>onStop()——><Process Killed>
(情况三)onPause()——>onStop()——>onDestroy()
PS:因此应在onPause()和onResume()做保存或者暂停动作!
每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。
但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。
在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。
onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。
通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
Intent intent =
new
Intent(ReorderFour.
this
, ReorderTwo.
class
);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
Use Cases | Launch Mode | Multiple Instances? | Comments |
---|---|---|---|
Normal launches for most activities | "standard " |
Yes | Default. The system always creates a new instance of the activity in the target task and routes the intent to it. |
"singleTop " |
Conditionally | If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to itsonNewIntent() method, rather than creating a new instance of the activity. |
|
Specialized launches (not recommended for general use) |
"singleTask " |
No | The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to itsonNewIntent() method, rather than creating a new one. |
"singleInstance " |
No | Same as "singleTask" , except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task. |
Service通过广播Broadcast更新Activity UI
http://www.eoeandroid.com/thread-68005-1-1.html
Android中Activity、Service和线程之间的通信(包含Handler)Android线程交互(Handler+Thread 和 AsyncTask)博客园包含AsyncTask例子、知识汇总包含Handler例子
http://blog.csdn.net/super005/article/details/5827298
http://www.eoeandroid.com/thread-173334-1-1.html
android 再按一次后退键退出应用程序
1 private static Boolean isExit = false;
2 private static Boolean hasTask = false;
3 Timer tExit = new Timer();
4 TimerTask task = new TimerTask() {
5
6 @Override
7 public void run() {
8 isExit = false;
9 hasTask = true;
10 }
11 };
12
13 @Override
14 public boolean onKeyDown(int keyCode, KeyEvent event) {
15 System.out.println("TabHost_Index.java onKeyDown");
16 if (keyCode == KeyEvent.KEYCODE_BACK) {
17 if(isExit == false ) {
18 isExit = true;
19 Toast.makeText(this, "再按一次后退键退出应用程序", Toast.LENGTH_SHORT).show();
20 if(!hasTask) {
21 tExit.schedule(task, 2000);
22 }
23 } else {
24 finish();
25 System.exit(0);
26 }
27 }
28 return false;
29 }
捕获返回键,弹出是否确定退出应用的对话框
1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3 if(keyCode == KeyEvent.KEYCODE_BACK){
5 new AlertDialog.Builder(this)
6 .setIcon(R.drawable.icon)
7 .setTitle(R.string.app_name)
8 .setMessage(R.string.quit_desc)
9 .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
10 @Override
11 public void onClick(DialogInterface dialog, int which) {}})
14 .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
15 public void onClick(DialogInterface dialog, int whichButton) {
16 finish(); }
18 }).show();
19
20 return true;
21 }
22
23 else{
22 return super.onKeyDown(keyCode, event);
23 }
24 }
让Activity变成一个窗口:Activity属性设定
Xml代码
android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
让Activity变成半透明:Activity属性设定
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
五、常见问题
你后台的Activity被系统回收怎么办:onSaveInstanceState 。
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B
这个时候A会执行。
Java代码
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}
if(savedInstanceState != null){ long id = savedInstanceState.getLong("id");}
就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...