首页 > 技术文章 > Android 双击 Back 键退出程序

woider 原文

双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出)。

====================Alarm 机制实现=========================

AlarmActivity.java

public class AlarmActivity extends Activity {
    private static boolean quit = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 重写 Back 键方法
     */
    public void onBackPressed() {
        if (quit == false) {
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            alarmAtTime();                          //调用计时器
            quit = true;                            //设置退出标识
        } else {
            super.onBackPressed();
            quit = false;
            this.finish();            //退出当前Activity
        }
    }

    /**
     *  Alarm 机制计时器
     */
    private void alarmAtTime() {
        Intent intent = new Intent(this, AlarmReceiver.class);              //启动接收器
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);  //设置延迟启动
        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        long delay = System.currentTimeMillis() + 2000;         //取得当前时间,并延迟2秒
        manager.set(AlarmManager.RTC_WAKEUP, delay, pi);        //延迟启动广播接收器
    }

    /**
     *  BroadcastReceiver 广播接收器
     */
    public static class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            quit = false;           //重置退出标识
        }
    }
}
AlarmActivity.java

AndroidManifest.xml

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".AlarmActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".Activity.AlarmActivity$AlarmReceiver"></receiver>
    </application>
AndroidManifest.xml

其实 Alarm 机制用于双击退出任务显得有些大材小用了,Java API 里提供的 Timer 类就能很好的完成这个任务。
Alarm 机制适合那些长期在后台运行的定时任务,并且它具有唤醒CPU的功能,即可保证每次需要执行定时任务的时候都能正常工作。

====================Timer 机制实现============================

    private boolean quit = false;   //设置退出标识

    @Override
    public void onBackPressed() {
        if (quit == false) {        //询问退出程序
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            new Timer(true).schedule(new TimerTask() {      //启动定时任务
                @Override
                public void run() {
                    quit = false;   //重置退出标识
                }
            }, 2000);               //2秒后运行run()方法
            quit = true;
        } else {                    //确认退出程序
            super.onBackPressed();
            finish();
        }
    }

推荐阅读