You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中点击日历事件提醒通知跳转自有APP的可行性及实现方案问询

点击日历提醒通知打开自有APP的实现方案

当然可行!不过得稍微绕个弯子——系统日历的提醒通知默认是跳转到日历APP本身的,但我们可以通过几个靠谱的步骤来实现自定义跳转,甚至还能做一些个性化处理。

一、核心思路

系统日历允许我们在创建事件时绑定自定义的跳转规则,本质上是给日历事件关联一个你的APP能识别的专属链接(Scheme),然后让APP注册对应的“监听规则”,这样当用户点击提醒里的链接时,系统就会唤起你的APP。

二、具体实现步骤

1. 给你的APP注册专属跳转规则

打开AndroidManifest.xml,给你想要唤起的Activity添加如下配置。简单来说,就是告诉系统:“只要是app://mycalendarreminder这种格式的链接,都来找我!”

<activity
    android:name=".YourTargetActivity"
    android:exported="true"> <!-- Android 12+必须显式设置这个属性,不然会报错 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 这里的scheme和host可以自己定义,比如换成你的APP包名相关的字符串 -->
        <data
            android:scheme="app"
            android:host="mycalendarreminder" />
    </intent-filter>
</activity>

2. 创建日历事件时绑定专属链接

当你通过ContentResolver往系统日历里插入事件的时候,把事件的URL字段设置成刚才定义的专属链接,还可以带上参数(比如事件ID),方便后续处理:

val eventValues = ContentValues().apply {
    put(Events.TITLE, "我的自定义日程")
    put(Events.DESCRIPTION, "点击提醒打开我的APP")
    put(Events.DTSTART, startTimestamp) // 替换成你的事件开始时间戳
    put(Events.DTEND, endTimestamp) // 替换成事件结束时间戳
    put(Events.EVENT_TIMEZONE, TimeZone.getDefault().id)
    put(Events.HAS_ALARM, 1) // 开启提醒
    // 设置提前1小时提醒(如果之前没设置的话)
    val reminderValues = ContentValues().apply {
        put(Reminders.EVENT_ID, eventUri?.lastPathSegment?.toLong())
        put(Reminders.MINUTES, 60)
        put(Reminders.METHOD, Reminders.METHOD_ALERT)
    }
    contentResolver.insert(Reminders.CONTENT_URI, reminderValues)
    // 关键:绑定专属跳转链接
    put(Events.URL, "app://mycalendarreminder?eventId=12345")
}
// 插入事件到系统日历
val eventUri = contentResolver.insert(Events.CONTENT_URI, eventValues)

划重点:不同厂商的系统日历对URL字段的展示逻辑不一样——有些会在提醒通知的详情页显示这个链接,用户点击就能跳转;有些甚至会直接把通知的点击事件关联到这个链接。所以一定要多测几款主流机型(小米、华为、OPPO这些)。

3. 接收跳转参数(可选)

当你的APP被唤起时,可以拿到链接里的参数,比如事件ID,这样就能直接跳转到对应的页面:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    intent?.data?.let { deepLinkUri ->
        val eventId = deepLinkUri.getQueryParameter("eventId")
        // 比如根据eventId打开对应的详情页
        eventId?.let { navigateToEventDetail(it) }
    }
}

三、如果直接跳转受限的替代方案

要是遇到某些厂商的系统日历限制了自定义跳转(比如不让修改通知的点击行为),可以试试这两个替代方案:

  • 方案一:自己发自定义通知
    放弃依赖系统日历的提醒,改用AlarmManager或者WorkManager设置定时任务,到时间后直接发送你自己的通知——这种通知的点击逻辑完全由你掌控,想跳哪里就跳哪里,体验也更统一。

  • 方案二:监听日历提醒广播
    注册一个动态广播接收器(Android 8.0+静态广播受限,得用动态注册),监听系统日历的提醒广播。当收到提醒时,立刻发送你的自定义通知,用户点击这个通知就能打开APP。不过这个方法需要处理不同厂商的广播差异,适配起来稍微麻烦点。

小建议:测试的时候一定要注意权限问题,比如插入日历事件需要WRITE_CALENDAR权限,Android 6.0+还要动态申请哦。

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

火山引擎 最新活动