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

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

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

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

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

【问题讨论】:

标签: android-intent broadcastreceiver autostart 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);
    
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多