开机启动广播接收器过慢

13
以下是我的清单文件。
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mccheekati.test_trail">
    <uses-permission 
    android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

   <receiver 
   android:name="com.example.mccheekati.test_trail.yourActivityRunOnStartup"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" 
           />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

广播接收器如下:

    public class yourActivityRunOnStartup extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        Intent i = new Intent(context, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

没有错误。应用程序在手机重新启动时打开。但是在重新启动后,启动应用程序需要一分钟的时间。有什么方法可以在重新启动后立即启动应用程序吗?

3个回答

13

有没有办法在重启后立即启动应用程序?

没有。

有很多应用程序希望在启动时控制。你的应用程序何时获得机会取决于很多变量,例如安装的应用数量、设备的 CPU 速度、设备上的系统 RAM 数量等。

此外,在引导时从 BroadcastReceiver 启动活动是相当不好的做法。如果您想成为用户在重启后看到的第一件事,可以编写一个主屏幕实现。


非常感谢。我已经尝试了主屏幕模式,它可以工作。但是是否有办法在手机的默认主屏幕和我的自定义主屏幕之间进行导航? - user8000126
@mCheekati:如果你的意思是“我能从我的应用程序启动手机的默认主屏幕吗?”,答案是肯定的。您需要使用PackageManagerqueryIntentActivities()和主屏幕(ACTION_MAINCATEGORY_HOME)的Intent来确定该活动是什么。您的活动将与其他1个或多个活动一起显示在结果列表中。找到正确的活动后,使用特定活动的ComponentName更新您的ACTION_MAIN/CATEGORY_HOME Intent以启动它。 - CommonsWare
请问有人可以帮忙吗? - user8000126
@mCheekati:请提出一个单独的Stack Overflow问题,其中提供一个[mcve],展示您正在尝试什么,并详细解释“关闭应用程序”的含义。例如,如果您的意思是应用程序崩溃,请在该问题中解释哪个应用程序(您自己的?另一个主屏幕?其他东西?),如果可能的话,请显示与崩溃相关联的Java堆栈跟踪。 - CommonsWare
请查看以下链接:http://stackoverflow.com/questions/44030573/unable-to-launch-default-home-screen-from-a-list-of-all-launchers - user8000126
显示剩余2条评论

6

有些系统资源需要先启动,它们的优先级比您的接收器更高。但是您可以尝试在清单中为您的意图设置优先级。方法如下:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="android.intent.action.QUICKBOOT_POWERON" />

请查看开发者文档中有关此事的详细信息: 文档 摘录与优先级相关的内容:
它控制广播接收器执行接收广播消息的顺序。具有更高优先级值的广播接收器将在具有较低值的广播接收器之前被调用。(该顺序仅适用于同步消息;对于异步消息,它会被忽略。)
只有当您确实需要强制规定广播接收的特定顺序或想要强制 Android 更喜欢其中一个活动时,才使用此属性。
该值必须是整数,例如“100”。数字越大,优先级越高。默认值为 0。该值必须大于-1000且小于1000。

3
我尝试更改更新了优先级,但结果没有变化。主屏幕的实现成功了。谢谢提供信息,因为我是一个Android新手,之前并不知道优先级的存在。 - user8000126
不客气,很高兴这些信息能够帮到你,也很高兴你通过主屏幕实现解决了问题。 - Mode-X
3
我发现android:priority="999"需要放在<intent-filter>标签里而不是<action>标签里,这对我有帮助。 - Hristo Stoyanov

0
在我的情况下,在一个Android 11设备上。
<intent-filter>
       <category android:name="android.intent.category.DEFAULT" />
       <action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>

没有<category>标签,启动后,接收器接收android.intent.action.BOOT_COMPLETED需要大约1分钟的时间,而有了<category>标签,只需要4秒钟。

我知道这个问题的例子已经有了这一行,只是想分享我的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接