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

12

我希望制作一个应用程序,在其设置中具有自动启动选项。 我已经在我的应用程序中创建了设置活动,该活动源自PreferenceActivity,并提供CheckBoxPreference以进行自动启动选项。 如果启用自动启动选项,则完成手机引导时应启动我的应用程序。 如果禁用自动启动选项,则不应在引导完成时启动。

为此,我实现了派生自BroadcastReceiver的类,该类接收BOOT_COMPLETED意图,在AndroidManifest.xml中声明接收器,并在AndroidManifest.xml中也授予权限。

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

现在的问题是,无论是否启用自动启动选项,我的应用程序都会在引导完成时启动。是否可能在禁用自动启动时不启动应用程序?


5个回答

10
您可以使用共享偏好(SharedPreference)来存储布尔值 isAutoStartEnabled,并在BroadcastReceiver中检查该值,仅当它为true时才触发一个意图(Intent)。
在您的情况下,问题不是是否接收广播,而是谁接收广播。祝你好运。。
希望对您有所帮助。

但是在启动完成后,首先调用我的应用程序派生类的onCreate,然后才调用broadcastreceiver的onReceive。这意味着我的应用程序已经被创建或启动了。但是如果自动启动被禁用,我不想启动应用程序。 - Khushbu Shah
你能发布一下你清单文件的内容吗?我觉得问题可能出在那里。 - R.daneel.olivaw
是的,它在接收器标签中。应用程序每次完美地接收到启动完成意图,因此清单文件中没有问题。我不想每次都接收它。 - Khushbu Shah
你检查过在 BOOT_COMPLETE 上启动的活动是否已注册接收 BOOT_COMPLETE 广播了吗? - R.daneel.olivaw
在你的情况下,问题不在于你是否接收到广播,而是谁接收到了广播。祝你好运。 - R.daneel.olivaw
显示剩余3条评论

6

您需要在Manifest文件中添加android.permission.RECEIVE_BOOT_COMPLETED权限声明。


6
我认为从Android 3.1开始,接收BOOT_COMPLETED意图的BroadcastReceiver将不起作用。用户必须与应用程序交互才能唤醒它。
因此,在启动设备后,所有第三方应用程序都处于停止状态。
对于当前的应用程序,您可以使用SharedPreferences自动启动您的应用程序。
更新:(仅适用于Android 3.1以下版本,对于更高版本,您需要在设备启动完成后与您的应用程序进行用户交互)
您需要使用一个具有android.intent.action.BOOT_COMPLETED意图的BroadcastReceiver。
将以下内容添加到您的清单文件中:
<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>

App_Receiver类实现BoradcastReciever。 实现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读取了自动启动的标志。但是当禁用自动启动时,如何不启动应用程序?你能详细回答吗? - Khushbu Shah
我已经写了代码并在应用程序中实现了。它完美地运行,但我不想每次都接收到意图,因为这会每次启动应用程序。有没有可能不每次都接收到启动完成的意图? - Khushbu Shah
1
不,如果您注册任何广播接收器,则在设备上执行该广播的任何操作时,您都会得到它。注册后您无法控制它,只能根据您的条件使用。 - user370305
使用文件保存设置。并在您的自动启动接收器中检查它们。 - XXX
@user370305,“更新”这个词有点误导,因为它没有提到是否也适用于Android 3.0+或仅适用于Android 2.x。我建议您在答案中澄清这一点,否则用户可能会认为更新解决了您在答案的第一句话中提到的问题。干杯。 - Mathias Conradt

1
以下代码适用于我:

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);

            }
        }
    }

}

1
final SharedPreferences sharedPreferences = getSharedPreferences("Application", MODE_PRIVATE);
        boolean isAutoStartEnabled = sharedPreferences.getBoolean("isAutoStartEnabled", false);

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

希望这能对你有所帮助


应用程序中还有一个服务,当应用程序创建时启动后台服务,应用程序中不仅仅是活动。 - Khushbu Shah
在设置中取消复选框时,将“isAutoStartEnabled”值设置为false;否则将其设置为true。在完全启动时,请从SharedPreference检查“isAutoStartEnabled”的值。 - Nishant Shah

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