在 Android 中启动完成后自动启动应用程序

Posted

技术标签:

【中文标题】在 Android 中启动完成后自动启动应用程序【英文标题】:Auto start application after boot completed in Android 【发布时间】:2012-02-15 13:49:23 【问题描述】:

我想制作一个在其设置中具有自动启动选项的应用程序。我在我的应用程序中进行了设置活动,该活动派生自 PreferenceActivity 并为自动启动选项提供 CheckBoxPreference。如果启用了自动启动选项,我的应用程序应该在手机启动完成时启动。如果自动启动选项被禁用,那么它不应该在启动完成时启动。

为了实现这一点,我实现了 BroadcastReceiver 的派生类,它接收 BOOT_COMPLETED 意图,在 AndroidManifest.xml 中声明接收器,并在 AndroidManifest.xml 中授予权限。

在应用程序中还有一个应用程序的派生类,并且也从应用程序派生类的 onCreate 方法启动服务。如果我在 androidManifest.xml 中声明接收器,那么在启动完成后我的应用程序的 onCreate 调用然后调用 BroadcastReceiver 的 onReceive 方法。

现在的问题是我的应用程序在每次启动完成时启动,无论是启用还是禁用自动启动。禁用自动启动时是否可以不启动应用程序?

【问题讨论】:

Trying to start a service on boot on Android的可能重复 【参考方案1】:

您可以使用共享首选项来存储 isAutoStartEnabled 的布尔值,并在 BroadcastReciver 中检查此值,仅当它为真时才触发意图。

在您的情况下,问题不在于您是否收到广播,而在于谁收到了广播。祝你好运。。

希望对你有帮助..

【讨论】:

但在启动完成后,首先调用我的应用程序派生类的 onCreate,然后调用广播接收器的 onReceive。这意味着我的应用程序已创建或启动。但是如果禁用自动启动,我不想启动应用程序。 你能发布你的清单文件的内容吗?我认为问题可能出在那儿...... 请确保在您的清单文件中,BOOT_COMPLETE 的意图过滤器不是带有您的 Activity 标签而是带有您的 Receiver 标签。 是的。它在接收器标签中。应用程序每次都完美地接收到启动完成的意图,因此清单文件没有问题。我不想每次都收到。 您是否检查了在 BOOT_COMPLETE 上启动的活动是否已注册以接收 BOOT_COMPLETE 广播?【参考方案2】:

我认为从 Android 3.1 开始 接收 BOOT_COMPLETED 意图的 BroadcastReceiver 将无法正常工作。用户必须通过与之交互来唤醒应用程序。

因此,在启动设备后,所有第三方应用程序都停止运行。

对于当前您的应用程序,您可以使用SharedPreferences 自动启动您的应用程序..

更新:仅适用于低于 3.1 的 Android 版本,更高版本才有效,但您必须在设备上完成启动后与您的应用程序进行用户交互

您需要使用 BroadcastReceiverandroid.intent.action.BOOT_COMPLETED 意图。

在清单文件中添加以下内容:

<receiver android:name="App_Receiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

实现 BoradcastReciever 的 App_Receiver 类。实现onReceive() 方法并从您的应用开始您最喜欢的活动。

public void onReceive(Context context, Intent intent) 
    // make sure you receive "BOOT_COMPLETED"
// Here isAutoStartEnabled check sharedPreferences for Auto Start flag
if ( isAutoStartEnabled ) 

    if ((intent.getAction() != null) && (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")))
    
        // Start the service or activity 
    

【讨论】:

目前我已经阅读了使用 SharedPreference 的自动启动标志。但是当自动启动被禁用时如何不启动应用程序?能详细回答吗? 我已经写过它已经在应用程序中实现了。它工作得很好,但我不想每次都收到意图,因为它每次都启动应用程序。是否有可能每次都没有收到启动完成的意图? 不,如果您注册了任何广播接收器,那么当对该广播的设备进行任何操作时,您就拥有了它,注册后您无法控制..请根据您的条件使用..跨度> 使用文件进行保存设置。并在您的自动启动接收器中检查它们。 @user370305 “更新”有点误导,因为它没有提到它是否也可以在 Android 3.0+ 或仅在 Android 2.x 上运行。我建议您在答案中澄清它,否则用户可能会认为更新解决了您在答案的第一句话中提到的问题。干杯。【参考方案3】:

您必须在您的清单中添加使用权限android.permission.RECEIVE_BOOT_COMPLETED

【讨论】:

【参考方案4】:
final SharedPreferences sharedPreferences = getSharedPreferences("Application", MODE_PRIVATE);
        boolean isAutoStartEnabled = sharedPreferences.getBoolean("isAutoStartEnabled", false);

        if ( isAutoStartEnabled ) 
            startActivity(new Intent());
         

希望对你有帮助

【讨论】:

在应用程序中也有服务,它在创建应用程序时在后台启动,应用程序中不仅有活动。 从设置中取消选中复选框时,在 SharedPreference 中将“isAutoStartEnabled”值设置为 false,否则将其设置为 true。并在 Boot Complete 中检查 SharedPreference 中的“isAutoStartEnabled”值。【参考方案5】:

以下代码适用于我:

public class BootCompleteReceiver extends BroadcastReceiver 
    public static final String PREFS_NAME = "MyPrefsFile";  

    @Override
    public void onReceive(Context context, Intent intent) 
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) 
            Log.d("boot completed", "boot completed caught");
            Boolean autoRestart = false;
            SharedPreferences sp = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
            autoRestart = sp.getBoolean("autoRestart", false);

            if (autoRestart)

                Log.d("boot completed", "auto restart true");

                Intent i = new Intent(context, WelcomeScreen.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);

            
        
    


【讨论】:

以上是关于在 Android 中启动完成后自动启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android App 开机自启动

插入壁式充电器时自动启动[关闭]

android service 开机启动后被啥情况下会被自动关闭掉?

Android主要活动销毁(完成)自动

Android Worklight应用程序中的启动画面后,黑屏会长时间出现

覆盖或禁用设置菜单