最近接到一個需求,公司老總要求指定機型(安卓5.1版本)app進去以后無法退出斥扛,防止用戶玩別的軟件入问。我真的懵逼了。稀颁。芬失。。峻村。麸折。(what f**k!)
這與我當(dāng)時做的一個平板的項目有關(guān),那個平板有系統(tǒng)提供的方法去禁用系統(tǒng)欄粘昨。所以老總看到以后垢啼,認為手機也是一樣的,所以提出這個需求张肾。于是我立馬找到合作廠商技術(shù)反饋有沒有禁用系統(tǒng)欄一項芭析。那邊估計也是懵逼一臉,起初還答復(fù)吞瞪,后面干脆視而不見了馁启。好吧自己弄。
禁用返回按鍵
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
//監(jiān)控/攔截/屏蔽返回鍵
return false;
}
return super.onKeyDown(keyCode, event);
}
這個是眾所周知
禁用menu按鍵
自己創(chuàng)建自己的MyApplication ,然后在其中添加方法如下
/**
* Created by Jiu on 2019/3/1.
*/
public class MyApplication extends Application
{
public int count = 0;
@Override
public void onCreate()
{
super.onCreate ();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStopped(Activity activity) {
Log.v("MyApplication", activity + "onActivityStopped");
count--;
if (count == 0) {
Log.v("MyApplication", "切換到后臺");
activity.startActivity(new Intent (getApplicationContext (),MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
//獲取ActivityManager
ActivityManager activityManager = (ActivityManager) activity.getSystemService(ACTIVITY_SERVICE);
/**獲得當(dāng)前運行的task(任務(wù))*/
List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);
for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
/**找到本應(yīng)用的 task芍秆,并將它切換到前臺*/
if (taskInfo.topActivity.getPackageName().equals(activity.getPackageName())) {
activityManager.moveTaskToFront(taskInfo.id, 0);
break;
}
}
}
}
@Override
public void onActivityStarted(Activity activity) {
Log.v("MyApplication", activity + "onActivityStarted");
if (count == 0) {
Log.v("MyApplication", "切換到前臺");
}
count++;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
Log.v("MyApplication", activity + "onActivitySaveInstanceState");
}
@Override
public void onActivityResumed(Activity activity) {
Log.v("MyApplication", activity + "onActivityResumed");
}
@Override
public void onActivityPaused(Activity activity) {
Log.v("MyApplication", activity + "onActivityPaused");
}
@Override
public void onActivityDestroyed(Activity activity) {
Log.v("MyApplication", activity + "onActivityDestroyed");
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Log.v("MyApplication", activity + "onActivityCreated");
}
});
}
}
順便說一句這個方法還有個好處就是下拉狀態(tài)欄也能一并的處理惯疙。。妖啥。能打開系統(tǒng)的狀態(tài)欄霉颠,但是點進去以后也能返回來
禁用home鍵
這個真的一臉的懵逼了 安卓5.1以后的系統(tǒng)沒有以前那種直接監(jiān)控home鍵的方式了。問了好多個搞這個的也說沒方法實現(xiàn)荆虱。
百度一下蒿偎,真的出來一堆以前的方法。我都試過了沒啥用怀读。糾結(jié)半天了诉位,想一想能不能先實現(xiàn)home鍵點擊監(jiān)控吧!還真有方法Android之最簡單和靠譜的監(jiān)聽Home鍵和菜單鍵(最近任務(wù)欄)
照著他的改改試試
/**
* Created by Jiu on 2019/3/1.
*/
public class HomeReceiver extends BroadcastReceiver
{
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction ();
//按下Home鍵會發(fā)送ACTION_CLOSE_SYSTEM_DIALOGS的廣播
if (action.equals (Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
{
String reason = intent.getStringExtra (SYSTEM_DIALOG_REASON_KEY);
if (reason != null)
{
if (reason.equals (SYSTEM_DIALOG_REASON_HOME_KEY))
{
Log.d ("HomeReceiver", "按了home");
Intent intent1 = new Intent (context, MainActivity.class);
intent1.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, intent1, 0);
try
{
pendingIntent.send ();
} catch (PendingIntent.CanceledException e)
{
e.printStackTrace ();
}
}
}
}
}
}
activity中
HomeReceiver innerReceiver = new HomeReceiver();//注冊廣播
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(innerReceiver, intentFilter);
AndroidManifest.xml中別忘記注冊
<receiver
android:name=".HomeReceiver"
android:enabled="true"
android:exported="true"/>
試一試菜枷。苍糠。。點擊一次還是可以的點一次恢復(fù)一次啤誊。我還沒來得及高興椿息。不小心快速多點了幾次歹袁。坷衍。寝优。有點卡頓,一查才發(fā)現(xiàn)
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
D/HomeReceiver: 按了home
這尼瑪log不停的給我報這個點擊事件枫耳。乏矾。。迁杨。整個人都不好了钻心!
可能是我沒注銷服務(wù),于是立馬去改代碼在onDestroy()中加上
unregisterReceiver(innerReceiver);
尼瑪沒有 多少效果铅协。捷沸。。還是一樣的 單次點擊可能有效果狐史,但是快速點擊痒给。。骏全。會多次重復(fù)接收到服務(wù)苍柏,造成activity卡主。先這樣吧姜贡!再繼續(xù)優(yōu)化看看
從源碼角度去解決试吁。。楼咳。熄捍。。底層改代碼(未果)