使用 finish() 关闭 activity;不会让应用在下一个 运行 重新启动!为什么?
closing an activity using finish(); wont make app start fresh in next run! why?
我想知道是否有人可以阐明这一点,
我有一个 activity 应用程序,它有一个列表视图。在 onCreate() 中,我在该列表视图中填充了一些数据(从 sqlite 数据库读取)。我有一个触发 finish() 的关闭按钮;也。现在,当我按下关闭按钮时,activity 消失了,但是当我单击桌面上的应用程序图标(或从 phone 历史按钮中选择它)时,我会在列表视图中看到所有以前的数据。我正在寻找的功能是在单击下一个 运行 的关闭按钮后重新启动应用程序。 (类似于银行应用 log-out 按钮)。 (此处的列表视图只是满足需求的示例,因此在 finish(); 之前清除 list-view 是不可接受的。这是非常简单明了的请求,我认为不需要任何代码,但如果有人感兴趣我也会 post 一些代码。
我想要的是与退出时银行应用程序相同的行为,当用户离开主屏幕或单击注销时,应用程序将完全关闭。我可以通过使用以下方法(2 号和 3 号)来实现这一点,但 apparently 这些解决方案不是最佳实践。那么银行App是用什么方法瞬间关闭的呢?我怀疑他们使用的东西不是最佳实践,例如 System.exit(0)?!或者他们!
许多开发者声称关闭或杀死应用程序 parent activity
是 OS 工作
有人说用用:
int pid = android.as.Process.myPid();
android.os.Process.killProcess(pid);
(根据这个解决方案不是一个好主意,因为在下一个 运行 应用程序就像上次崩溃一样 )
有人说使用System.exit(0);根据这个
也不推荐
有人说使用 finish();但是 finish 并没有按照我的意愿去做
感谢任何输入
如果你有一个允许它的机制,那么 you only deliver messages to the main thread when the application is resumed
, then you can register your activities on an event bus like Otto 并发送一个事件,每个 Activity 都订阅了他们自己调用 finish()
的事件。
另一个可能的解决方案是每隔 activity 从 startActivityForResult()
开始,如果您单击 exit
按钮,那么您会说
public static final int KILL_ACTIVITY_RESULT_CODE = 0xD34DB33F; //why not
public boolean onOptionsMenuItemSelected(MenuItem menuItem) {
if(menuItem.getId() == R.menu.kill_activity) {
setResult(KILL_ACTIVITY_RESULT_CODE);
finish();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == KILL_ACTIVITY_RESULT_CODE) {
setResult(KILL_ACTIVITY_RESULT_CODE);
finish();
}
}
}
...有一次我看到有人对他们拥有的每个 activity 进行静态引用,并对每个引用都调用 finish()
。但是不要那样做,那本质上意味着你作为一个 Android 程序员是失败的,没有什么可以挽回你的罪过。
作为出色的CommonsWare,在他的评论中指出了"Static"是问题所在!我正在使用静态变量来存储数据以填充我的 listView。显然,即使您只有一个 Activity 并关闭它,静态变量仍然完好无损!关于应用程序 运行!
如果你问我为什么首先使用静态变量,我不得不说,无论对错,我想在我的其他 java class(我的 databaseHandler.class)之间共享该变量。
为什么Android在关闭主应用程序且只有Activity应用程序时不清除所有(包括静态变量)资源,仍然是一个问题,这是我的下一个阅读主题!但非常感谢 post 对这个问题发表评论的人,
我也会把问题改成:
How Banking Apps close? finish() does not do the same job for me
至
closing an activity using finish(); wont make app start fresh in next
run! why?
我想知道是否有人可以阐明这一点,
我有一个 activity 应用程序,它有一个列表视图。在 onCreate() 中,我在该列表视图中填充了一些数据(从 sqlite 数据库读取)。我有一个触发 finish() 的关闭按钮;也。现在,当我按下关闭按钮时,activity 消失了,但是当我单击桌面上的应用程序图标(或从 phone 历史按钮中选择它)时,我会在列表视图中看到所有以前的数据。我正在寻找的功能是在单击下一个 运行 的关闭按钮后重新启动应用程序。 (类似于银行应用 log-out 按钮)。 (此处的列表视图只是满足需求的示例,因此在 finish(); 之前清除 list-view 是不可接受的。这是非常简单明了的请求,我认为不需要任何代码,但如果有人感兴趣我也会 post 一些代码。
我想要的是与退出时银行应用程序相同的行为,当用户离开主屏幕或单击注销时,应用程序将完全关闭。我可以通过使用以下方法(2 号和 3 号)来实现这一点,但 apparently 这些解决方案不是最佳实践。那么银行App是用什么方法瞬间关闭的呢?我怀疑他们使用的东西不是最佳实践,例如 System.exit(0)?!或者他们!
许多开发者声称关闭或杀死应用程序 parent activity 是 OS 工作
有人说用用:
int pid = android.as.Process.myPid();
android.os.Process.killProcess(pid);
(根据这个解决方案不是一个好主意,因为在下一个 运行 应用程序就像上次崩溃一样 )
有人说使用System.exit(0);根据这个 也不推荐
有人说使用 finish();但是 finish 并没有按照我的意愿去做
感谢任何输入
如果你有一个允许它的机制,那么 you only deliver messages to the main thread when the application is resumed
, then you can register your activities on an event bus like Otto 并发送一个事件,每个 Activity 都订阅了他们自己调用 finish()
的事件。
另一个可能的解决方案是每隔 activity 从 startActivityForResult()
开始,如果您单击 exit
按钮,那么您会说
public static final int KILL_ACTIVITY_RESULT_CODE = 0xD34DB33F; //why not
public boolean onOptionsMenuItemSelected(MenuItem menuItem) {
if(menuItem.getId() == R.menu.kill_activity) {
setResult(KILL_ACTIVITY_RESULT_CODE);
finish();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == KILL_ACTIVITY_RESULT_CODE) {
setResult(KILL_ACTIVITY_RESULT_CODE);
finish();
}
}
}
...有一次我看到有人对他们拥有的每个 activity 进行静态引用,并对每个引用都调用 finish()
。但是不要那样做,那本质上意味着你作为一个 Android 程序员是失败的,没有什么可以挽回你的罪过。
作为出色的CommonsWare,在他的评论中指出了"Static"是问题所在!我正在使用静态变量来存储数据以填充我的 listView。显然,即使您只有一个 Activity 并关闭它,静态变量仍然完好无损!关于应用程序 运行! 如果你问我为什么首先使用静态变量,我不得不说,无论对错,我想在我的其他 java class(我的 databaseHandler.class)之间共享该变量。
为什么Android在关闭主应用程序且只有Activity应用程序时不清除所有(包括静态变量)资源,仍然是一个问题,这是我的下一个阅读主题!但非常感谢 post 对这个问题发表评论的人,
我也会把问题改成:
How Banking Apps close? finish() does not do the same job for me
至
closing an activity using finish(); wont make app start fresh in next run! why?