0

我需要编写自定义 android 启动器,只有一个我的应用程序并禁用 android 系统状态栏和底栏。这是我的代码

AndroidManifest.xml

    <activity android:name=".MainActivity"
        android:launchMode="singleTask"
        android:stateNotNeeded="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER"/>
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

styles.xml

 <item name="android:windowShowWallpaper">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>

插件MainActivity.class

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        hideSystemUi()
        buttonStartMyApp.setOnClickListener {
            Toast.makeText(this@MainActivity, "Start own app", Toast.LENGTH_SHORT).show()
        }
    }

private fun hideSystemUi() {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    }

这个启动器只有一个按钮(没关系),没有状态栏和底部导航栏。但是我们可以通过在屏幕顶部自上而下的滑动来获得它们。如何禁用此功能?谢谢。

4

2 回答 2

2

您已经实现了IMMERSIVE_STICKY允许通过在屏幕顶部自上而下滑动调用状态栏的标志。要禁用此功能:

super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
setContentView(R.layout.your_layout);

要禁用状态下拉菜单,请使用此方法。这是状态栏上的覆盖,并消耗了所有输入事件。它可以防止状态扩大。

笔记:

customViewGroup是扩展任何布局(框架,相对布局等)并消耗触摸事件的自定义类。使用触摸事件覆盖视图组的 onInterceptTouchEvent 方法并返回 true。

安卓清单

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

customViewGroup 实现

WindowManager manager = ((WindowManager) getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));

WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|

            // this is to enable the notification to recieve touch events
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |

            // Draws over status bar
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    localLayoutParams.height = (int) (50 * getResources()
            .getDisplayMetrics().scaledDensity);
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    customViewGroup view = new customViewGroup(this);

    manager.addView(view, localLayoutParams);
于 2018-04-05T09:38:58.833 回答
1

在后台运行服务并始终关闭状态栏。对于奥利奥及以上,这是我找到的唯一一种解决方案。对于以下版本,我们可以使用上述答案。

package your.package;
import java.lang.reflect.Method;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;

public class ServiceCloseBar extends Service {

    private static Timer timer;
    private static TimerTask task;
    private static int TIME_INTERVAL=100;
    @Override
    public void onCreate() {
        super.onCreate();
        try {
            timer=new Timer();
            task = new TimerTask() {
                public void run() {
                    try {
                        Object sbservice = getSystemService( "statusbar" );
                        Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
                        Method expandMethod;
                        if (Build.VERSION.SDK_INT >= 17) {
                            expandMethod = statusbarManager.getMethod("collapsePanels");
                        } else {
                            expandMethod = statusbarManager.getMethod("collapse");
                        }
                        expandMethod .invoke( sbservice );  
                    } catch (Exception e) {
                    };
                }
            };

            timer.scheduleAtFixedRate(task, 0, TIME_INTERVAL);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
于 2019-05-24T12:30:26.213 回答