Android的活动生命周期 – 这些方法是什么?
Android活动的生命周期是什么? 为什么在初始化过程中调用了很多类似的声音方法( onCreate()
, onStart()
, onResume()
)以及在末尾调用了很多其他声音方法( onPause()
, onStop()
, onDestroy()
)?
什么时候调用这些方法,如何正确使用?
在Activity Lifecycle中查看(在Android开发者处)。
onCreate() :
在第一次创build活动时调用。 这是你应该完成所有常规静态设置的地方:创build视图,将数据绑定到列表等等。这个方法还提供了一个包含活动之前冻结状态(如果有的话)的Bundle。 总是跟着onStart()。
onRestart() :
在您的活动已停止之后调用,然后再次启动。 总是跟着onStart()
onStart() :
当活动对用户变得可见时调用。 如果活动进入前台,则由onResume()跟随,如果隐藏,则返回onStop()。
onResume() :
当活动开始与用户交互时调用。 此时,您的活动位于活动堆栈的顶部,用户input即可。 总是跟着onPause()。
onPause() :
作为活动生命周期的一部分,当一个活动进入后台,但还没有被杀死。 与onResume()的对应。 当活动B在活动A前面启动时,此callback将在A上被调用。在A的onPause()返回之前,B不会被创build,因此请确保在这里不做任何事情。
onStop() :
当用户不再可见时调用。 接下来您将接收onRestart(),onDestroy(),或者什么也不做,这取决于以后的用户活动。
请注意,在内存不足的情况下,可能永远不会调用此方法,因为系统没有足够的内存来保存活动的进程在调用onPause()方法后运行。
onDestroy() :
在您的活动被破坏之前,您收到的最后一个电话。 这可能是因为活动正在完成(有人称为finish(),或者是因为系统临时销毁活动实例以节省空间,您可以使用isFinishing()方法区分这两个scheme。
当活动第一次加载的事件被调用如下:
onCreate() onStart() onResume()
当你点击电话button时 ,活动进入后台,下面的事件被调用:
onPause() onStop()
退出电话拨号器 ,下面的事件将被称为:
onRestart() onStart() onResume()
当你点击后退button或尝试完成()该活动的事件被调用如下:
onPause() onStop() onDestroy()
活动状态
Android操作系统使用优先级队列来帮助pipe理设备上运行的活动。 根据特定的Android活动所处的状态,系统会为其分配一定的优先级。 此优先系统可帮助Android识别不再使用的活动,从而使操作系统能够回收内存和资源。 下图说明了一个活动在其生命周期中可以经历的状态:
这些国家可以分为三大类:
活动或正在运行 – 如果活动位于前台(也称为活动堆栈的顶部),则认为活动处于活动状态或正在运行。 这被认为是Android Activity堆栈中最高优先级的活动,因此在极端情况下只会被操作系统杀死,比如活动尝试使用比设备上可用内存更多的内存,因为这可能会导致UI变得没有反应。
已暂停 – 当设备进入睡眠状态,或活动仍然可见但部分被新的非全尺寸或透明活动隐藏时,该活动被视为暂停。 暂停的活动仍然存在,也就是说,他们保持所有的州和会员信息,并依然附属于窗口经理。 这被认为是Android Activity堆栈中的第二高优先级活动,因此,如果杀死该活动将满足保持活动/运行活动稳定和响应所需的资源需求,则只会被操作系统杀死。
已停止 – 完全被其他活动遮蔽的活动被视为停止或在后台运行。 停止的活动仍然尽可能长时间地保留其状态和成员信息,但是停止的活动被认为是三个州中最低优先级的,因此操作系统将首先在该状态中杀死活动以满足资源需求更高优先级的活动。
*了解生命周期的示例活动**
import android.app.Activity; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { String tag = "LifeCycleEvents"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d(tag, "In the onCreate() event"); } public void onStart() { super.onStart(); Log.d(tag, "In the onStart() event"); } public void onRestart() { super.onRestart(); Log.d(tag, "In the onRestart() event"); } public void onResume() { super.onResume(); Log.d(tag, "In the onResume() event"); } public void onPause() { super.onPause(); Log.d(tag, "In the onPause() event"); } public void onStop() { super.onStop(); Log.d(tag, "In the onStop() event"); } public void onDestroy() { super.onDestroy(); Log.d(tag, "In the onDestroy() event"); } }
整个混乱是由于Googleselect非直觉名称而非如下所示:
onCreateAndPrepareToDisplay() [instead of onCreate() ] onPrepareToDisplay() [instead of onRestart() ] onVisible() [instead of onStart() ] onBeginInteraction() [instead of onResume() ] onPauseInteraction() [instead of onPause() ] onInvisible() [instead of onStop] onDestroy() [no change]
活动图可以被解释为:
活动有六个州
- 创build
- 入门
- 恢复
- 已暂停
- 停止
- 摧毁
活动生命周期有七种方法
-
onCreate()
-
onStart()
-
onResume()
-
onPause()
-
onStop()
-
onRestart()
-
onDestroy()
情况
-
当打开应用程序
onCreate() --> onStart() --> onResume()
-
当后退button按下并退出应用程序
onPaused() -- > onStop() --> onDestory()
-
当主页button被按下时
onPaused() --> onStop()
-
当再次从最近的任务列表打开应用程序或点击图标按下主页button后
onRestart() --> onStart() --> onResume()
-
当从通知栏打开应用程序另一个应用程序或打开设置
onPaused() --> onStop()
-
从另一个应用程序按下后退button,然后使用可以看到我们的应用程序
onRestart() --> onStart() --> onResume()
-
当任何对话框在屏幕上打开
onPause()
-
closures对话框中的对话框或返回button后
onResume()
-
任何电话铃声和应用程序中的用户
onPause() --> onResume()
-
当用户按下电话的答案button
onPause()
-
通话结束后
onResume()
-
当手机屏幕closures
onPaused() --> onStop()
-
当屏幕重新打开时
onRestart() --> onStart() --> onResume()
ANDROID LIFE-CYCLE
有七种方法可以pipe理Android应用程序的生命周期:
- 的onCreate()
- 在onStart()
- 的onResume()
- onRestart()
- 的onPause()
- 的onStop()
- 的onDestroy()
回答所有这些方法是什么:
让我们通过一个简单的场景来了解这些方法被调用的顺序,这将有助于我们明确为什么使用这些方法。
- 假设您正在使用计算器应用程序。 连续调用三种方法启动应用程序。
onCreate()
– – – > onStart()
– – – > onResume()
- 当我使用计算器的应用程序,突然一个电话来了。 计算器的活动是背景,另一个活动说。 处理这个呼叫就成了前台,现在又有两种方法被调用。
onPause()
– – – > onStop()
- 现在说我在电话上完成了对话,计算器的活动从后台到达前台,所以连续调用三种方法。
onRestart()
– – – > onStart()
– – – > onResume()
- 最后,说我已经完成了计算器应用程序中的所有任务,我想退出应用程序。 还有两种方法是相继调用的。
onStop()
– – – > onDestroy()
有一个活动可能存在四个状态:
- 起始状态
- 运行状态
- 暂停状态
- 停止状态
起始状态涉及:
创build一个新的Linux进程,为新的UI对象分配新的内存,并设置整个屏幕。 所以大部分的工作都涉及到这里。
运行状态涉及:
这是当前在屏幕上的活动(状态)。 只有这种状态才能处理诸如在屏幕上打字,触摸和点击button等事情。
暂停状态包括:
当一个活动不在前台,而是在后台,那么这个活动被认为处于暂停状态。
停止状态涉及:
停止的活动只能通过重新启动才能购买到前台,并且在任何时间点都可以销毁。
活动pipe理器以这样的方式处理所有这些状态,即使在将新活动添加到现有活动的情况下,用户体验和性能也始终处于最佳状态
从Android开发者页面,
在onPause():
当系统即将开始恢复先前的活动时调用。 这通常用于提交未保存的更改到持久数据,停止animation和其他可能消耗CPU的东西等。此方法的实现必须非常快,因为下一个活动将不会恢复,直到此方法返回。 如果活动返回到前面,则跟随onResume();如果对用户不可见,则使用onStop()。
的onStop():
当用户不再可见活动时调用,因为另一个活动已经恢复并覆盖这个活动。 这可能是因为一个新的活动正在开始,一个现有的活动正在这个活动之前,或者这个正在被破坏。 紧接着onRestart(),如果这个活动回来与用户交互,或者onDestroy(),如果这个活动消失了。
现在假设有三个活动,你从A到B,然后从A到A的OnPause现在将从B调用到C,然后调用B的onPause和A的onStop。
暂停的活动获取恢复并停止获取重新启动。
当你调用this.finish()
,onPause-onStop-onDestroy将被调用。 要记住的主要内容是:当Android需要内存进行其他操作时,已暂停的活动将停止并停止的活动将被销毁。
我希望这是很清楚的。
我喜欢这个问题和答案,但是到目前为止,还没有覆盖像onPostCreate()或onPostResume()这样不常用的callback。 Steve Pomeroy试图在https://github.com/xxv/android-lifecycle上包含这些内容,以及它们如何与Android的;Fragment生命周期相关联。 我修改了史蒂夫的大图,只包含活动部分,并将其格式化为单页打印输出。 我已经把它作为一个文本张贴在https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf及以下是它的形象:;
在高度评价的答案上添加一些更多的信息(增加KILLABLE的附加部分和将在生命周期中调用的下一组方法):
来源: developer.android.com
请注意上表中的“ Killable ”列 – 对于那些标记为可拆分的方法,在该方法返回之后,宿主活动的进程可能会被系统随时终止,而不会执行另一行代码。
因此,您应该使用onPause()
方法将任何持久性数据(如用户编辑)写入存储。 另外,方法onSaveInstanceState(Bundle)
在将活动置于这样的后台状态之前被调用,允许你将活动中的任何dynamic实例状态保存到给定的Bundle
,以便以后在onCreate(Bundle)
被接收需要重新创build。
请注意,将持久数据保存在onPause()
而不是onSaveInstanceState(Bundle)
是非常重要的,因为后者不是生命周期callback的一部分,所以不会在文档中描述的每种情况下调用。
我想添加更多的方法。 这些没有被列为生命周期方法,但它们将在生命周期中根据某些条件被调用。 根据您的要求,您可能必须在您的应用程序中实施这些方法才能正确处理状态。
onPostCreate(Bundle savedInstanceState)
在活动启动完成时调用(在
onStart()
和onRestoreInstanceState(Bundle)
)。
onPostResume()
当活动恢复完成时调用(在调用
onResume()
之后)。
onSaveInstanceState(Bundle outState)
调用以从被杀死的活动检索每个实例的状态,以便可以在
onCreate(Bundle)
或onRestoreInstanceState(Bundle)
恢复状态(由此方法填充的Bundle将被传递给两者)。
onRestoreInstanceState(Bundle savedInstanceState)
这个方法在
onStart()
之后被调用,当activity从之前保存的状态被重新初始化时,这里在savedInstanceState
中savedInstanceState
。
我使用所有这些方法的应用程序代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private EditText txtUserName; private EditText txtPassword; Button loginButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("Ravi","Main OnCreate"); txtUserName=(EditText) findViewById(R.id.username); txtPassword=(EditText) findViewById(R.id.password); loginButton = (Button) findViewById(R.id.login); loginButton.setOnClickListener(this); } @Override public void onClick(View view) { Log.d("Ravi", "Login processing initiated"); Intent intent = new Intent(this,LoginActivity.class); Bundle bundle = new Bundle(); bundle.putString("userName",txtUserName.getText().toString()); bundle.putString("password",txtPassword.getText().toString()); intent.putExtras(bundle); startActivityForResult(intent,1); // IntentFilter } public void onActivityResult(int requestCode, int resultCode, Intent resIntent){ Log.d("Ravi back result:", "start"); String result = resIntent.getStringExtra("result"); Log.d("Ravi back result:", result); TextView txtView = (TextView)findViewById(R.id.txtView); txtView.setText(result); Intent sendIntent = new Intent(); //sendIntent.setPackage("com.whatsapp"); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "Message..."); sendIntent.setType("text/plain"); startActivity(sendIntent); } @Override protected void onStart() { super.onStart(); Log.d("Ravi","Main Start"); } @Override protected void onRestart() { super.onRestart(); Log.d("Ravi","Main ReStart"); } @Override protected void onPause() { super.onPause(); Log.d("Ravi","Main Pause"); } @Override protected void onResume() { super.onResume(); Log.d("Ravi","Main Resume"); } @Override protected void onStop() { super.onStop(); Log.d("Ravi","Main Stop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Ravi","Main OnDestroy"); } @Override public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onPostCreate(savedInstanceState, persistentState); Log.d("Ravi","Main onPostCreate"); } @Override protected void onPostResume() { super.onPostResume(); Log.d("Ravi","Main PostResume"); } @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } }
login活动:
public class LoginActivity extends AppCompatActivity { private TextView txtView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); txtView = (TextView) findViewById(R.id.Result); Log.d("Ravi","Login OnCreate"); Bundle bundle = getIntent().getExtras(); txtView.setText(bundle.getString("userName")+":"+bundle.getString("password")); //Intent intent = new Intent(this,MainActivity.class); Intent intent = new Intent(); intent.putExtra("result","Success"); setResult(1,intent); // finish(); } }
输出:(暂停之前)
D/Ravi: Main OnCreate D/Ravi: Main Start D/Ravi: Main Resume D/Ravi: Main PostResume
输出:(暂停后恢复)
D/Ravi: Main ReStart D/Ravi: Main Start D/Ravi: Main Resume D/Ravi: Main PostResume
请注意,即使没有引用onPostResume()
作为生命周期方法, onPostResume()
调用onPostResume()
。