Android一键Home彻底关闭应用app。

13 篇文章 0 订阅
11 篇文章 0 订阅

网上关于一键关闭应用的方式方法很多,最常见的是三种:

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>




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值