最近接到一個(gè)需求,公司老總要求指定機(jī)型(安卓5.1版本)app進(jìn)去以后無(wú)法退出,防止用戶玩別的軟件。我真的懵逼了。。。。。。(what f**k!)
這與我當(dāng)時(shí)做的一個(gè)平板的項(xiàng)目有關(guān),那個(gè)平板有系統(tǒng)提供的方法去禁用系統(tǒng)欄。所以老總看到以后,認(rèn)為手機(jī)也是一樣的,所以提出這個(gè)需求。于是我立馬找到合作廠商技術(shù)反饋有沒(méi)有禁用系統(tǒng)欄一項(xiàng)。那邊估計(jì)也是懵逼一臉,起初還答復(fù),后面干脆視而不見(jiàn)了。好吧自己弄。
禁用返回按鍵
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
//監(jiān)控/攔截/屏蔽返回鍵
return false;
}
return super.onKeyDown(keyCode, event);
}
這個(gè)是眾所周知
禁用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", "切換到后臺(tái)");
activity.startActivity(new Intent (getApplicationContext (),MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
//獲取ActivityManager
ActivityManager activityManager = (ActivityManager) activity.getSystemService(ACTIVITY_SERVICE);
/**獲得當(dāng)前運(yùn)行的task(任務(wù))*/
List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);
for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
/**找到本應(yīng)用的 task,并將它切換到前臺(tái)*/
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", "切換到前臺(tái)");
}
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");
}
});
}
}
順便說(shuō)一句這個(gè)方法還有個(gè)好處就是下拉狀態(tài)欄也能一并的處理。。。能打開(kāi)系統(tǒng)的狀態(tài)欄,但是點(diǎn)進(jìn)去以后也能返回來(lái)
禁用home鍵
這個(gè)真的一臉的懵逼了 安卓5.1以后的系統(tǒng)沒(méi)有以前那種直接監(jiān)控home鍵的方式了。問(wèn)了好多個(gè)搞這個(gè)的也說(shuō)沒(méi)方法實(shí)現(xiàn)。
百度一下,真的出來(lái)一堆以前的方法。我都試過(guò)了沒(méi)啥用。糾結(jié)半天了,想一想能不能先實(shí)現(xiàn)home鍵點(diǎn)擊監(jiān)控吧!還真有方法Android之最簡(jiǎn)單和靠譜的監(jiān)聽(tīng)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鍵會(huì)發(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();//注冊(cè)廣播
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(innerReceiver, intentFilter);
AndroidManifest.xml中別忘記注冊(cè)
<receiver
android:name=".HomeReceiver"
android:enabled="true"
android:exported="true"/>
試一試。。。點(diǎn)擊一次還是可以的點(diǎn)一次恢復(fù)一次。我還沒(méi)來(lái)得及高興。不小心快速多點(diǎn)了幾次。。。有點(diǎn)卡頓,一查才發(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不停的給我報(bào)這個(gè)點(diǎn)擊事件。。。。整個(gè)人都不好了!
可能是我沒(méi)注銷(xiāo)服務(wù),于是立馬去改代碼在onDestroy()中加上
unregisterReceiver(innerReceiver);
尼瑪沒(méi)有 多少效果。。。還是一樣的 單次點(diǎn)擊可能有效果,但是快速點(diǎn)擊。。。會(huì)多次重復(fù)接收到服務(wù),造成activity卡主。先這樣吧!再繼續(xù)優(yōu)化看看
從源碼角度去解決。。。。。底層改代碼(未果)