Android 退出整个程序代码

今天在网上看见个博客关于退出整个程序的,感觉不错,拿来分享学习

SysApplication这个类复制到工程里面,然后在每个Acitivity的oncreate方法里面通过SysApplication.getInstance().addActivity(this); 添加当前Acitivity到ancivitylist里面去,*后在想退出的时候调用SysApplication.getInstance().exit();可直接关闭所有的Acitivity并退出应用程序。

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.app.Application;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. public class SysApplication extends Application {
  9. private List mList = new LinkedList();
  10. private static SysApplication instance;
  11. private SysApplication() {
  12. }
  13. public synchronized static SysApplication getInstance() {
  14. if (null == instance) {
  15. instance = new SysApplication();
  16. }
  17. return instance;
  18. }
  19. // add Activity
  20. public void addActivity(Activity activity) {
  21. mList.add(activity);
  22. }
  23. public void exit() {
  24. try {
  25. for (Activity activity : mList) {
  26. if (activity != null)
  27. activity.finish();
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. System.exit(0);
  33. }
  34. }
  35. public void onLowMemory() {
  36. super.onLowMemory();
  37. System.gc();
  38. }
  39. }

在应用程序里面 的activity的oncreate里面添加SysApplication.getInstance().addActivity(this)
如:

  1. public void onCreate(Bundle savedInstanceState)
  2. {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.main);
  5. SysApplication.getInstance().addActivity(this);
  6. }

 

Android 完全退出当前应用程序的四种正确方法

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A。在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方法
1. Dalvik VM的本地方法

复制代码代码如下:

android.os.Process.killProcess(android.os.Process.myPid())    //获取PID
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

2. 任务管理器方法
首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上
<uses-permission android:name=\”android.permission.RESTART_PACKAGES\”></uses-permission>

3. 根据Activity的声明周期

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志     Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

在A窗口中使用下面的代码调用B窗口

复制代码代码如下:

Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置
startActivity(intent);
接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

4.自定义一个Actiivty 栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:

复制代码代码如下:

* 将项目里面的activity管理起来;退出应用时,清除内存;
*/

public class ActManager {

private static Stack<Activity> activityStack;
private static ActManager instance;

/**
* 单例模式 创建单一实例
*
* @return
*/
public static ActManager getAppManager() {
if (instance == null) {
instance = new ActManager();
}
return instance;
}

/**
* 初始化Stack<Activity>
*/
private static void initActivityStack() {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
}

/**
* 添加Activity到堆栈
*
* @param activity
*/
public static void addActivity(Activity activity) {
initActivityStack();
activityStack.add(activity);
}

/**
* 获取当前Activity(堆栈中*后一个压入的)
*
* @return
*/
public static Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}

/**
* 结束指定的Activity
*/
public static void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}

/**
* 结束当前Activity(堆栈中*后一个压入的)
*/
public static void finishActivity() {
//获取到当前Activity
Activity activity = activityStack.lastElement();
//结束指定Activity
finishActivity(activity);
}

/**
* 结束指定类名的Activity
*/
public static void finishActivity(Class<?> cls) {
List<Activity> activities = new ArrayList<Activity>();
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
// finishActivity(activity);
activities.add(activity);
}
}
// 结束所有类名相同activity
activityStack.removeAll(activities);
for (Activity activity : activities) {
finishActivity(activity);
}
}

/**
* 结束所有Activity
*/
public static void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
Activity activity = activityStack.get(i);
if (!activity.isFinishing()) {
activity.finish();
}
}
}
activityStack.clear();
}

/**
* 退出应用程序
* 这里关闭的是所有的Activity,没有关闭Activity之外的其他组件;
* android.os.Process.killProcess(android.os.Process.myPid())
* 杀死进程关闭了整个应用的所有资源,有时候是不合理的,通常是用
* 堆栈管理Activity;System.exit(0)杀死了整个进程,这时候活动所占的
* 资源也会被释放,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks.
* 它能有效的释放JVM之外的资源,执行清除任务,运行相关的finalizer方法终结对象,
* 而finish只是退出了Activity。
*/
public static void AppExit(Context context) {
try {
finishAllActivity();
//DalvikVM的本地方法
// 杀死该应用进程
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(0);
//这些方法如果是放到主Activity就可以退出应用,如果不是主Activity
//就是退出当前的Activity
} catch (Exception e) {
}
}
}

复制代码代码如下:

android.os.Process.killProcess(android.os.Process.myPid())    //获取PID
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

 

 

AndroidStudio按钮Button退出程序

AndroidStudio 3.1.4

%title插图%num%title插图%num

1.创建一个新的项目,项目名称为Button,界面为activity_button.xml

%title插图%num%title插图%num

2.打开activity_button.xml

%title插图%num%title插图%num

3.点击HelloWorld标签,按Delete删除

%title插图%num%title插图%num

4.左侧组件栏选择Common – Button

%title插图%num%title插图%num

5.将Button组件拖到界面上,大概中间的位置

%title插图%num%title插图%num

6.右侧修改属性

%title插图%num%title插图%num

onClick是鼠标点击事件接收函数,后面写代码需要用到

7.界面完成后的样子

%title插图%num%title插图%num

8.双击java\com.包名.button后面不带括号的

%title插图%num%title插图%num

9.代码编辑框下写代码

%title插图%num%title插图%num

10.代码如下

showdialog为鼠标按下事件接收函数,这个子程序是在鼠标按下按钮Button时触发

 1     public void showdialog(View view)
 2     {
 3         //定义一个新的对话框对象
 4         AlertDialog.Builder alertdialogbuilder=new AlertDialog.Builder(this);
 5         //设置对话框提示内容
 6         alertdialogbuilder.setMessage("确定要退出程序吗?");
 7         //定义对话框2个按钮标题及接受事件的函数
 8         alertdialogbuilder.setPositiveButton("确定",click1);
 9         alertdialogbuilder.setNegativeButton("取消",click2);
10         //创建并显示对话框
11         AlertDialog alertdialog1=alertdialogbuilder.create();
12         alertdialog1.show();
13 
14     }

监听上面定义的对话框按钮事件

 1     private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener()
 2     {
 3         //使用该标记是为了增强程序在编译时候的检查,如果该方法并不是一个覆盖父类的方法,在编译时编译器就会报告错误。
 4         @Override
 5 
 6         public void onClick(DialogInterface arg0,int arg1)
 7         {
 8             //当按钮click1被按下时执行结束进程
 9             android.os.Process.killProcess(android.os.Process.myPid());
10         }
11     };
12 
13     private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener()
14     {
15         @Override
16         public void onClick(DialogInterface arg0,int arg1)
17         {
18             //当按钮click2被按下时则取消操作
19             arg0.cancel();
20         }
21     };
22 
23 }

11.完成编写后点击右上角的AVD Manager

%title插图%num %title插图%num%title插图%num

12.选择已下载的模拟器

%title插图%num%title插图%num

13.如果没有下载模拟器可以点击下方的Create Virtual Device进行下载

14.点击Actions下的播放按钮进行运行

%title插图%num%title插图%num

15.成功开启后的样子

%title插图%num%title插图%num

16.点击菜单栏Run下的Run ‘app’进行调试

%title插图%num%title插图%num

17.选择刚刚开启的模拟器型号,点击OK

%title插图%num%title插图%num

18.程序会进行编译,如果没有错误在模拟器中会正常显示

%title插图%num%title插图%num

19.点击调试中软件的BUTTON

%title插图%num%title插图%num

20.点击确定,软件正常结束,证明调试成功

%title插图%num%title插图%num

21.可以选择带签名的打包,编程成apk文件啦!Lucky~

Android开发实践八:点击一个按钮退出整个程序

# 参考资源 #

https://blog.csdn.net/sinat_33921105/article/details/57096554

main.java添加如下代码:

public static List<Activity> activityList = new LinkedList();

public void exit()
{

for(Activity act:activityList)
{
act.finish();
}

System.exit(0);

}
在main.java调用的按钮里添加如下代码:

btn4.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
exit();

}
});
在每个activity的oncreat里面写上如下这么一句代码,记得要写在 setContentView 之后:

Main.activityList.add(this);

 

Android中实现一键退出应用程序

思路
将所有的activity添加到list集合中,通过点击事件对list集合中的activity进行遍历退出,*后应用退出。

Demo图片展示

%title插图%num

实现
创建一个ExitApplication类 对所有Activity的退出进行管理
public class ExitApplication extends Application{
private List<Activity> activityList = new ArrayList<>();
private static ExitApplication instance;

public ExitApplication(){}
public static ExitApplication getInstance(){
if(null == instance){
instance = new ExitApplication();
}
return instance;
}

//添加Activity到容器中
public void addActivity(Activity activity){
//Log.i(“activity”, “size:” + activityList.size());
//Log.i(“activity”, “name:” + activity.getIntent());
activityList.add(activity);
}

//遍历所有Activity并finish
public void exit(){
for(Activity activity : activityList){
//依次关闭
activity.finish();
//Log.i(“activity”, “del_size:” + activityList.size());
//Log.i(“activity”, “del_name:” + activity.getIntent());
}
//强制退出
System.exit(0);
}
}

在MainActivity,SecondActivity等Activity中将Activity添加进集合中(可以将exitActivity()方法抽取到BaseActivity中,在Demo中我抽取到BaseActivity中了)
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
exitActivity();

private void initView() {
//此处均为findViewById操作,跟主题无关,代码省略
}

private void initData() {
//跟主题无关,代码省略
}

//退出此Acitvity
private void exitActivity() {
ExitApplication.getInstance().addActivity(MainActivity.this);
}
}

在SecondActivity中和此MainActivity中的代码相同。

在有退出按钮的ThirdActivity中,实现点击按钮应用退出操作
public class ThirdActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
initView();
initData();
exitActivity();

private void initView() {
//此处均为findViewById操作,跟主题无关,代码省略
}

private void initData() {
//跟主题无关,代码省略
}

//退出此Acitvity
private void exitActivity() {
ExitApplication.getInstance().addActivity(ThirdActivity.this);
}

//点击按钮退出应用程序 在此按钮属性中设置了onClick = logout
public void logout(View view){
ExitApplication.getInstance().exit();
}
}

 

 

Android Studio安卓开发如何按钮退出程序(所有的Activity)

Android Studio安卓开发如何按钮退出程序(所有的Activity)
只需要一个专门的集合对所有的Activity进行管理
(kotlin版本)

1. 新建一个单例类ActivityCollector作为Activity的集合

/* 单例类ActivityCollector作为Activity的集合,对所有的Activity进行管理 */

object ActivityCollector {
private val activities=ArrayList<Activity>()

/* 用于向ArrayList中添加Activity */
fun addActivity(actity:Activity){
activities.add(actity)
}

/* 用于从ArrayList中移除Activity */
fun removeActivity(actity: Activity){
activities.remove(actity)
}

/* 用于将ArrayList中存储的Activity全部销毁 */
fun finishAll(){
for (activity in activities){
if (!activity.isFinishing){
activity.finish()
}
}
activities.clear()
}
}

2. 新建Class取名BaseActivity,添加代码让其继承AppCompatActivity,并重写onCreat()方法,重写onDestroy()方法

open class BaseActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ActivityCollector.addActivity(this)
}

override fun onDestroy() {
super.onDestroy()
ActivityCollector.removeActivity(this)
}
}

3. 让所有Activity继承BaseActivity,由于BaseActivity继承自AppCompatActivity,所以所有Activity现有功能都不受影响

class MainActivity : BaseActivity()

4. 设置按钮的点击事件,只需调用ActivityCollector的finishAll方法

//退出程序
set_close.setOnClickListener {
ActivityCollector.finishAll()
}