android怎么关应用程序,如何关闭Android应用程序?

Android有一个机制,以根据其文档安全地关闭应用程序。在退出的最后一个活动(通常是应用程序启动时首先出现的主要活动)中,只需在onDestroy()方法中放置几行。对System.runFinalizersOnExit(true)的调用确保所有对象将在应用程序退出时完成和垃圾收集。你也可以通过android.os.Process.killProcess(android.os.Process.myPid())如果你喜欢快速杀死一个应用程序。最好的方法是在helper类中放入一个如下所示的方法,然后在应用程序需要被杀死时调用它。例如在根活动的destroy方法中(假设应用程序永远不会杀死此活动):

此外,Android不会通知应用程序的HOME键事件,因此您无法在按下HOME键时关闭应用程序。 Android将HOME键事件保留给自己,以便开发人员不能阻止用户离开他们的应用程序。然而,您可以通过在假设已按下HOME键的帮助类中将标志设置为true来确定HOME键是否被按下,然后当发生显示未按下HOME键的事件时将标志更改为false,然后检查以查看活动的onStop()方法中按下的HOME键。

不要忘记处理任何菜单的HOME键和由菜单启动的活动。对于SEARCH键也是如此。下面是一些示例类来说明:

下面是一个根活动的示例,当应用程序被销毁时杀死它:

package android.example;

/**

* @author Danny Remington - MacroSolve

*/

public class HomeKey extends CustomActivity {

public void onDestroy() {

super.onDestroy();

/*

* Kill application when the root activity is killed.

*/

UIHelper.killApp(true);

}

}

这里有一个抽象活动,可以扩展为处理所有活动的HOME键扩展它:

package android.example;

/**

* @author Danny Remington - MacroSolve

*/

import android.app.Activity;

import android.view.Menu;

import android.view.MenuInflater;

/**

* Activity that includes custom behavior shared across the application. For

* example, bringing up a menu with the settings icon when the menu button is

* pressed by the user and then starting the settings activity when the user

* clicks on the settings icon.

*/

public abstract class CustomActivity extends Activity {

public void onStart() {

super.onStart();

/*

* Check if the app was just launched. If the app was just launched then

* assume that the HOME key will be pressed next unless a navigation

* event by the user or the app occurs. Otherwise the user or the app

* navigated to this activity so the HOME key was not pressed.

*/

UIHelper.checkJustLaunced();

}

public void finish() {

/*

* This can only invoked by the user or the app finishing the activity

* by navigating from the activity so the HOME key was not pressed.

*/

UIHelper.homeKeyPressed = false;

super.finish();

}

public void onStop() {

super.onStop();

/*

* Check if the HOME key was pressed. If the HOME key was pressed then

* the app will be killed. Otherwise the user or the app is navigating

* away from this activity so assume that the HOME key will be pressed

* next unless a navigation event by the user or the app occurs.

*/

UIHelper.checkHomeKeyPressed(true);

}

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.settings_menu, menu);

/*

* Assume that the HOME key will be pressed next unless a navigation

* event by the user or the app occurs.

*/

UIHelper.homeKeyPressed = true;

return true;

}

public boolean onSearchRequested() {

/*

* Disable the SEARCH key.

*/

return false;

}

}

下面是处理HOME键的菜单屏幕的示例:

/**

* @author Danny Remington - MacroSolve

*/

package android.example;

import android.os.Bundle;

import android.preference.PreferenceActivity;

/**

* PreferenceActivity for the settings screen.

*

* @see PreferenceActivity

*

*/

public class SettingsScreen extends PreferenceActivity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.layout.settings_screen);

}

public void onStart() {

super.onStart();

/*

* This can only invoked by the user or the app starting the activity by

* navigating to the activity so the HOME key was not pressed.

*/

UIHelper.homeKeyPressed = false;

}

public void finish() {

/*

* This can only invoked by the user or the app finishing the activity

* by navigating from the activity so the HOME key was not pressed.

*/

UIHelper.homeKeyPressed = false;

super.finish();

}

public void onStop() {

super.onStop();

/*

* Check if the HOME key was pressed. If the HOME key was pressed then

* the app will be killed either safely or quickly. Otherwise the user

* or the app is navigating away from the activity so assume that the

* HOME key will be pressed next unless a navigation event by the user

* or the app occurs.

*/

UIHelper.checkHomeKeyPressed(true);

}

public boolean onSearchRequested() {

/*

* Disable the SEARCH key.

*/

return false;

}

}

下面是一个帮助类的示例,它处理应用程序中的HOME键:

package android.example;

/**

* @author Danny Remington - MacroSolve

*

*/

/**

* Helper class to help handling of UI.

*/

public class UIHelper {

public static boolean homeKeyPressed;

private static boolean justLaunched = true;

/**

* Check if the app was just launched. If the app was just launched then

* assume that the HOME key will be pressed next unless a navigation event

* by the user or the app occurs. Otherwise the user or the app navigated to

* the activity so the HOME key was not pressed.

*/

public static void checkJustLaunced() {

if (justLaunched) {

homeKeyPressed = true;

justLaunched = false;

} else {

homeKeyPressed = false;

}

}

/**

* Check if the HOME key was pressed. If the HOME key was pressed then the

* app will be killed either safely or quickly. Otherwise the user or the

* app is navigating away from the activity so assume that the HOME key will

* be pressed next unless a navigation event by the user or the app occurs.

*

* @param killSafely

* Primitive boolean which indicates whether the app should be

* killed safely or quickly when the HOME key is pressed.

*

* @see {@link UIHelper.killApp}

*/

public static void checkHomeKeyPressed(boolean killSafely) {

if (homeKeyPressed) {

killApp(true);

} else {

homeKeyPressed = true;

}

}

/**

* Kill the app either safely or quickly. The app is killed safely by

* killing the virtual machine that the app runs in after finalizing all

* {@link Object}s created by the app. The app is killed quickly by abruptly

* killing the process that the virtual machine that runs the app runs in

* without finalizing all {@link Object}s created by the app. Whether the

* app is killed safely or quickly the app will be completely created as a

* new app in a new virtual machine running in a new process if the user

* starts the app again.

*

*

* NOTE: The app will not be killed until all of its threads have

* closed if it is killed safely.

*

*

*

* NOTE: All threads running under the process will be abruptly

* killed when the app is killed quickly. This can lead to various issues

* related to threading. For example, if one of those threads was making

* multiple related changes to the database, then it may have committed some

* of those changes but not all of those changes when it was abruptly

* killed.

*

*

* @param killSafely

* Primitive boolean which indicates whether the app should be

* killed safely or quickly. If true then the app will be killed

* safely. Otherwise it will be killed quickly.

*/

public static void killApp(boolean killSafely) {

if (killSafely) {

/*

* Notify the system to finalize and collect all objects of the app

* on exit so that the virtual machine running the app can be killed

* by the system without causing issues. NOTE: If this is set to

* true then the virtual machine will not be killed until all of its

* threads have closed.

*/

System.runFinalizersOnExit(true);

/*

* Force the system to close the app down completely instead of

* retaining it in the background. The virtual machine that runs the

* app will be killed. The app will be completely created as a new

* app in a new virtual machine running in a new process if the user

* starts the app again.

*/

System.exit(0);

} else {

/*

* Alternatively the process that runs the virtual machine could be

* abruptly killed. This is the quickest way to remove the app from

* the device but it could cause problems since resources will not

* be finalized first. For example, all threads running under the

* process will be abruptly killed when the process is abruptly

* killed. If one of those threads was making multiple related

* changes to the database, then it may have committed some of those

* changes but not all of those changes when it was abruptly killed.

*/

android.os.Process.killProcess(android.os.Process.myPid());

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值