青岛Android培训
达内青岛山东中心

15610069419

热门课程

退出多个activity的方法

  • 时间:2016-09-21
  • 发布:青岛android培训
  • 来源:青岛android培训

1.使用List集合方式

用list保存activity实例,然后逐一干掉

import java.util.LinkedList;

import java.util.List;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Application;

import android.content.DialogInterface;

import android.content.Intent;

public class SysApplication extends Application {

private List mList = new LinkedList();

private static SysApplication instance;

private SysApplication() {

}

public synchronized static SysApplication getInstance() {

if (null == instance) {

instance = new SysApplication();

}

return instance;

}

// add Activity

public void addActivity(Activity activity) {

mList.add(activity);

}

public void exit() {

try {

for (Activity activity : mList) {

if (activity != null)

activity.finish();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

// System.exit(0);//去掉这个

}

}

@Override

public void onLowMemory() {

super.onLowMemory();

System.gc();

}

}

在每个Activity的onCreate方法中添加类似代码:

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

SysApplication.getInstance().addActivity(this);

}

在需要退出程序的时候,调用:

1SysApplication.getInstance().exit();

简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法

优点:实现简单,逻辑清晰

2.使用广播

推荐!!好方便!!

基本逻辑就是:定义一个BaseActivity,在这个Activity中绑定广播,在广播的onReceive方法中调用finish();然后以后的Activity都继承这个Activity,退出时发送广播,退出BaseActivity,父activity都退出了,子activity肯定退出。

代码如下:

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.support.v7.app.AppCompatActivity;

public class BaseActivity extends AppCompatActivity {

protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

finish();

}

};

@Override

public void onResume() {

super.onResume();

// 在当前的activity中注册广播

IntentFilter filter = new IntentFilter();

filter.addAction("ExitApp");

this.registerReceiver(this.broadcastReceiver, filter);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy(); //解除绑定

this.unregisterReceiver(this.broadcastReceiver);

}

}

一个Activity实例:

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class ActivityC extends BaseActivity {

Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_activity_c);

SysApplication.getInstance().addActivity(this);

btn = (Button) findViewById(R.id.acticityc_btn);

//关闭所有的activity

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

}

});

}

/**

* 捕获手机物理菜单键

*/

private long exitTime = 0;

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN

if((System.currentTimeMillis()-exitTime) > 2000){

Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();

exitTime = System.currentTimeMillis();

} else {

myExit();

}

return true;

}

return super.onKeyDown(keyCode, event);

}

protected void myExit() {

//第二种退出方法

// SysApplication.getInstance().exit();

Intent intent = new Intent();

intent.setAction("ExitApp");

this.sendBroadcast(intent);

//super.finish();

}

@Override

protected void onStop() {

super.onStop();

Log.i("tag","ActivityC-onStop");

}

@Override

protected void onDestroy() {

super.onDestroy();

Log.i("tag","ActivityC-onDestroy");

}

}

就是在退出的地方调用这个:

private long exitTime = 0;

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN

if((System.currentTimeMillis()-exitTime) > 2000){

Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();

exitTime = System.currentTimeMillis();

} else {

myExit();

}

return true;

}

return super.onKeyDown(keyCode, event);

}

protected void myExit() {

//第二种退出方法

// SysApplication.getInstance().exit();

Intent intent = new Intent();

intent.setAction("ExitApp");

this.sendBroadcast(intent);

//super.finish();

}

优点:方便,方便!!只需要在退出的地方发送广播就可以!!

这是我的退出时的输出:

608-09 15:33:48.869 26919-26919/example.com.closeapp I/tag: MainActivity-onPause

08-09 15:33:49.279 26919-26919/example.com.closeapp I/tag: MainActivity-onStop

08-09 15:33:51.569 26919-26959/example.com.closeapp D/OpenGLRenderer: endAllStagingAnimators on 0x55850598b0 (RippleDrawable) with handle 0x5585041510

08-09 15:33:56.079 26919-26919/example.com.closeapp I/tag: MainActivity-onDestroy

08-09 15:33:56.089 26919-26919/example.com.closeapp I/tag: ActivityB-onDestroy

08-09 15:33:56.399 26919-26919/example.com.closeapp I/tag: ActivityC-onDestroy

如果您觉得阅读本文对您有帮助,请点一下推荐”按钮,您的“推荐?将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利?

分类: android学习标签: Activity, BroadcastReceiver好文要顶 关注我 收藏该文

超超boy

关注 - 9

粉丝 - 21+加关注00« 上一篇:Failed to apply plugin [id 'com.android.application'] 和 Could not find com.android.tools.build:gradle:2.XX的最正确的解决方法

posted @ 2016-09-21 11:17 超超boy 阅读(4) 评论(0) 编辑 收藏

上一篇:浅谈Bluetooth蓝牙开发
下一篇:activity启动方式汇总

这些功能安卓可以做到!而苹果做不到!

容器+DevOps:企业IT 变革之路

程序员的业余生活还能有什么收入

安卓手机还需要Root吗

选择城市和中心
贵州省

广西省

海南省