closures应用程序并在Android上启动主屏幕
我有两个不同的活动。 第一个启动第二个。 在第二个活动中,我调用System.exit(0)
为了强制应用程序closures,但是第一个活动自动显示,而不是返回到主屏幕的应用程序。 我怎样才能避免这一点,并获得应用程序返回到主屏幕?
你真的应该考虑不退出应用程序。 这不是Android应用程序通常的工作方式。
简短的回答: 在Activity
上调用moveTaskToBack(true)
而不是System.exit()
。 这将隐藏你的应用程序,直到用户想再次使用它。
较长的答案从另一个问题开始:为什么你想要杀死你的应用程序?
Android操作系统处理内存pipe理和stream程等等,所以我的build议只是让Android为你担心。 如果用户想要离开你的应用程序,他们可以按下主页button,你的应用程序将会消失。 如果手机稍后需要更多内存,操作系统将终止您的应用程序。
只要您正确地响应生命周期事件 ,您和用户都不需要关心应用程序是否仍在运行。
所以,如果你想隐藏你的应用程序调用moveTaskToBack()
,让Android决定何时杀死它。
下面给出了实现这个最简单的方法(不影响Android的本机内存pipe理,不涉及进程的查杀)。
-
使用这个意图启动一个活动:
Intent intent = new Intent(this, FinActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish();
-
在目标活动
FinActivity.class
,调用onCreate
finish()。
步骤说明:
-
您创build一个删除所有其他活动
(FLAG_ACTIVITY_CLEAR_TOP)
的意图并删除当前活动。 -
这个活动破坏了自己。 另一种方法是,你可以在FinActivity中做一个启animation面。 这是可选的。
Android有一个机制来安全地closures每个文档的应用程序。 在退出的最后一个Activity(通常是应用程序启动时首次出现的主Activity)中,只需在onDestroy()方法中放置几行即可。 对System.runFinalizersOnExit(true)的调用可确保在应用程序退出时所有对象都将被最终化并进行垃圾回收。 例如:
public void onDestroy() { super.onDestroy(); /* * Notify the system to finalize and collect all objects of the * application on exit so that the process running the application can * be killed by the system without causing issues. NOTE: If this is set * to true then the process will not be killed until all of its threads * have closed. */ System.runFinalizersOnExit(true); /* * Force the system to close the application down completely instead of * retaining it in the background. The process that runs the application * will be killed. The application will be completely created as a new * application in a new process if the user starts the application * again. */ System.exit(0); }
最后,Android不会通知HOME键事件的应用程序,所以当按下HOME键时不能closures应用程序。 Android将自己的HOME键事件保留给自己,以便开发人员不能阻止用户离开他们的应用程序。
您也可以在标签中为第一个活动指定noHistory =“true”,或者在您开始第二个活动后立即完成第一个活动(如David所说)。
AFAIK,“强制closures”会杀死托pipe应用程序所运行的JVM的进程,并且System.exit()终止运行应用程序实例的JVM。 两者都是突然终止的forms,不build议正常的应用程序stream程。
正如捕捉程序可能执行的逻辑stream程的例外情况是不可取的。
我用这个方法closures活动!
public static void closeAllBelowActivities(Activity current) { boolean flag = true; Activity below = current.getParent(); if (below == null) return; System.out.println("Below Parent: " + below.getClass()); while (flag) { Activity temp = below; try { below = temp.getParent(); temp.finish(); } catch (Exception e) { flag = false; } } }
当您启动第二个活动时,立即finish()
第一个活动:
startActivity(new Intent(...)); finish();
android.os.Process.killProcess(android.os.Process.myPid());
工作正常,但build议让Android平台担心内存pipe理:-)
我使用这个:
1)父活动使用方法“startActivityForResult”调用次活动
2)在正在closures的次要活动中:
int exitCode = 1; // Select the number you want setResult(exitCode); finish();
3)在父活动中重写方法“onActivityResult”:
public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); int exitCode = 1; if(resultCode == exitCode) { super.setResult(exitCode); // use this if you have more than 2 activities finish(); } }
这对我来说很好。
使用finish
方法。 这是更简单,更简单的方法。
this.finish();
你不能做System.exit(),这是不安全的。
你可以做这个:Process.killProcess(Process.myPid());
请记住,在使用持久套接字连接的应用程序时, finish()
方法不会释放连接。 在正常情况下, finish()
是最好的select,但是如果您绝对需要退出应用程序并释放所有正在使用的资源,请使用killProcess
。 我没有使用它的问题。
用startActivityForResult启动第二个活动,在第二个活动中返回一个值,一旦在第一个活动的onActivityResult方法中closures主应用程序。 我认为这是Android做的正确方式。
尝试以下。 它适用于我。
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); ComponentName componentInfo = taskInfo.get(0).topActivity; am.restartPackage(componentInfo.getPackageName());
这实际上很安静。
我这样做的方法是通过在所有可用的静态variables中保存一个标志。 然后,当我退出时,我设置了这个标志,所有的活动都检查这个标志onResume
。 如果该标志被设置,那么我在该活动上发出System.exit
。
这样所有的活动将检查国旗,并将优雅地closures,如果国旗设置。
你错了。 有一种方法可以杀死一个应用程序。 在具有超类Application的类中,我们使用了一些字段,例如killApp
。 当我们在onResume()
启动启animation面(第一个活动)时,我们为字段killApp
设置了false参数。 在我们最后调用onResume()
每一个活动中,我们都会这样调用:
if(AppClass.killApp()) finish();
每一个进入屏幕的活动都必须调用onResume()
。 当它被调用时,我们必须检查我们的字段killApp
是否为真。 如果是,则当前活动调用finish()
。 为了调用完整的操作,我们使用下一个构造。 例如,在button的操作中:
AppClass.setkillApplication(true); finish(); return;
这是我closures应用程序所做的:在我的应用程序中,我有一个基本的活动类,我添加了一个名为“applicationShutDown”的静态标志。 当我需要closures应用程序时,我将其设置为true。
在调用超级调用后的基础活动onCreate和onResume我testing这个标志。 如果“applicationShutDown”为true,则在当前Activity上调用完成。
这对我工作:
protected void onResume() { super.onResume(); if(BaseActivity.shutDownApp) { finish(); return; }}
假设你有活动堆栈,如A> B> C> D> E。 你在D活动,你想closures你的应用程序。 这就是你会做的 –
在你要closures的活动(活动D) –
Intent intent = new Intent(D.this,A.class); intent.putExtra("exit", "exit"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);
在您的RootActivity(即您的基本活动,在这里活动A) –
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.hasExtra("exit")) { setIntent(intent); } } @Override protected void onResume() { super.onResume(); if (getIntent() != null) { if (("exit").equalsIgnoreCase(getIntent().getStringExtra(("exit")))) { onBackPressed(); } } }
onNewIntent被使用,因为如果活动是活着的,它将获得第一个启动它的意图。 不是新的。 有关更多详细信息 – 文档
使用开始活动运行结果的第二个活动:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); //This line is important intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivityForResult(intent, REQUEST_CODE);
将此函数添加到第一个Activity:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(rquestCode == REQUEST_CODE) if(resultCode == RESULT_CANCELED) finish(); }
并添加到第二个活动:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Log.i(TAG, "Back key pressed"); setResult(RESULT_CANCELED); finish(); return true; } return super.onKeyDown(keyCode, event); }
这不是build议,但你仍然可以使用这个。 如果您需要退出应用程序,最好使用此解决scheme。
据我所知,最好的解决scheme是完成你的应用程序中的每个活动,如下所示。
第1步。在mainactivity中维护一个静态variables。 说,
public static boolean isQuit = false;
第二步:点击一个button的事件,将这个variables设置为true。
mainactivity.isQuit = true; finish();
第3步。在你的应用程序的每一个活动,有如下的onrestart
方法。
@Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); if(mainactivity.isQuit) finish(); }
我解决了一个类似的问题:MainActivity启动BrowserActivity,当用户在BrowserActivity中按Back时,不需要在MainActivity中返回,我需要closures应用程序。 所以,在MainActivity中:
public class MainActivity extends AppCompatActivity { private static final String TAG = "sm500_Rmt.MainActivity"; private boolean m_IsBrowserStarted = false;
然后,在OnResume中:
@Override protected void onResume() { super.onResume(); if(m_IsBrowserStarted) { Log.w(TAG, "onResume, but it's return from browser, just exit!"); finish(); return; } Log.w(TAG, "onResume");
…然后继续OnResume。 而且,当启动BrowserActivity时:
Intent intent = new Intent(this, BrowserActivity.class); intent.putExtra(getString(R.string.IPAddr), ip); startActivity(intent); m_IsBrowserStarted = true;
而且它看起来很好用! 🙂