关于设置全屏后与屏蔽Home键的冲突问题,盛传的几种做法,未解决!
2013-10-18 00:29
501 查看
1、实现全屏下屏蔽Home键,代码如下
以上代码在点击Power键使屏幕进入睡眠状态,然后再次唤醒后,会是状态栏重新出现,全屏效果被破坏。
问题解决:
解决一、
通过分析,造成全屏被破坏的原因是以下代码,
通过日志可以看到初始化时type为2,,再将Type设置为TYPE_KEYGUARD后,全屏效果就失效了,设想在onPause回调中把type设置成初始状态,然后唤醒时在onResume中重新setType();
然后在onResume中重新设置
以上操作实现的是在唤醒后,全屏依然存在,但是Home键没有被屏蔽掉,好像全屏和Home键之间是互相排斥的,可以破坏对方。
解决二、
测试使用onWindowFocusChanged()来取代onResume()和onPause()
结果依然无效。两者还是冲突。
解决三、
使用新的方式来屏蔽Home键。
1).首先添加权限
2).在Activity类中声明函数和成员
3).在onCreate中调用
以上的实现方法还是没有解决根本问题,唤醒后依然出现冲突。
解决四、
1).自定义Application
2).在 Mainfest中把Application设成自定义的Application
3).在每一个Activity中都做如下操作
(1)、在OnCreat()中getApplication
(2)、重写OnResume(),增加当前Activity的状态为true激活状态
(3)、重写OnStop(),更改当前Activity的状态为false非激活状态并判断所有的Activity是否都处于非激活状态
解决五、
1).监听日志来屏蔽home
2).添加权限
解决六、
1).还有使用broadcastreceiver来监听Home按钮的
未实现。。。。。。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.path_main_layout); }
public void onAttachedToWindow() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }
public boolean onKeyDown(int keyCode, KeyEvent event) { LogUtils.log("MainActivity", "onKeyDown: " + keyCode); switch (keyCode) { case KeyEvent.KEYCODE_HOME: { LogUtils.log("MainActivity", "HOME"); return true; } case KeyEvent.KEYCODE_BACK: LogUtils.log("MainActivity", "BACK"); return true; case KeyEvent.KEYCODE_CALL: return true; case KeyEvent.KEYCODE_SYM: return true; case KeyEvent.KEYCODE_STAR: return true; case KeyEvent.KEYCODE_POWER: LogUtils.log("MainActivity", "POWER"); return true; } return super.onKeyDown(keyCode, event); }
以上代码在点击Power键使屏幕进入睡眠状态,然后再次唤醒后,会是状态栏重新出现,全屏效果被破坏。
问题解决:
解决一、
通过分析,造成全屏被破坏的原因是以下代码,
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
通过日志可以看到初始化时type为2,,再将Type设置为TYPE_KEYGUARD后,全屏效果就失效了,设想在onPause回调中把type设置成初始状态,然后唤醒时在onResume中重新setType();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);
然后在onResume中重新设置
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
以上操作实现的是在唤醒后,全屏依然存在,但是Home键没有被屏蔽掉,好像全屏和Home键之间是互相排斥的,可以破坏对方。
解决二、
测试使用onWindowFocusChanged()来取代onResume()和onPause()
public void onWindowFocusChanged(boolean hasFocus) { LogUtils.log("MainActivity", "onWindowFocusChanged(): " +hasFocus); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); if(hasFocus) { lp.type = WindowManager.LayoutParams.TYPE_KEYGUARD ; lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN; } this.getWindow().setAttributes(lp); LogUtils.log("MainActivity", "onWindowFocusChanged().type: " +getWindow().getAttributes().type); LogUtils.log("MainActivity", "onWindowFocusChanged().flags: " +getWindow().getAttributes().flags); }
结果依然无效。两者还是冲突。
解决三、
使用新的方式来屏蔽Home键。
1).首先添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
2).在Activity类中声明函数和成员
Runnable mDisableHomeKeyRunnable = new Runnable() { @Override public void run() { disableHomeKey(); } }; Handler mHandler = new Handler(); public void disableHomeKey() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); }
3).在onCreate中调用
mHandler.postDelayed(mDisableHomeKeyRunnable,200);
以上的实现方法还是没有解决根本问题,唤醒后依然出现冲突。
解决四、
1).自定义Application
package com.houny.testhomekey.application; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import android.app.Activity; import android.app.Application; public class ManageApplication extends Application { private HashMap<String, Boolean> mapActivity = new HashMap<String, Boolean>();// 用于存储activity对应的激活状态 private static ManageApplication application = null; @Override public void onCreate() { super.onCreate(); application = this; } /** * 把Activity和状态放到List中管理 * * @param activity * @param isActivitied */ public void addActivityStatus(Activity activity, boolean isAlive) { if (mapActivity.containsKey(activity.getClass().getName())) { mapActivity.remove(activity.getClass().getName()); mapActivity.put(activity.getClass().getName(), isAlive); } else { mapActivity.put(activity.getClass().getName(), isAlive); } } /** * 判断是否有Activity是活动状态 * * @return */ public boolean isAllActivityAlive() { boolean res = false; Iterator iter = mapActivity.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); boolean value = (Boolean) entry.getValue(); if (value) { return true; } } return res; } public static ManageApplication getInstance() { return application; } }
2).在 Mainfest中把Application设成自定义的Application
<application android:name="com.houny.testhomekey.application.ManageApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
3).在每一个Activity中都做如下操作
(1)、在OnCreat()中getApplication
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); application = (ManageApplication) this.getApplication(); setContentView(R.layout.activity_main); Log.e("Status", "OnCreate"); findViewsById(); setViewsListener(); }
(2)、重写OnResume(),增加当前Activity的状态为true激活状态
@Override protected void onResume() { Log.e("Status", "onResume"); application.addActivityStatus(MainActivity.this, true); super.onResume(); }
(3)、重写OnStop(),更改当前Activity的状态为false非激活状态并判断所有的Activity是否都处于非激活状态
@Override protected void onStop() { Log.e("Status", "onStop"); application.addActivityStatus(MainActivity.this, false); boolean alived = application.isAllActivityAlive(); Log.e("All Activity Status", alived + ""); if(!alived){ //TODO 想要进行的操作 } super.onStop(); }
解决五、
1).监听日志来屏蔽home
protected void onResume() { super.onResume(); isTesting=true; new CatchLogThread().start(); } class CatchLogThread extends Thread { @Override public void run() { Process mLogcatProc = null; BufferedReader reader = null; String line; while (isTesting) { try { // 获取logcat日志信息 mLogcatProc = Runtime.getRuntime().exec(new String[] { "logcat", "ActivityManager:I *:S" }); reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()),2*1024); while ((line = reader.readLine()) != null) { if (line.indexOf("android.intent.category.HOME") > 0) { isTesting = false; System.out.println("DDDDDDDDDDDDDDDDDDDDDDDDD"); handler.sendMessage(handler.obtainMessage()); Runtime.getRuntime().exec("logcat -c");//删除日志 break; } } } catch (Exception e) { e.printStackTrace(); } } } }; Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { startActivity(new Intent(MainActivity.this,MainActivity.class)); Toast.makeText(MainActivity.this, "I Have Home is pressed!!!!!",Toast.LENGTH_LONG).show(); System.out.println("Home is Pressed+++++++++++++++++"); }; };
2).添加权限
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
解决六、
1).还有使用broadcastreceiver来监听Home按钮的
public class HomeButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.CATEGORY_HOME)) { Log.i("HomeButtonReceiver", "onReceive"); //操作 } } }
未实现。。。。。。
相关文章推荐
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- 关于火狐游览器设置全屏状态不显示工具栏以及其他游览器全屏问题
- Android程序开发中关于设置全屏无效问题
- 关于AppCompatActivity设置全屏的问题
- 关于设置红杏公益代理和下载.aar或.pom文件冲突的问题
- Android程序开发中关于设置全屏无效问题
- 关于屏蔽HOME键和全屏
- 关于VS2008 中添加成员变量提示 此网站的某个加载项运行失败 请检查“Internet选项”中的安全设置是否存在潜在冲突 问题解决办法
- 关于VS2008 中添加成员变量提示 此网站的某个加载项运行失败 请检查“Internet选项”中的安全设置是否存在潜在冲突 问题解决办法
- 关于meta标签的几种设置
- 关于Eclipse中代码显示显色的设置问题
- 关于WinDbg 设置断点的问题
- 关于Vmware workstation虚拟机的网络设置问题
- 关于JEE中的javax.mail 和javamail冲突问题
- VGScene 学习日志一:关于TvgScene设置为透明后,里面的按钮不能点击的问题记录
- Android关于全屏设置和隐藏状态栏、沉浸式状态栏的总结
- 关于select函数中timeval和fd_set重新设置的问题
- 关于设置IIS目录的属性问题
- iOS开发-关于UI界面未能铺满全屏的问题
- 关于Java Label里设置图片的若干问题