如何在用户设置闹钟后强制打开特定的 activity?

How do I force to open a specific activity after a user set the alarm?

我正在尝试制作剂量计划应用程序,当用户设置警报时,该应用程序会显示一个页面来检查用户是否服药。并且用户应该选择暂停或完成滑动(向左滑动 "done",向右滑动 "snooze")。 我希望应用程序按时从后台自动打开。

我已经试过“nativescript-local-notification", but this one, the user must press the notification to open or enter the app and read "nativescript background service”,但它似乎和我试过的一样。

你能告诉我方法或者给我一些例子吗?

我自己解决了。我提出了可能对像我这样的人有帮助的解决方案。

首先你设置了一个闹钟。

alarm.helper.js

import * as AlarmReceiver from '@/services/AlarmReceiver' // Do not remove

export const setAlarm = data => {
  const ad = utils.ad
  const context = ad.getApplicationContext()
  const alarmManager = application.android.context.getSystemService(android.content.Context.ALARM_SERVICE)
  const intent = new android.content.Intent(context, io.nerdrun.AlarmReceiver.class)

  const { id, time, title, name } = data

  // set up alarm
  intent.putExtra('id', id)
  intent.putExtra('title', title)
  intent.putExtra('name', name)
  intent.putExtra('time', time.toString())

  const pendingIntent = android.app.PendingIntent.getBroadcast(context, id, intent, android.app.PendingIntent.FLAG_UPDATE_CURRENT)
  alarmManager.setExact(alarmManager.RTC_WAKEUP, time.getTime(), pendingIntent)
  console.log('registered alarm')
}

在 Android 上扩展 AlarmReceiver。

AlarmReceiver.js

export const AlarmReceiver = android.content.BroadcastReceiver.extend('io.nerdrun.AlarmReceiver', {
  init: function() {
    console.log('init receiver')
  },
  onReceive: function(context, intent) {
    console.log('You got the receiver man!!')
    const activityIntent = new android.content.Intent(context, com.tns.NativeScriptActivity.class)
    const id = intent.getExtras().getInt('id')
    const title = intent.getExtras().getString('title')
    const name = intent.getExtras().getString('name')
    const time = intent.getExtras().getString('time')      

    activityIntent.putExtra('id', id)
    activityIntent.putExtra('title', title)
    activityIntent.putExtra('name', name)
    activityIntent.putExtra('time', time)
    activityIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(activityIntent)
  }
})

将接收器注册到您的清单。

AndroidManifest.xml

<receiver android:name="io.nerdrun.AlarmReceiver" />

当然,你可以在android上扩展Activity到你的项目中,但我没有实现它。

接收器工作后,它将导航到 Main Activity,您可以在下面的 app.js 中控制您想要的任何内容:

app.js

application.on(application.resumeEvent, args => {
  if(args.android) {
    console.log('resume succeed!!!')
    const android = args.android
    const intent = android.getIntent()
    const extras = intent.getExtras()
    if(extras) {
      const id = extras.getInt('id')
      const title = extras.getString('title')
      const name = extras.getString('name')
      const time = extras.getString('time')
      Vue.prototype.$store = store
      Vue.prototype.$navigateTo(routes.home, { clearHistory: true, props: props })
      }
    }
  }
})