Android BroadcastReceiver在启动时未触发-以编程方式

Android BroadcastReceiver在启动时未触发-以编程方式,android,broadcastreceiver,boot,Android,Broadcastreceiver,Boot,我正在尝试启动我的应用程序,如果用户希望这样启动。我已选中“取消/注册广播接收器”复选框。若我在清单中声明接收方,我的应用程序总是在启动时启动,这是不必要的行为。我还尝试了getApplicationcontext().registerReceiver,但运气不好。我错过什么了吗 final BroadcastReceiver startMyActivityAtBootReceiver = new BroadcastReceiver() { @Override

我正在尝试启动我的应用程序,如果用户希望这样启动。我已选中“取消/注册广播接收器”复选框。若我在清单中声明接收方,我的应用程序总是在启动时启动,这是不必要的行为。我还尝试了
getApplicationcontext().registerReceiver
,但运气不好。我错过什么了吗

    final BroadcastReceiver startMyActivityAtBootReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            Log.i("LockState", "broadcast receiver called started");
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Intent activityIntent = new Intent(context, MainActivity.class);
                activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(activityIntent);
            }
        }
    };

    if (switch4.isChecked()){
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(startMyActivityAtBootReceiver, new IntentFilter("android.intent.action.BOOT_COMPLETED"));
        Log.i("LockState", "broadcastreceiver registered");
    }
    else {
        LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(startMyActivityAtBootReceiver);
        Log.i("LockState", "broadcastreceiver unregistered");
    }

    switch4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPref.write(Constants.LAUNCH_AT_START, isChecked);
            Log.i("LockState", "launch app at start: " + isChecked);

            if (isChecked) {
                LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(startMyActivityAtBootReceiver, new IntentFilter("android.intent.action.BOOT_COMPLETED"));
                Log.i("LockState", "broadcastreceiver registered");
            } else {
                LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(startMyActivityAtBootReceiver);
                Log.i("LockState", "broadcastreceiver unregistered");
            }
        }
    });

LocalBroadcastManager
将意图广播发送到进程中的本地对象,引导接收器将处理发送全局广播的问题

因此,我们应该在AndroidManifest.xml中注册广播,当您收到对接收器的回调时,您可以检查逻辑,并对其执行操作

例如:

switch4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPref.write(Constants.LAUNCH_AT_START, isChecked);
            Log.i("LockState", "launch app at start: " + isChecked);
        }
    });
并在单独的类中创建广播接收器,并在AndroidManifest.xml中注册

AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application>
<receiver 
    android:name=".MyBootReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
</application>

LocalBroadcastManager
将意图广播发送到进程中的本地对象,引导接收器将处理发送全局广播的问题

因此,我们应该在AndroidManifest.xml中注册广播,当您收到对接收器的回调时,您可以检查逻辑,并对其执行操作

例如:

switch4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPref.write(Constants.LAUNCH_AT_START, isChecked);
            Log.i("LockState", "launch app at start: " + isChecked);
        }
    });
并在单独的类中创建广播接收器,并在AndroidManifest.xml中注册

AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application>
<receiver 
    android:name=".MyBootReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
</application>

它必须在舱单中声明。你走错了路。 您不应该允许用户启用/禁用广播接收器进行引导,而应该在接收器本身中处理该选项。根据复选框中保存的用户首选项值,启动或不启动活动

    @Override
    public void onReceive(Context context, Intent intent) {
        // Handle user preference
        if (!isUserPreferenceEnabled()) return;

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(activityIntent);
        }
    }

它必须在舱单中声明。你走错了路。 您不应该允许用户启用/禁用广播接收器进行引导,而应该在接收器本身中处理该选项。根据复选框中保存的用户首选项值,启动或不启动活动

    @Override
    public void onReceive(Context context, Intent intent) {
        // Handle user preference
        if (!isUserPreferenceEnabled()) return;

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(activityIntent);
        }
    }

谢谢澄清!我很困惑,因为该应用程序在启动后出现在“最近的应用程序”中,但实际上是广播接收器。返回部分成功了。感谢您的澄清!我很困惑,因为该应用程序在启动后出现在“最近的应用程序”中,但实际上是广播接收器。返回部分成功了。