Android开发技术分享Android开发Android进阶之路

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

2017-04-15  本文已影响217人  68fb2d874fe1
第一步:设置MainActivity的加载模式为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()的方法
/**
     * @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);
        }
}

借鉴博客: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」∠)),所以把源码贴出来分享一下。


上一篇下一篇

猜你喜欢

热点阅读