Android点击MENU弹出的退出按钮退出系统方法及拦截MENU弹出菜单方法

项目中自己定义了登录页面,又为MENU按钮增加了弹出菜单,弹出菜单中包括【主页】【切换账号】【退出】三个选项菜单,这样一来,在登录页面点击MENU菜单按钮时,也会弹出底部菜单,这样很不美观;现在目的是在登录页面点击MENU不显示底部菜单,登录成功之后点击MENU显示底部菜单。于是通过各种方式寻求帮助,之前了解通过拦截可以屏蔽弹出菜单,在QQ群中中也询问了很多人,通过网络业找了很多资料,问题没有解决;无意中看到一个帖子,眼中一亮,问题迎刃而解,分享一下,免得大家走了弯路。

拦截MENU键点击事件

    @Override  
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if(keyCode==KeyEvent.KEYCODE_MENU){
               return true;
              }
              return super.onKeyDown(keyCode, event);
     }      
    // 拦截/屏蔽系统Home键
    @Override
    public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    super.onAttachedToWindow();
    }

问题是解决了,但是在点击退出按钮时,不能弹出提示对话框,或者是弹出提示对话框后,不能完全退出系统,只能结束当前Activity,又纠结了,寻求帮组呗,网上一大堆方法都没能解决问题,很多群里边告知用finish,没能解决问题后来认真分析,最后通过以下方法问题解决,终于大功告成。

退出系统

1.常见的退出方法是

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        activityManager.restartPackage("包名");

2.项目中使用的方法

  必须把后台数据清空了:

步骤1:
/**
     * activityList:所有activity对象,用于退出时全部finish; Activity走onCreate时,添加到该集合
     */
    public static List<Activity> activityList = new ArrayList<Activity>();

步骤2:
/**
     * 页面初始化
     *
     * @param savedInstanceState
     */
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

       activityList.add(this);

步骤3:
/**
     * 退出客户端。
     *
     * @param context 上下文
     */
    public static void exitClient(Context context)
    {
        Log.d(TAG, "----- exitClient -----");
        // 关闭所有Activity
        for (int i = 0; i < activityList.size(); i++)
        {
            if (null != activityList.get(i))
            {
                activityList.get(i).finish();
            }
        }
        ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        activityManager.restartPackage("包路径");
        System.exit(0);
    }


这里要加System.exit(0);

还要记得加权限

<uses-permission android:name="android.permission.RESTART_PACKAGES" />

参照上述方法,在项目中使用如下代码,最终实现了相关功能,拿出来分享给大家。

@Override
public boolean onOptionsItemSelected(MenuItem item){
	switch(item.getItemId()){
	case 1:
		Intent intent1 = new Intent();
		intent1.setClass(MainActivity.this, MenuActivity.class);
		MainActivity.this.startActivity(intent1);
		return true;		
	case 2:
		Intent intent2 = new Intent();
		intent2.setClass(MainActivity.this, LoginActivity.class);
		MainActivity.this.startActivity(intent2);
		return true;
	case 3:
		  new AlertDialog.Builder(MainActivity.this).setTitle("温馨提示")
			 .setMessage("确定退出?")
			 .setPositiveButton("确定", new DialogInterface.OnClickListener(){				 
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub						
					//finish();
				    // 关闭所有Activity
				    for (int i = 0; i < activityList.size(); i++)
				    {
				        if (null != activityList.get(i))
				        {
				            activityList.get(i).finish();
				        }
				    }
				    ActivityManager activityManager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
				    activityManager.restartPackage(getPackageName());
				    System.exit(0);
					 
				} 
			 }
			 ).setNegativeButton("取消", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub					
				}
			}).show();	

		return true;	
	}
	return false;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值