前言

优雅的意思就是让别人看不懂,显的很酷炫,项目退出时都会用到,所以一定要收藏起来


使用

(1) RxBus优雅式

首先在基类BaseActivity里,注册RxBus监听

public class BaseActivity3 extends AppCompatActivity {    Subscription mSubscription;    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initRxBus();    }    //接收退出的指令,关闭所有activity    private void initRxBus() {        mSubscription = RxBus.getInstance().toObserverable(NormalEvent.class)                .subscribe(new Action1() {                               @Override                               public void call(NormalEvent userEvent) {                                   if (userEvent.getType() == -1) {                                       finish();                                   }                               }                           },                        new Action1() {                            @Override                            public void call(Throwable throwable) {                            }                        });    }    @Override    protected void onDestroy() {        super.onDestroy();        if (!mSubscription.isUnsubscribed()) {            mSubscription.unsubscribe();        }    }}

这是事件实体NormalEvent

public class NormalEvent {    private int type;    public NormalEvent(int type) {        this.type = type;    }    public int getType() {        return type;    }    public void setType(int type) {        this.type = type;    }}

新建RxBus类

public class RxBus {    private static volatile RxBus mInstance;    private final Subject bus;    public RxBus()    {        bus = new SerializedSubject<>(PublishSubject.create());    }    /**     * 单例模式RxBus     *     * @return     */    public static RxBus getInstance()    {        RxBus rxBus2 = mInstance;        if (mInstance == null)        {            synchronized (RxBus.class)            {                rxBus2 = mInstance;                if (mInstance == null)                {                    rxBus2 = new RxBus();                    mInstance = rxBus2;                }            }        }        return rxBus2;    }    /**     * 发送消息     *     * @param object     */    public void post(Object object)    {        bus.onNext(object);    }    /**     * 接收消息     *     * @param eventType     * @param      * @return     */    public  Observable toObserverable(Class eventType)    {        return bus.ofType(eventType);    }}

最后,在需要退出的地方调用:

 RxBus.getInstance().post(new NormalEvent(-1));//发送退出指令

(2)容器式

建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity

public class BaseActivity extends AppCompatActivity {    @Override    public void onCreate(@Nullable Bundle savedInstanceState ) {        super.onCreate(savedInstanceState);        ActivityManager.getActivityManager().addActivity(this);    }    @Override protected void onDestroy() {        super.onDestroy();       //  结束Activity&从栈中移除该Activity        ActivityManager.getActivityManager().finishActivity();    }}public class ActivityManager {        // Activity栈        private static Stack activityStack;        // 单例模式        private static ActivityManager instance;        private ActivityManager() {        }        /**         * 单一实例         */        public static ActivityManager getActivityManager() {            if (instance == null) {                instance = new ActivityManager();            }            return instance;        }        /**         * 添加Activity到堆栈         */        public void addActivity(Activity activity) {            if (activityStack == null) {                activityStack = new Stack();            }            activityStack.add(activity);        }        /**         * 获取当前Activity(堆栈中最后一个压入的)         */        public Activity currentActivity() {            Activity activity = activityStack.lastElement();            return activity;        }        /**         * 结束当前Activity(堆栈中最后一个压入的)         */        public void finishActivity() {            Activity activity = activityStack.lastElement();            finishActivity(activity);        }        /**         * 结束指定的Activity         */        public void finishActivity(Activity activity) {            if (activity != null) {                activityStack.remove(activity);                activity.finish();                activity = null;            }        }        /**         * 结束指定类名的Activity         */        public void finishActivity(Class<?> cls) {            for (Activity activity : activityStack) {                if (activity.getClass().equals(cls)) {                    finishActivity(activity);                }            }        }        /**         * 结束所有Activity         */        public void finishAllActivity() {            for (int i = 0; i < activityStack.size(); i++) {                if (null != activityStack.get(i)) {                    activityStack.get(i).finish();                }            }            activityStack.clear();        }        /**         * 退出应用程序         */        public void AppExit(Context context) {            try {                finishAllActivity();                //根据进程ID,杀死该进程                android.os.Process.killProcess(android.os.Process.myPid());                //退出真个应用程序                System.exit(0);            } catch (Exception e) {            }        }}

(3)广播式

通过在BaseActivity中注册一个广播,当退出时发送一个广播,finish退出

public class BaseActivity2 extends AppCompatActivity {    private static final String EXITACTION = "action.exit";    private ExitReceiver exitReceiver = new ExitReceiver();    @Override protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);         IntentFilter filter = new IntentFilter();         filter.addAction(EXITACTION);        registerReceiver(exitReceiver, filter);     }    @Override protected void onDestroy() {         super.onDestroy(); unregisterReceiver(exitReceiver);    }    class ExitReceiver extends BroadcastReceiver {         @Override public void onReceive(Context context, Intent intent) {            BaseActivity2.this.finish();         }     }}

(4)SingleTask

设置MainActivity的加载模式为singleTask

android:launchMode="singleTask"

将退出出口放置在MainActivity

private boolean mIsExit;    @Override /** * 双击返回键退出 */    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (mIsExit) {                this.finish();            } else {                Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();                mIsExit = true;                new Handler().postDelayed(new Runnable() {                    @Override public void run() {                        mIsExit = false;                    }                }, 2000);            } return true;        } return super.onKeyDown(keyCode, event);    }

(5)SingleTask改版式

第一步设置MainActivity的加载模式为singleTask

android:launchMode="singleTask"

第二步重写onNewIntent()方法

private static final String TAG_EXIT = "exit";     @Override    protected void onNewIntent(Intent intent) {         super.onNewIntent(intent);         if (intent != null) {             boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);             if (isExit) { this.finish();            }        }     }

第三步 退出

Intent intent = new Intent(this,MainActivity.class); intent.putExtra(MainActivity.TAG_EXIT, true);startActivity(intent);

(6)懒人式

这种方式更加简单,只需要如下两步操作

  • 1.将MainActivity设置为singleTask
  • 2.将退出出口放置在MainActivity

我们可以看到很多应用都是双击两次home键退出应用,就是基于这样的方式来实现的,这里在贴一下如何处理连续两次点击退出的源码

private boolean mIsExit;@Override    /**     * 双击返回键退出     */    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (mIsExit) {                this.finish();            } else {                Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();                mIsExit = true;                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        mIsExit = false;                    }                }, 2000);            }            return true;        }        return super.onKeyDown(keyCode, event);    }

(7)进程式

通过直接杀死当前应用的进程来结束应用,简单粗暴,而且有(wu)效!

    android.os.Process.killProcess(android.os.Process.myPid());    System.exit(0);    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);    manager.killBackgroundProcesses(getPackageName());

这三种都能达到同样的效果,但是在模拟器上都会弹出 Unfortunately , XXX has stopped 消息提示框,但确实能退出应用。部分真机直接失效,只能finish当前Activity(比如我手上这台小米note,国产的几款ROM fw层改动太多,使用这种方式需慎重)


总结

更多相关文章

  1. Android(安卓)7.1.2(Android(安卓)N) Multi-window-mode--多窗口
  2. Android连续点击两次返回键退出应用,提示“再按一次退出应用"
  3. APIcloud 按两次返回键退出程序,android按两次返回键退出程序
  4. 【Android】对话框之AlertDialog
  5. Android(安卓)关闭多个视图Intent.FLAG_ACTIVITY_CLEAR_TOP用法
  6. Android之——退出多个Activity
  7. Android(安卓)中进程、Activity、BoradcastReceiver、ContentObs
  8. Android之完美退出方法
  9. 菜鸟也能解决android中的OOM问题

随机推荐

  1. 仿微信备注 editext下划线
  2. [Android遊戲] 森林跑跑熊:iOS移植的殺時
  3. Android应用程序目录结构分析
  4. android中使用线程(比如修改textview的tex
  5. Go support for Android
  6. Android,GridLayout布局(简易计算器)
  7. Android 线程池来管理线程
  8. Android 组件属性
  9. Android 基本的UI布局
  10. android-R.string