假设我有一个Hello World单个Activity应用程序。我启动了这个应用程序。
在每种情况下调用哪些方法:
用户通过应用程序图标再次启动应用程序后会调用哪些方法(假设操作系统没有“其他应用程序需要内存条件”):
谢谢大家。
编辑:额外信用:用户如何在不调用onPause
的情况下调用onStop
?
答案 0 :(得分:24)
按下主页按钮并接听来电都不会从任务堆栈中删除该活动,并且当您重新进入该应用程序时将可用该操作=> onPause()=>的onStop()。
如activity lifecycle diagram所示,重新进入app calls => onRestart()=> onStart()=>的onResume()
按后退按钮代替杀死activity => onPause()=> onStop()=>的onDestroy()
在这种情况下重新进入应用程序调用classics => onCreate()=> onStart()=>的onResume()
修改强>
来自http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
如果活动失去焦点但是 仍然可见(即一个新的 非全尺寸或透明的活动 它专注于你的活动之上) 暂停了。暂停的活动是 完全活着(它维持着一切 州和会员信息和 仍然附着在窗户上 经理),但可以被杀死 极低内存的系统 的情况。
答案 1 :(得分:20)
了解 ACTIVITY LIFECYCLE 我创建演示请参阅HERE
我补充说不同的案例研究。
<强> MainActivity.java 强>
public class MainActivity extends AppCompatActivity {
private static final String TAG = "State changed";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: ");
}
public void OpenDialog(View view) {
final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
alertDialog.setTitle("hi");
alertDialog.setMessage("this is my app");
alertDialog.setButton("Continue..", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// here you can add functions
alertDialog.dismiss();
}
});
alertDialog.show(); //<-- Show dialog
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart: " );
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart: ");
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ");
}
@Override
public void onBackPressed() {
super.onBackPressed();
Log.i(TAG, "onBackPressed: ");
}
}
案例研究
案例1 =首先点击应用图标
注意:这里没有显示onRestoreInstanceState,因为它在运行时
上执行I / State已更改:onCreate:
I / State已更改:onStart:
I / State已更改:onResume:
案例2 =点击主页按钮(当屏幕关闭或来电时相同)
I / State已更改:onPause:
I / State已更改:onSaveInstanceState:
I / State已更改:onStop:
案例3 =(案例2继续)通过最近打开应用
I / State已更改:onRestart:
I / State已更改:onStart:
I / State已更改:onResume:
案例4 =单击“返回”按钮(onBackPressed方法调用)
I / State已更改:onPause:
I / State已更改:onStop:
I / State已更改:onDestroy:
案例5 =迁移变更(旋转屏幕)
I / State已更改:onPause:
I / State已更改:onSaveInstanceState:
I / State已更改:onStop:
I / State已更改:onDestroy:
I / State已更改:onCreate:
I / State已更改:onStart:
I / State已更改:onRestoreInstanceState:
I / State已更改:onResume:
答案 2 :(得分:4)
请注意,虽然您的hello world程序可能会发生一系列事件,但在视频游戏中可能不会出现相同的序列,因为Android可能会因占用太多资源而销毁它。
我发现看到我的应用程序生命周期的最好方法是覆盖所有方法(onStart,onRestart,...,包括onSaveInstance和onRestoreInstance)并在每个方法中插入日志语句。像这样:
@Override
public void onDestroy() {
// Call the super class
super.onDestroy();
// Log the action
Log.d("Debug", "onDestroy() has been called!");
}
现在我可以去logcat看看发生了什么事。
答案 3 :(得分:0)
可能有几种情况
从应用程序图标打开应用程序。以下方法称为
onCreate()-> onStart()-> onResume()
用户按下主屏幕按钮
onPause()-> onStop()
用户从“活动堆栈”返回到应用程序
onRestart()-> onStart()-> onResume()
应用运行时,用户按下电源按钮
onPause()-> onStop()
用户解锁手机时
onRestart()-> onStart()-> onResume()
当您在应用程序中时,当用户接到来电
onPause()
用户在断开电话后返回到应用程序
onResume()
用户在应用中按下后退按钮
onPause()-> onStop()-> onDestroy()