在 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 版本,更高版本才有效,但您必须在设备上完成启动后与您的应用程序进行用户交互)
您需要使用 BroadcastReceiver
和 android.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 service 开机启动后被啥情况下会被自动关闭掉?