關(guān)于禁用系統(tǒng)app欄(返回鍵,menu鍵,home鍵,下拉狀態(tài)欄)

最近接到一個(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)化看看

從源碼角度去解決。。。。。底層改代碼(未果)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容