当前位置: 首页 > 知识库问答 >
问题:

Android:在预定时间之前触发警报

艾自强
2023-03-14

我试图在应用程序启动10分钟后生成警报。根据我的要求,无论用户关闭应用程序、关闭并再次打开,或者甚至在重新启动后,此警报都应该工作。下面是我的代码。

主要活动。Java语言

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.context=this;

        startService(new Intent(getBaseContext(), MyService.class));

    }

    public void startService(View view) {
      //  startService(new Intent(getBaseContext(), MyService.class));
    }

    // Method to stop the service
    public void stopService(View view) {
      //  stopService(new Intent(getBaseContext(), MyService.class));
    }

}

我的服务。java—这是服务类。

import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.os.SystemClock;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Created by Nirodha Mihiran on 6/8/2016.
 */
public class MyService extends Service {

    public static boolean doneCreted = false;

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


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Let it continue running until it is stopped.

        Toast.makeText(this, "Service Started Second", Toast.LENGTH_LONG).show();

        Calendar calendar = new GregorianCalendar();
        calendar.setTimeInMillis(System.currentTimeMillis() + 10 * 60 * 1000);

        intent = new Intent(MyService.this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MyService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) MyService.this.getSystemService(MyService.this.ALARM_SERVICE);
        // am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 5, pendingIntent);
        // am.setWindow(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 1000 * 60 * 5 , pendingIntent);
        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    }

}

警报eciever.java

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Created by thisararanawaka on 6/2/16.
 */
public class AlarmReceiver extends BroadcastReceiver {
    private int MID = 0;

    public static boolean isCreated;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        long when = System.currentTimeMillis();

        Calendar calendar = new GregorianCalendar();
        calendar.setTimeInMillis(System.currentTimeMillis()+5*60*1000);

        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Alaram Fired")
                .setContentText("Events To be Performed").setSound(alarmSound)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)

                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
        notificationManager.notify(MID, mNotifyBuilder.build());
        MID++;

        Toast.makeText(context, "Notification Created .", Toast.LENGTH_LONG).show();
    }
}

如果我没有关掉手机或重新启动手机,我就可以准时收到闹钟。我准时收到闹钟。

然而,如果我关闭并打开手机,或者如果我重新启动手机,我会在手机打开/重新启动后立即收到警报和通知-可能在一分钟后。在这种情况下,即使闹钟预定在明天,也没关系,我会在手机开机/重启后立即收到。

我做错了什么?

共有1个答案

危宜
2023-03-14

通过查看您的代码,这可能是一个原因

在onStartCommand()中,您将时间设置为日历。setTimeInMillis(System.currentTimeMillis()10*60*1000)

它将日历时间设置为10分钟,然后您在下面的行中设置相同的时间am.set(AlrmManager.RTC_WAKEUP,calendar.getTimeInMillis(),PendingIntent);

试试这个,

<代码>长myAlarmTime=系统。currentTimeMillis()10*60*1000 am。设置(AlarmManager.RTC\u WAKEUP,myAlarmTime,PendingContent)

重新启动时面临此问题的原因

系统可以运行服务有两个原因。如果有人调用Context.startService(),那么系统将检索该服务(创建它并在需要时调用它的onCreate()方法),然后使用客户端提供的参数调用它的onStartCommand(Intent, int, int)方法。此时服务将继续运行,直到调用Context.stopService()或stoSelf()。https://developer.android.com/reference/android/app/Service.html

 类似资料:
  • 我试图在指定时间触发通知和警报。我已经将日志信息放在控制台上,以查看是否设置了正确的时间,并且一切正常。但是,仍然没有触发警报。请帮忙。 创建通知和警报的/Code/ /通知消息类/ 请帮帮我,我做错了什么?

  • 我管理一切都很好,创建了一个通知服务,用于作为警报的结果触发通知。不幸的是,使用AlarmManager设置警报不能正常工作。它会在几分钟后触发(而不是几小时,这将表示时区问题)。循环周期为1周,所以我使用了常数INTERVAL_DAY,并将其乘以7。为了确保一个PendingIntent不会替换另一个,我将dayOfWeek作为第二个参数传递给PendingIntent.getService()

  • 我有一个名为的类,它扩展了接口和。但是,当我使用该类并且不调用其方法时,不会触发资源泄漏的警告。我有另一个名为的类,它有一个名为的方法,该方法返回一个对象。当我以以下方式创建新的对象时,不会触发任何资源泄漏警告: 为什么这里没有触发资源泄漏的警告,因为从未关闭?这里的答案是,触发它所需要的只是实现接口,但我的类同时实现了和,但在未关闭时不会触发任何警告。

  • 我已经设置了Spring的,每小时有一个cron表达式,如下所示,其中为. 这里我的目的是从当前日期和时间中获取小时值,并将其传递给executor方法。 基本上,我取当前小时减去1,所以在17:00,小时值应该是16。 但是如果你看到日志,小时值是15。这是因为调度程序运行16:59:59,831左右。请参阅下面的log4j日志。看起来cron作业正在舍入毫秒,并在17:00:00,000前几毫

  • 我正在测试的手机是Android8.0,但这并不重要,因为我的目标是Android5.1。 所以我处理的代码设定了第二天的闹钟,06:00。 AlarmReciever仅启动服务: