网上关于一键关闭应用的方式方法很多,最常见的是三种:
1:写一个BaseActivity然后选择启动模式为singleTask,一键应用的时候就BaseActivity.this.finish();
2:MyApplication中写一个addActivity的函数,把所有走过的Activity都加进一个list中,然后再写一个exit的方法,逐一取出list列表中的Activity进行finish();
3:启动一个Service,然后在里面注册一个广播监听函数,当触发一键关闭功能的按键时,广播接收函数就直接执行关闭应用的操作。最好是写BindService启动方式,这样不用担心在哪个地方去停止服务。
现在代码贴出来的就是第三种方式。
这个功能是对HOME键进行监听,然后彻底关闭应用。这样的好处就是,如果在应用界面触发了home键,再次回到应用的时候,应用是重新启动的,而不是显示刚home键退出前的应用界面。这样可以省很多麻烦事,(比如必要的网络监听,比如数据初始化等)
首先是HomeService.java的代码:
package com.android.settings;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class HomeService extends Service {
private MonitoHomeReceiver mHomeBroadcastReceiver;
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return false;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class MyBinder extends Binder{
public HomeService getService(){
return HomeService.this;
}
}
//通过binder实现了 调用者(client)与 service之间的通信
private MyBinder binder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
mHomeBroadcastReceiver = new MonitoHomeReceiver();
/**
* Android对屏幕下方常用按键消息处理是不一致的: 1、搜索按键的消息在onKeyDown或者onKeyUp中接收;
* 2、菜单按键的消息在onCreateOptionsMenu、onKeyDown或onKeyUp方法中接收;
* 3、返回按键的消息可以在onBackPressed、onKeyDown或onKeyUp方法中接收。
* 对于Home按键消息的处理,既不能通过onKeyDown、onKeyUp接收到,android也没有提供专有的方法接收按键消息
* 但办法总是有的,点击Home按键时都会发出一个action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的广播,
* 通过注册它来监听Home按键消息
*/
IntentFilter homeFilter = new IntentFilter(
Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mHomeBroadcastReceiver, homeFilter);
Log.d("yql","HomeService,onCreate");
}
public class MonitoHomeReceiver extends BroadcastReceiver {
final String HOME_DIALOG_REASON = "homereason";
final String HOME_DIALOG_REASON_HOME = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
Log.d("yql","--------onReceive-----------");
int pid = android.os.Process.myPid(); //获取当前应用程序的PID
android.os.Process.killProcess(pid); //结束当前进程
// String reason = intent.getStringExtra(HOME_DIALOG_REASON);
// if (reason != null && reason.equals(HOME_DIALOG_REASON_HOME)) {
// Log.d("yql","------------home key-----------------");
// Toast.makeText(getApplicationContext(), "点击Home键",5000).show();
int pid = android.os.Process.myPid(); //获取当前应用程序的PID
android.os.Process.killProcess(pid); //结束当前进程
// return;
// }
}
}
}
@Override
public void onDestroy() {
Log.d("yql","HomeService,onDestroy");
unregisterReceiver(mHomeBroadcastReceiver);
mHomeBroadcastReceiver = null;
super.onDestroy();
}
}
然后是MyApplication.java(应用的AndroidManifest.xml中定义的名称,有且唯一)代码:
package com.android.settings;
import android.app.Activity;
import android.app.Application;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;
import java.util.LinkedList;
import java.util.List;
public class AppCloseApplication extends Application {
private List<Activity> mList;
private static AppCloseApplication instance;
public AppCloseApplication() {
}
public synchronized static AppCloseApplication getInstance() {
if (null == instance) {
instance = new AppCloseApplication();
}
return instance;
}
public void addActivity(Activity activity) {
mList = new LinkedList<Activity>();
if (activity != null) {
mList.add(activity);
}
}
public void exit() {
if (mList != null) {
try {
for (Activity activity : mList) {
if (activity != null)
activity.finish();
}
mList = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
}
@Override
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("yql", "onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("yql", "onServiceConnected");
}
};
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
// startService(new Intent(getApplicationContext(),HomeService.class));
Intent intent = new Intent(getApplicationContext(), HomeService.class);
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
}
最后,别忘记了再AndroidManifest.xml中加上服务的注册代码:
<service android:name="com.android.settings.HomeService"></service>