1

AlarmManager と Broadcast Receiver を使用して、毎日午前 8 時 20 分に通知を生成するアプリを作成しています。

私が直面している問題の 1 つは、午前 8 時 20 分以降にアプリを開くたびに通知が生成されることです。

onCreate()これは、メソッドでレシーバーを呼び出したためだと思います。
受信者が一度だけ登録されていることを確認する方法はありますか?

これが私のコードです:

public class MainActivity extends AppCompatActivity
{

    AlarmManager alarmManager;
    private PendingIntent alarmIntent;

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


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

        Intent intent = new Intent(this, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 00);
        calendar.set(Calendar.MINUTE,30);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
 }

public class AlarmReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context,"Alarm Raised",Toast.LENGTH_SHORT).show();
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intent1 = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intent1,0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setSmallIcon(R.drawable.ic_account_circle_black_18dp);
        builder.setContentTitle("Tracker");
        builder.setContentText("Turn on Gps");
        builder.setPriority(Notification.PRIORITY_MAX);
        builder.setDefaults(Notification.DEFAULT_SOUND);
        builder.setLights(0x0000FF,3000,2000);
        builder.setContentIntent(pendingIntent);
        notificationManager.notify(56, builder.build());
    }
}
4

1 に答える 1

0

の 2 番目のパラメータはsetInexactRepeating、AlarmManager がいつタスクを開始するかを示します。したがって、過去に時間を与えると、すぐに1回起動します。calendar.getTimeInMillis() が今より前かどうかを確認し、そうである場合は 1 日追加する必要があります。

したがって、コードのこの部分を変更するだけです

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);

これに:

long timeToStart = calendar.getTimeInMillis();
if(System.currentTimeMillis() < timeToStart){
    timeToStart += 24 * 60 * 60 * 1000; // one day
}
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, timeToStart, AlarmManager.INTERVAL_DAY, alarmIntent);
于 2015-12-11T23:19:52.900 に答える