You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI Blazor Android:精确闹钟触发后打开AlarmPage的实现问题

解决方案:MAUI Blazor Hybrid Android闹钟触发后的应用启动与页面导航

问题1:启动未处于运行状态的应用

从BroadcastReceiver启动应用时,必须指定正确的Intent Flags,同时处理Android 12+的后台启动限制,确保能唤醒屏幕并显示应用。修改你的OnReceive方法中启动应用的逻辑:

public override void OnReceive(Context context, Intent intent)
{
    var getAlarmIdResult = intent.GetIntExtra(ALARM_ID_KEY, 0);
    if (getAlarmIdResult < 1) return;

    if (MainActivity.Instance == null)
    {
        // 获取应用启动Intent
        var launchIntent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
        // 设置Flags确保后台启动、唤醒屏幕、解锁显示
        launchIntent?.SetFlags(ActivityFlags.NewTask | ActivityFlags.ShowWhenLocked | ActivityFlags.TurnScreenOn);
        // 传递闹钟ID,让启动后知道要打开AlarmPage
        launchIntent?.PutExtra(ALARM_ID_KEY, getAlarmIdResult);
        context.StartActivity(launchIntent);
    }
    else
    {
        // 应用已运行,直接唤醒窗口
        MainActivity.Instance.Window.AddFlags(WindowManagerFlags.ShowWhenLocked | WindowManagerFlags.TurnScreenOn);
    }
}

同时需要在AndroidManifest.xml中添加必要权限和配置:

<!-- 添加权限 -->
<uses-permission android:name="android.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<!-- 配置MainActivity -->
<activity android:name=".MainActivity"
          android:showWhenLocked="true"
          android:turnScreenOn="true">

问题2:导航到AlarmPage页面

MAUI Blazor Hybrid使用NavigationManager处理Razor组件导航,无法直接用Xamarin.Forms的PushAsync方法。推荐通过启动参数传递+Activity触发导航的方式实现:

步骤1:在MainActivity中处理导航逻辑

在MainActivity中保存NavigationManager实例,并在启动/收到新Intent时检查闹钟参数,触发导航:

public static NavigationManager? NavigationManager { get; private set; }
private const string ALARM_ID_KEY = "ALARM_ID";

protected override void OnCreate(Bundle? savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // 从依赖注入获取NavigationManager
    NavigationManager = Services.GetRequiredService<NavigationManager>();
    // 处理冷启动时的闹钟参数
    HandleAlarmIntent(Intent);
}

protected override void OnNewIntent(Intent? intent)
{
    base.OnNewIntent(intent);
    // 处理热启动时的闹钟参数
    HandleAlarmIntent(intent);
}

private void HandleAlarmIntent(Intent? intent)
{
    if (intent?.HasExtra(ALARM_ID_KEY) == true)
    {
        var alarmId = intent.GetIntExtra(ALARM_ID_KEY, 0);
        NavigationManager?.NavigateTo($"/AlarmPage?alarmId={alarmId}");
    }
}

步骤2:配置AlarmPage接收参数

在AlarmPage.razor中添加路由和参数接收:

@page "/AlarmPage"
@page "/AlarmPage/{AlarmId:int}"

<h2>闹钟触发!</h2>
<p>闹钟ID:@AlarmId</p>

@code {
    [Parameter]
    public int AlarmId { get; set; }
}

备选方案:使用消息传递触发导航

如果应用已在运行,也可以通过WeakReferenceMessenger发送导航消息,让Blazor组件响应:

  1. 创建消息类:
public class NavigateToAlarmMessage
{
    public int AlarmId { get; set; }
}
  1. 在Blazor组件(如MainLayout.razor)中订阅消息:
@inject WeakReferenceMessenger Messenger
@inject NavigationManager NavManager
@implements IDisposable

@code {
    protected override void OnInitialized()
    {
        Messenger.Register<NavigateToAlarmMessage>(this, (_, msg) =>
        {
            NavManager.NavigateTo($"/AlarmPage?alarmId={msg.AlarmId}");
        });
    }

    public void Dispose()
    {
        Messenger.UnregisterAll(this);
    }
}
  1. 在BroadcastReceiver中发送消息(应用已运行时):
else
{
    MainActivity.Instance.Window.AddFlags(WindowManagerFlags.ShowWhenLocked | WindowManagerFlags.TurnScreenOn);
    var messenger = MainActivity.Instance.Services.GetRequiredService<WeakReferenceMessenger>();
    messenger.Send(new NavigateToAlarmMessage { AlarmId = getAlarmIdResult });
}

内容的提问来源于stack exchange,提问作者Ron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:44