首页 > 解决方案 > 如何在不打开应用程序的情况下运行警报

问题描述

根据这个问题需要后台服务。

即使用户退出应用程序,如何保持服务在后台运行?

我试图这样做,但我无法确定我应该在服务内的哪里调用警报管理器。

我的服务.java

这是我尝试过的服务类。

public class MyService extends Service{

    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Query the database and show alarm if it applies

        // I don't want this service to stay in memory, so I stop it
        // immediately after doing what I wanted it to do.
        pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 280192, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 11);
        calendar.set(Calendar.MINUTE, 55);
        calendar.set(Calendar.SECOND,00);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);
//        stopSelf();

        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
//        // I want to restart this service again in one minute
//        AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
//        alarm.set(
//                alarm.RTC_WAKEUP,
//                System.currentTimeMillis() + (1000 * 60 * 1),
//                PendingIntent.getService(this, 0, new Intent(this, MyService.class), 0)
//        );
    }
}

请指导我在特定时间段内提醒用户,即使应用程序未运行。谢谢你

标签: androidalarmmanagerandroid-alarms

解决方案


您不需要为此用例创建自己的服务,您可以为此使用 Android 框架中的 Alarmservice,它可以启动应用程序(即使应用程序未运行)并设置时间,前提是手机处于 ON 状态。现在设置闹钟,可以在任何视图(活动/片段)中调用。您可以创建一个按钮并设置操作以根据需要设置警报。在调用警报时,您使用挂起的广播接收器进行任何后续操作。要求如下设置警报,您可以使用 Pending Broadcast intent 来做您的事情。相信我,即使您的应用程序没有运行,它也能正常工作。注意 - AlarmBroadCastReceiver 应该是一个清单接收器,即在清单文件中声明。

private void setAlarm(int type) {


    // AlarmManager
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    // Alarm type
    int alarmType = AlarmManager.RTC;

    Calendar time = Calendar.getInstance();

    time.setTimeInMillis(System.currentTimeMillis());


    switch (type) {

    case 1:
        // Set Alarm for next 20 seconds
        time.add(Calendar.SECOND, 20);
        break;

    case 2:
        // Set Alarm for next 2 min
        time.add(Calendar.MINUTE, 2);
        break;

    case 3:
      // Set Alarm for next 30 mins
        time.add(Calendar.MINUTE, 30);
        break;

    }


    Intent broadcastIntent = new Intent(this, AlarmBroadCastReceiver.class);

    broadcastIntent.putExtras(sourceIntent);

    Random generator = new Random();

    PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(this,
            generator.nextInt(), broadcastIntent,
            PendingIntent.FLAG_ONE_SHOT);
    alarmManager.set(alarmType, time.getTimeInMillis(), pendingAlarmIntent);

}

推荐阅读