Android开发:如何优雅的退出应用?

作者: 68fb2d874fe1 | 来源:发表于2017-04-15 18:46 被阅读217次
    第一步:设置MainActivity的加载模式为singleTask
    • 在AndroidManifest.xml添加
      android:launchMode="singleTask"
    • 完整代码:
    ```
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.elegant.exit">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity"
                android:launchMode="singleTask">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
    ```
    

    注意:App的MainActivity设为SingleTask的话,按Home键返回Launcher后,再次点击Launcher上的App入口,会导致MainActivity上的所有其它活动全部出栈,这点需要注意。


    第二步:重写MainActivity的onNewIntent()、finish()的方法
    • 重写onNewIntent()
    /**
         * @param intent
         * 重写onNewIntent()方法
         */
    @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            if (intent != null) {
                boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
                if (isExit) {
                    this.finish();
                }
            }
        }
    
    • 重写finish()
    /**
         * @param isFinish
         * 重写finish()方法
         */
    private void finish(boolean isFinish) {
            //这样写是与原finish()方法区分
            if (isFinish) {
                Intent intent = new Intent(this, MainActivity.class);
                intent.putExtra(MainActivity.TAG_EXIT, true);
                startActivity(intent);
            }
    }
    

    借鉴博客:Android退出应用最优雅的方式(改进版)


    第三步:监听返回键或点击事件(本文以返回键为例)

    第一种:对话框形式

    /**
     * @param keyCode
     * @param event
     * 监听返回键
     */
    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            new AlertDialog.Builder(MainActivity.this, R.style.DialogTheme)// R.style.DialogTheme为对话框的主题,也可以不加
                    .setTitle("提示:")
                    .setMessage("你确定要退出吗?")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish(true);// 或原finish()方法:finish();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }).show();
            return super.onKeyDown(keyCode, event);
        }
    

    第二种:Toast提示

    private long exitTime = 0;
    
    /**
     * @param keyCode
     * @param event
     * 监听返回键
     */
    @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 {
                finish(true);// 或原finish()方法:finish();
            }
            return true;   
        }
        return super.onKeyDown(keyCode, event);
    }
    

    第三种:Snackbar提示(突发奇想出来的)

    SnackbarAndroid Support Design Library库支持的一个控件具体的使用配置
    具体使用可以查看Snackbar使用及其注意事项没时间解释了,快使用Snackbar! - Android Snackbar花式使用指南

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.elegant.exit.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
    
    </RelativeLayout>
    
    

    MainActivity.java

    package com.elegant.exit;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.view.KeyEvent;
    import android.view.View;
    import android.widget.RelativeLayout;
    
    /**
     * Created by zpp0196 on 2017/04/15.
     */
    public class MainActivity extends AppCompatActivity {
    
        private RelativeLayout container;
        private static final String TAG_EXIT = "exit";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
        }
        
        private void initViews() {
            container = (RelativeLayout)findViewById(R.id.container);
        }
    
        /**
         * @param intent
         * 重写onNewIntent()方法
         */
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            if(intent != null) {
                boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
                if (isExit) {
                    this.finish();
                }
            }
        }
    
        /**
         * @param isFinish
         * 重写finish()方法
         */
        private void finish(boolean isFinish) {
            //这样写是与原finish()方法区分
            if(isFinish) {
                Intent intent = new Intent(this, MainActivity.class);
                intent.putExtra(MainActivity.TAG_EXIT, true);
                startActivity(intent);
            }
        }
        
        /**
         * @param keyCode
         * @param event
         * 监听返回键
         */
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
                Snackbar.make(container, "确定退出?", Snackbar.LENGTH_LONG).setAction("退出", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finish(true);// 或原finish()方法:finish();
                    }
                }).show();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
    }
    
    截图

    对话框形式Toast提示网上也有很多例子,这里就不贴源码了,Snackbar提示网上很少(好像没有(:3」∠)),所以把源码贴出来分享一下。


    相关文章

      网友评论

        本文标题:Android开发:如何优雅的退出应用?

        本文链接:https://www.haomeiwen.com/subject/flxoattx.html