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