第一步:设置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);
}
}
第三步:监听返回键或点击事件(本文以返回键为例)
第一种:对话框形式
/**
* @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提示(突发奇想出来的)
Snackbar
是Android 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」∠)),所以把源码贴出来分享一下。
网友评论