项目中自己定义了登录页面,又为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;
}