双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出)。
====================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; //重置退出标识 } } }
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>
其实 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(); } }