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
相关产品推荐
相关产品推荐

