You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android TV开机自动启动应用失败问题求助

Android TV 开机自动启动应用失败排查与解决

我尝试实现Android TV开机后自动运行应用,但参考多个教程后仍未生效,以下是我的代码及问题排查方向:

现有代码

MainActivity.java

public class MainActivity extends FragmentActivity {
    public WebView mWebview;
    private android.content.Context Context;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        String url = "http://www.test.com";

        if (!DetectConnection.checkInternetConnection(this)) {
            Toast.makeText(getApplicationContext(), "No Internet Connection!", Toast.LENGTH_LONG).show();
            finish(); // 无网络时关闭应用
        } else {
            WebView webView = (WebView) findViewById(R.id.main_fragment);
            webView.getSettings().setJavaScriptEnabled(true);
            CookieManager.getInstance().setAcceptCookie(true);
            webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            WebSettings webSettings = webView.getSettings();
            webSettings.setDomStorageEnabled(true);
            webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
            webSettings.setUseWideViewPort(true);
            webView.setWebViewClient(new WebViewClient());
            webView.loadUrl(url);
        }
    }
}

StartAppOnBoot.java

public class StartAppOnBoot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() == null) {
            return;
        }

        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
            boolean startupAfterBoot = prefs.getBoolean("serenity_boot_startup", false);
            if (startupAfterBoot) {
                Intent i = new Intent(context, MainActivity.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
            }
        }
    }
}

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.test.tv2"
    tools:ignore="MissingLeanbackLauncher">

    <uses-feature
        android:name="android.software.leanback"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />

    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@drawable/ic_banner"
        android:label="TV2"
        android:supportsRtl="true"
        tools:ignore="GoogleAppIndexingWarning"
        android:banner="@mipmap/tv_banner_foreground">
        <activity android:name="com.test.tv2.MainActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.Leanback"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.test.tv2.StartAppOnBoot"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>

问题排查与修复建议

1. SharedPreferences 默认值限制

广播接收器中读取的serenity_boot_startup默认值为false,如果未主动设置为true,开机时不会触发应用启动。建议:

  • 测试阶段先注释掉SharedPreferences判断逻辑,直接启动应用,验证广播是否能正常触发
  • 在应用首次启动时,主动将该配置设为true,或者提供开关让用户开启

2. 广播接收器配置优化

  • 移除intent-filter中的android.intent.category.DEFAULT,该类别对ACTION_BOOT_COMPLETED广播无意义,可能干扰接收
  • 同时监听QUICKBOOT_POWERON广播,覆盖快速开机场景

修改后的接收器配置:

<receiver android:name="com.test.tv2.StartAppOnBoot"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

3. Intent 标记设置优化

使用addFlags()替代setFlags(),避免覆盖默认标记:

Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

4. 应用激活要求

Android系统规定,应用必须被用户手动启动过至少一次,才能接收开机广播。如果刚安装完应用未打开过,重启电视不会触发接收器。

5. 网络判断导致应用闪退

电视开机后网络连接存在延迟,DetectConnection.checkInternetConnection(this)可能返回false,导致应用直接调用finish()关闭。建议:

  • 移除开机时的网络判断逻辑,或者改为延迟检测(比如用Handler延迟30秒再检查)
  • 保留网络提示但不关闭应用,让用户等待网络恢复

6. 日志排查

如果以上修改后仍未生效,用adb命令查看广播接收日志:

adb logcat | grep StartAppOnBoot

确认onReceive方法是否被调用,以及是否有报错信息。

内容的提问来源于stack exchange,提问作者Observer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:24:49